如何执行我自己的身份验证(检查用户输入的用户名和密码)

Posted

技术标签:

【中文标题】如何执行我自己的身份验证(检查用户输入的用户名和密码)【英文标题】:How to perform my own authentication (checking username and password typed by the user) 【发布时间】:2014-12-23 18:59:03 【问题描述】:

我实现了UserDetailsService 接口并覆盖了loadUserByUsername 方法。

我认为,在loadUserByUsername 中,我可以获取用户名和密码,以检查它们是否与数据库上的用户名和密码匹配。但是我不明白如何获取用户输入的密码,只要它是可能的。

可能是我实现了错误的接口。

UserDetailsService 是否足以做我想做的事,或者我必须实现或扩展其他东西?

【问题讨论】:

【参考方案1】:

UserDetailsS​​ervice.loadUserByUsername() 只是为了加载(检索)数据库中的用户详细信息 - 它不是为了进行密码比较。

比较发生在 UsernamePasswordAuthenticationFilter.attemptAuthentication() 中。然后它调用 getAuthenticationManager().authenticate() 进行比较。

看到这个:What is the default AuthenticationManager in Spring-Security? How does it authenticate?

至于 替换 UsernamePasswordAuthenticationFilter,问问自己你的用例是什么?你想做什么默认实现没有?也许你不必更换它......无论如何,你可以在Spring's docs看到如何做到这一点

HTH

【讨论】:

在扩展 UsernamePasswordAuthenticationFilter 后找不到配置我的 security.xml 文件的示例 您的用例是什么?你想做什么?也许您不必更换它...无论如何,您可以在 Spring 的文档中看到如何做到这一点 docs.spring.io/spring-security/site/docs/3.0.x/reference/… 我想检查用户输入的用户名和密码是否与数据库中的用户名和密码匹配。我必须创建自己的“控制器”,因为我还需要检查其他数据库字段。 在这种情况下,我认为您可以保留原来的 UsernamePasswordAuthenticationFilter,但要添加您自己的 AuthenticationProvider。看到这个类:org.springframework.security.authentication.ProviderManager.java 我的回答有帮助吗?【参考方案2】:

UserDetailsService 只是从数据库中检索用户详细信息,而不是进行密码比较。

如果您想自己进行密码比较 - 您可以实现自己的 PasswordEncoder(更具体地说是 isPasswordValid(pass1,pass2,salt) 方法,但您可以扩展几个方法 - 例如 Md5PasswordEncoder

要连接您的自定义PassordEncoder,您需要类似以下内容:

<authentication-manager id="authenticationManager">
    <authentication-provider user-service-ref="myUserDetailsService">
        <password-encoder ref="myPasswordEncoder"/>
    </authentication-provider>
</authentication-manager>

【讨论】:

密码编码是身份验证的一个子案例。有些情况下不需要编码...

以上是关于如何执行我自己的身份验证(检查用户输入的用户名和密码)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用我自己的机制自定义 spring-security 身份验证过程

JSP 页面应如何检查身份验证

如何使用 Angular + Spring + JSON 自定义登录/身份验证

使用 CouchDB Android 进行用户身份验证

使用用户名的 Laravel 身份验证不区分大小写

Grails Spring Security 在身份验证之前预检查普通密码