使用内置jdbc或自定义用户服务

luaexgnf  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(167)

这是一个观察,也是我的疑问。关于以下两个方面:
spring security:自定义登录表单-使用内置jdbc用户服务:在这里,我们可以在spring容器中实现内置用户详细信息服务,使用spring-security.xml配置中的“jdbc用户服务”标记,如下所示:
table:
用户:[userid(pk),用户名,密码,已启用]
权限:[authid(pk)、userid(fk)、authority]

<authentication-manager alias="authenticationManager">
     <authentication-provider>
         <jdbc-user-service data-source-ref="dataSource"
        users-by-username-query="
          SELECT USERNAME, PASSWORD, CASE ENABLED WHEN 1 THEN 'true' ELSE 'false' END 'ENABLED' 
          FROM USERS WHERE USERNAME=?;"

        authorities-by-username-query="
         SELECT u.USERNAME, a.ROLENAME 
         FROM USERS u, AUTHORITIES a
         WHERE u.USERID = a.USERID AND u.USERNAME=?;"/>
     </authentication-provider>
 </authentication-manager>

在上面,我们可以看到,用户在登录表单上输入的密码永远不会与数据库中存储的密码匹配。
内置的jdbcuserdetailsmanager间接实现userdetailsservice接口(它只包含一个方法loaduserbyusername(string username))。它只接受一个值作为参数,因此没有范围将用户名和密码都传递给这个方法?
spring安全:自定义登录表单-使用自定义userdetailsservice:- even 如果我们不使用内置的jdbcuserdetailsmanager对用户进行身份验证,而是通过自己实现userdetailsservice接口来定义自己的userdetailsservice类:

<authentication-manager alias="authenticationManager">
     <authentication-provider>
         <jdbc-user-service user-service-ref="MyCustomUserDetailsServiceImpl"/>
      </authentication-provider>
 </authentication-manager>

尽管如此,我们将无法将用户提供的密码与作为loaduserbyusername(string username)方法存储在数据库中的密码进行匹配(我们将在自定义userdetails服务实现中重写该方法),该方法仅将一个值(即字符串值)作为参数,因此没有范围将用户名和密码都传递给此方法数据库身份验证?
因此,如果不需要的用户知道正确的用户名,他/她将能够进入受保护的页面,即他/她不需要知道正确的密码,因为密码没有与数据库记录进行身份验证(匹配)?
也许我遗漏了什么。如何在springsecurity中使用上述两种方法对用户名和密码进行身份验证?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题