这是一个观察,也是我的疑问。关于以下两个方面:
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中使用上述两种方法对用户名和密码进行身份验证?
暂无答案!
目前还没有任何答案,快来回答吧!