【问题标题】:Spring Security lgoin always redirecting to authentication failure URLSpring Security lgoin 总是重定向到身份验证失败 URL
【发布时间】:2016-10-01 18:51:38
【问题描述】:

我对编程比较陌生,所以请在这里帮帮我。

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

  • user1 - password1
  • 管理员-密码1

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

这是我的安全配置 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>

我现在没有身份验证/授权,因为登录不起作用。身份验证失败的一些可能原因是什么?数据库连接可以发挥作用吗?请帮帮我。

提前谢谢你!

【问题讨论】:

标签: java jsp spring-security


【解决方案1】:

我建议添加另一个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>

【讨论】:

  • 你好尤里!感谢你的回复!我已经尝试过您的建议,但遗憾的是它导致了错误。无论如何要调试以确定它是否与登录凭据或用户权限有关?
  • 我正在使用 Eclipse 顺便说一句
  • 我看到“不支持的配置属性:[hasRole('ROLE_OPERATOR'), isAnonymous(), isAuthenticated(), hasRole('ROLE_USER')]”
  • 您是否设置了http 标签use-expressions="true"?在上面的代码sn-p中。
  • 这个错误被抛出了。“org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: 属性'use-expressions'不允许出现在元素'http'中。”
【解决方案2】:

尝试通过创建一个类似 .. 的 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>

【讨论】:

  • 嗨,Karthik!谢谢您的回复。我已经尝试过了,但它不起作用。不过,我可能把它放在了错误的地方。我想把它放在这个 bean 标签之间? "springframework.org/schem ..."
  • 是的。你说的对。在 内部和安全配置标记 之后。换句话说,删除您的 .. 并添加给定的代码而不是那个。
  • 我已经尝试过了,但我遇到了这个错误...“org.xml.sax.SAXParseException: cvc-complex-type.2.1: Element 'authentication-manager' must have no character or element信息项 [children],因为该类型的内容类型为空。”
  • 我的 开始标签现在是
  • 看看Spring Forum。这可能会有所帮助。
【解决方案3】:

意识到 applicationContext-security xml 文件中的 users-by-username-query 缺少启用的列,基本上 spring security 期望语句中有 3 列,而我缺少启用的列。

所以正确的sql语句应该是: "select USERNAME, PASSWORD, STATUS from USER where lower(USERNAME) = lower(?)”

状态列是布尔类型。 (1=启用,0=禁用)

希望它会帮助那里的人:)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2012-11-21
    • 2015-12-18
    • 2015-07-28
    • 1970-01-01
    • 2011-07-24
    • 2012-01-07
    • 2022-08-16
    相关资源
    最近更新 更多