【发布时间】:2017-12-06 13:13:30
【问题描述】:
我正在this repo 中操作一个开源项目。文件bank.sql是mysql中数据库的schema。这里是pom.xml:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/juli -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>juli</artifactId>
<version>6.0.26</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
我有一个如下的登录表单:
<form name="loginForm" class="form-login"
action="<c:url value="/j_spring_security_check" />" method="POST">
<h2>Please sign in</h2>
<c:if test="${not empty error}">
<div class="alert alert-danger">${error}</div>
</c:if>
<c:if test="${not empty msg}">
<div class="alert alert-info">${msg}</div>
</c:if>
<input type="text" class="form-control" placeholder="Username" name="username">
<input type="password" class="form-control" placeholder="Password" name="password" />
<button type="submit" class="btn btn-lg btn-primary btn-block" name="submit">Login</button>
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>
文件Spring-Security.xml如下:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/user**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />
<intercept-url pattern="/change**" access="hasRole('ROLE_NEWUSER')" />
<access-denied-handler error-page="/403" />
<form-login
login-page="/login"
authentication-success-handler-ref="bankCustomAuthenticationSuccessHandler"
authentication-failure-url="/login?error"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf/>
</http>
<beans:bean id="bankCustomAuthenticationSuccessHandler"
class="ee.mikkelsaar.bank.security.MyUrlAuthenticationSuccessHandler" />
<authentication-manager>
<authentication-provider>
<password-encoder hash="sha" />
<jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select u.username, a.authority from users u, authorities a where u.username = a.username and u.username =?" />
</authentication-provider>
</authentication-manager>
<beans:import resource="spring-datasource.xml" />
<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder">
<beans:constructor-arg value="sha" />
</beans:bean>
</beans:beans>
并且有一个bean来获取数据源来为Authentication-manager提供它,如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/bank" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
</beans>
我确信 MySQL 服务器在 3306 端口上运行良好。
正确的凭据是username:Tom 和password:Tom,但每次我尝试使用它们登录时都会失败。我想知道,我的身份验证过程有什么问题?
我该如何解决?
我猜,也许数据源 bean 没有正确创建,但我不知道如何检查它?
更新:
当我将<http security="none" pattern="/login"/> 添加到我的Spring-Security.xml 时,它会抱怨
HTTP Status 405 - Request method 'POST' not supported for (username, password) `(Tom, tom)`, which is not a valid credential. But for a valid credential like `(Tom,Tom)` is still navigates to the login page again.
但它发生了
【问题讨论】:
-
首先,“失败”是什么意思?您是否收到一些错误(如果是,请发布堆栈跟踪)?或者您只是再次被重定向到相同的登录页面?第二:我没有在您的配置中看到您的登录页面的安全禁用。尝试将以下
<http security="none" pattern="/login"/>添加到您的Spring-Security.xml,就在您现有的<http>元素上方。 -
另外,尝试为
org.springframework.security包启用调试日志记录 -
@RomanPuchkovskiy 失败,我的意思是它再次导航到登录页面。我已经用你的回答更新了我的问题
-
您可以克隆存储库并调查问题吗?这是一个小应用程序。
-
在 IDE 中尝试数据库连接怎么样?只是为了确保它正常工作..
标签: java jsp spring-security