Spring Security lgoin始终重定向到身份验证失败URL

时间:2016-06-02 07:11:51

标签: java jsp spring-security

我对编程很陌生,所以请在这里帮助我。

我已配置Spring Security以从数据库中获取用户详细信息,当我尝试使用以下帐户登录时:

  • user1 - password1
  • admin - password1

身份验证失败,因为它始终将我重定向到home.jsp/OPS=999这是我的登录页面。用户记录存在于数据库中,但我似乎无法登录。

这是我的security config xml文件。

 <http auto-config="true">
     <form-login login-page='/home.jsp?OPS=9999' default-target-url='/secure/user.jsp' always-use-default-target='true' />
     <logout logout-success-url="/home.jsp" logout-url="/j_spring_security_logout" />
 </http>

<authentication-provider>
    <jdbc-user-service data-source-ref="Application.DataSource2" users-by-username-query="select USERNAME, PASSWORD from USER where lower(USERNAME) = lower(?)"/>
</authentication-provider>

我现在没有身份验证/权限,因为登录无效。认证失败的可能原因有哪些?数据库连接可以发挥作用吗?请帮帮我。

提前谢谢!

3 个答案:

答案 0 :(得分:0)

我建议添加另一个intercept-url。它应该如下所示:

<http auto-config="true" 
      use-expressions="true"
      disable-url-rewriting="true">

    <intercept-url pattern="/home.jsp**" access="isAnonymous()"/>
    <intercept-url pattern="/secure/extreme/**" access="hasRole('ROLE_OPERATOR')" />
    <intercept-url pattern="/secure/**" access="hasRole('ROLE_USER')" />
    <intercept-url pattern="/**" access="isAuthenticated()" />

    <form-login login-page='/home.jsp?OPS=9999' default-target-url='/secure/user.jsp' always-use-default-target='true' />
    <logout logout-success-url="/home.jsp" logout-url="/j_spring_security_logout" />
</http>

答案 1 :(得分:0)

尝试通过创建类似..

的bean,将身份验证提供程序设置为身份验证管理器
<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService" />
</authentication-manager>

<beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="usersByUsernameQuery" value="select USERNAME, PASSWORD, 1 from USER where lower(USERNAME) = lower(?)"/>
    <property name="authoritiesByUsernameQuery" value="SELECT USERNAME, ROLE as authorities FROM USER u, USER_ROLE ur, ROLE r WHERE u.ID = ur.USER_ID AND ur.ROLE_ID = r.ID AND lower(USERNAME) = lower(?)" />
    <property name="dataSource" ref="Application.DataSource2" />
</beans:bean>

答案 2 :(得分:0)

意识到applicationContext-security xml文件中的user-by-username-query缺少一个启用的列,基本上spring安全性需要语句中的3列,而我错过了启用列。

所以正确的sql语句应该是: &#34;从USER中选择USERNAME,PASSWORD,STATUS,其中lower(USERNAME)= lower(?)&#34;

status列的类型为boolean。 (1 =启用,0 =禁用)

希望它会帮助那些人:)

感谢所有人的帮助!