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

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

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

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

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

【问题讨论】:

    标签: spring spring-mvc spring-security


    【解决方案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>
    

    【讨论】:

    • 密码编码是身份验证的一个子案例。有些情况下不需要编码...
    猜你喜欢
    • 2014-01-06
    • 2010-10-10
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多