我对编程很陌生,所以请在这里帮助我。
我已配置Spring Security
以从数据库中获取用户详细信息,当我尝试使用以下帐户登录时:
身份验证失败,因为它始终将我重定向到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>
我现在没有身份验证/权限,因为登录无效。认证失败的可能原因有哪些?数据库连接可以发挥作用吗?请帮帮我。
提前谢谢!
答案 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 =禁用)
希望它会帮助那些人:)
感谢所有人的帮助!