【问题标题】:Spring Security 3.x: Creating a custom authentication provider without a UserDetailsServiceSpring Security 3.x:创建没有 UserDetailsS​​ervice 的自定义身份验证提供程序
【发布时间】:2011-06-20 06:25:58
【问题描述】:

我通过扩展 AbstractUserDetailsAuthenticationProvider 创建了一个自定义身份验证提供程序,它根据数据库对用户进行身份验证并执行额外的授权检查。

我面临的烦恼是身份验证提供商要求我连接UserDetailsService。至少对于这个项目,我不需要UserDetailsService,因为如果我有身份验证提供程序来提取用户信息来执行身份验证/授权,我认为不需要UserDetailsService 来拉同一个用户构造UserDetails对象的信息。

所以,现在,我必须将一个虚拟的 UserDetailsService 连接到我的身份验证提供程序中,但它完全没有任何作用。

是否可以创建没有UserDetailsService 的身份验证提供程序?

【问题讨论】:

    标签: java spring-security


    【解决方案1】:

    查看 AbstractUserDetailsAuthenticationProvider 的代码(至少对于 3.0.5 版),它不需要连接 UserDetailsS​​ervice。仔细检查您的 XML 配置以确保未使用 DAOAuthenticationProvider。

    你应该有这样的块

    <authentication-manager>
        <authentication-provider ref="yourAuthenticationProvider" />
    </authentication-manager>
    

    另外,记录你得到的异常,看看它是从哪里抛出的。

    【讨论】:

    • 当您进行自定义身份验证提供程序时,我相信至少必须注册一个 UserDetailsS​​ervice。我试图让它在没有的情况下工作,但我想不出办法。 Factory method [org.springframework.security.core.userdetails.UserDetailsService org.springframework.security.config.http.UserDetailsServiceFactoryBean.cachingUserDetailsService(java.lang.String)] threw exception; nested exception is org.springframework.context.ApplicationContextException: No UserDetailsService registered.
    • 什么类抛出嵌套异常?
    【解决方案2】:

    Spring 使用的默认身份验证提供程序将是 DaoAuthenticationProvider(它扩展了 AbstractUserDetailsAuthenticationProvider 并在 doAfterPropertiesSet() 中添加了一些它自己的检查)。

    因此该实现确实需要UserDetailsService,但您始终可以通过扩展AbstractUserDetailsAuthenticationProvider 来提供您自己的提供程序实现。

    【讨论】:

    • 他实际上在他的帖子中描述了他已经这样做了 - 扩展 AbstractUserDetailsAuthenticationProvider
    猜你喜欢
    • 2013-05-02
    • 2015-10-12
    • 2015-10-16
    • 2014-06-16
    • 2015-06-02
    • 2018-12-06
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多