Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 如何在自定义UserDetailsService中检索登录表单密码_Spring Mvc_Spring Security - Fatal编程技术网

Spring mvc 如何在自定义UserDetailsService中检索登录表单密码

Spring mvc 如何在自定义UserDetailsService中检索登录表单密码,spring-mvc,spring-security,Spring Mvc,Spring Security,我有一个自定义用户类,它扩展了User(Spring Security)类和Custome UserDetails服务类。此服务使用Hibernate服务方法查询数据库以获取用户详细信息。如果在数据库中找不到该userId的记录,我希望创建一个虚拟自定义用户对象,并使用只读属性通过身份验证,而不是抛出UsernamNotFoundException。但我无法让它工作,因为我不知道如何检索用户在登录页面上输入的密码值。我需要将其传递给自定义用户构造函数,以便对其进行正确的身份验证 总之,在load

我有一个自定义用户类,它扩展了User(Spring Security)类和Custome UserDetails服务类。此服务使用Hibernate服务方法查询数据库以获取用户详细信息。如果在数据库中找不到该userId的记录,我希望创建一个虚拟自定义用户对象,并使用只读属性通过身份验证,而不是抛出UsernamNotFoundException。但我无法让它工作,因为我不知道如何检索用户在登录页面上输入的密码值。我需要将其传递给自定义用户构造函数,以便对其进行正确的身份验证


总之,在loadUserByUserName()方法中是否有检索用户在登录页面上输入的密码的方法?提前感谢

我正在做与当前项目类似的事情。在过去的两周里,我刚刚开始接触SpringSecurity,但在这段时间里我真的深入研究了它(附加的源代码,在调试器中进行了检查)

我有一个扩展org.springframework.security.core.userdetails.User的自定义用户类和一个实现org.springframework.security.core.userdetails.userdetails服务接口的自定义类

如您所知,UserDetailsService接口中loadUserByUsername方法的签名指定将返回实现UserDetails接口的类

Spring Security将采用实现UserDetails的类,并根据UserDetails中的用户名和密码检查登录表单/basic authentication/digest authentication/(您选择的任何身份验证方案)提供的用户名和密码


我还没有找到一种方法,您可以通过身份验证方案获取最终用户提供的凭据。如果你愿意的话,我可以在明天上班的时候(我在家,用记忆写下这篇文章。

我正在运行Spring 3.0.6版本和Spring Security 3.0.6版本

我在调试器中运行了代码。您将无法从自定义UserDetailsService获取身份验证对象

但是,我相信您可以创建自己的AuthenticationProvider来获取:

请参考Spring Security的org.springframework.Security.authentication.ProviderManager中的此代码段,该代码段在AuthenticationProvider上循环:

如您所见,它在每个AuthenticationProvider上循环并传入凭据。希望这有帮助


Philip

通过扩展AbstractUserDetailsAuthenticationProvider,我们可以做一些与您要求的类似的事情。有一个方法retrieveUser(String _userName,UsernamePasswordAuthenticationToken _authToken)您可以重写并放入自己的自定义逻辑。返回对象是UserDetails。因此,此时您可以创建自己的自定义UserDetails并将其返回到框架(注意:您也可以在此方法中设置只读属性)

此时,Spring Security将不会尝试使用密码进行身份验证。他们将这留给其他身份验证检查(UserDetails\u UserDetails,UsernamePasswordAuthenticationToken\u authToken)也可以重写的方法。由于这是进行密码验证的地方,因此可以跳过验证并让该方法返回。此时将验证匿名用户

最后将其添加到security.xml中

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="appUserSecurityService" />
</authentication-manager>


我希望这会有所帮助!

我知道这不是您要问的,但如何使用角色呢?在用户表中添加其他字段,例如角色,并将您的虚拟用户作为其他普通用户添加到数据库中,但设置角色角色角色虚拟用户。在web app中,您可以检查登录用户的角色,并根据这些角色决定他可以做什么和不能做什么他所扮演的角色。感谢回复marioosh..这正是我最初的想法,但该应用程序允许每个用户进行一次会话。因此,不能在所有虚拟用户使用的用户表中有一条记录..感谢Philip提供的帮助。我希望你能找到一些关于如何检索它的信息..我正在做与你一样的事情,扩展美国er类有Customuser类,我遇到了新问题..如果主体由某个第三方应用程序预验证,我似乎无法实例化自定义用户,因为没有密码..:(
<authentication-manager alias="authenticationManager">
    <authentication-provider ref="appUserSecurityService" />
</authentication-manager>