Spring Security jdbc-user-service未进行身份验证 - 凭据错误

时间:2014-09-20 02:34:28

标签: java spring security spring-jdbc

Spring Security让我适应,我无法解决身份验证错误。这是我的配置:

<beans:bean id='bCryptPasswordEncoder' class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'/>
  <authentication-manager>
    <authentication-provider>
      <password-encoder ref="bCryptPasswordEncoder" />
      <jdbc-user-service
          data-source-ref="dataSource"
          users-by-username-query="select emplid as USERNAME ,password as PASSWORD,'true' AS ENABLED from app_user where emplid=?"
          authorities-by-username-query="select u.emplid, p.name from app_user u inner join app_user_app_permissions auap ON auap.app_users = u.id inner join app_permission p on p.id = auap.app_permissions where u.emplid =?" />
    </authentication-provider>
  </authentication-manager>

我使用以下方法创建编码密码:

String password = "p4ssword";
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(password);

我已经验证了数据库中存在正确的用户/密码,并且获取它们的查询会运行。

任何想法为什么这不起作用,它让我疯了

2 个答案:

答案 0 :(得分:0)

如果user-by-username-query工作正常,那么首先要检查的是第二个查询。分配给用户的一个返回角色/权限。要使登录尝试成功,用户必须至少有一个由authority-by-username-query返回的角色。

要测试它,您可以使用如下查询:&#34;选择u.emplid,&#39; USER&#39;来自app_user u WHERE u.emplid =?&#34;。

如果它仍然无法正常工作,那么您最好的选择是将日志记录级别设置为DEBUG并查看Spring正在逐步完成的工作。

答案 1 :(得分:0)

您在secoand查询中遇到问题,这意味着按用户权限查询应该仅是用户名和角色,而不是电子邮件,姓名等。

`<bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service data-source-ref="ds"
        users-by-username-query="select user_name,user_password,enabled,user_email from user where user_name=?"
        authorities-by-username-query="select user_name,user_role from user_role where user_name=?"
        />
        <s
        <security:password-encoder hash="bcrypt" ref="bcryptEncoder"/>
    </security:authentication-provider>
</security:authentication-manager>`