Spring 如何使用WebSecurity配置适配器定义自定义UserDetails服务?
我对如何正确扩展Spring 如何使用WebSecurity配置适配器定义自定义UserDetails服务?,spring,spring-boot,spring-security,Spring,Spring Boot,Spring Security,我对如何正确扩展websecurityConfigureAdapter以正确使用自定义UserDetailsService并将其作为bean公开感到有点困惑。 我的意思是,有: userDetailsService():Javadoc说: 允许从中修改和访问userdetails服务 userDetailsServiceBean()而不与 ApplicationContext。开发人员应在以下情况下重写此方法: 更改userDetailsServiceBean()的实例 userDetail
websecurityConfigureAdapter
以正确使用自定义UserDetailsService
并将其作为bean公开感到有点困惑。
我的意思是,有:
:Javadoc说: 允许从中修改和访问userDetailsService()
userdetails服务
而不与userDetailsServiceBean()
。开发人员应在以下情况下重写此方法: 更改ApplicationContext
的实例userDetailsServiceBean()
:Javadoc说: 重写此方法以公开从中创建的userDetailsServiceBean()
UserDetailsService
配置为bean。[…]改变 实例返回后,开发人员应进行更改将(AuthenticationManagerBuilder)
userDetailsService()
:Javadoc说: […]可以使用配置(AuthenticationManagerBuilder)
方法公开 生成的authenticationManagerBean()
作为Bean。这个AuthenticationManager
可用于公开上次填充的 使用创建的用户详细信息服务userDetailsServiceBean()
作为Bean。AuthenticationManagerBuilder
也将自动在上填充UserDetailsService
用于其他HttpSecurity#getSharedObject(类)
(即记忆配置器)SecurityContextConfigurer
配置一个configure(AuthenticationManagerBuilder)
,它可以通过覆盖AuthenticationManager
以标记authenticationManagerBean()
来公开;要构建此@Bean
,AuthenticationManager
构建并连接配置(AuthenticationManagerBuilder)
用户详细信息服务
- 重写
(用userDetailsServiceBean()
标记)允许公开以前方法构建和连接的@Bean
UserDetailsService
- 如果我想
使用我自己的configure(AuthenticationManagerBuilder)
实现,我必须重写UserDetailsService
以返回它;然后重写UserDetailsService()
userDetailsServiceBean()
@覆盖
受保护的无效配置(最终身份验证ManagerBuilder身份验证)
抛出异常{
最终MyUserDetailsService userDetailsService=userDetailsService();
auth.userDetailsService(userDetailsService);
//省略了所有其他配置
}
@凌驾
受保护的MyUserDetailsService userDetailsService(){
返回新的MyUserDetailsService();
}
@豆子
@凌驾
公共UserDetailsService userDetailsServiceBean()引发异常{
返回super.userDetailsServiceBean();
}
然而,这正是困扰我和我所看到的:
的默认实现基本上不起任何作用(只是将configure(final authenticationmanager builder auth)
设置为disableLocalConfigureAuthenticationBldr
),尤其是它不调用true
;这是我的重写完成的,所以我通过使用userdetails服务()
;换句话说,如果我不重写UserDetailsService()
并在UserDetailsService()
直接获得相同的结果configure>中创建自定义
实例,则我将注入自定义的UserDetailsService
实现(final AuthenticationManagerBuilder auth)UserDetailsService
- 可能与上述内容有关:
的默认实现与userDetailsService()
…我希望后者迟早会委托给前者,但如果前者的默认实现实际上是相同的…我真的迷路了,我想知道为什么会提供两种不同的方法userDetailsServiceBean()的默认实现完全相同
- 我希望,通过上述方法,我的自定义
实现会在应用程序上下文中公开,但如果我尝试在其他地方注入MyUserDetailsService
实例,Springs会抱怨在我的应用程序上下文中没有这样的实例;实际上,MyUserDetailsService
始终是某种委托包装器;如果我插入一个通用的userDetailsServi返回的beanceBean()
实例并尝试使用它,我会得到一个UserDetailsService
说“UserDetailsService是必需的”(org.springframework.security.config.annotation.web.configuration.websecurityConfigureAdapter.UserDetailsServiceDelegator.loadUserByUsername(String)中的委托机制无法检索正确的默认值IllegalStateException
。)UserDetailsService
- 通过调试,我看到
被调用了两次(因此创建了userDetailsService()
的两个不同实例),一次是由上面的MyUserDetailsService
,一次由configure(final AuthenticationManagerBuilder auth)实现调用的
org.springframework.security.config.annotation.web.configuration.websecurityConfigureAdapter.createSharedObjects()
UserDetailsService
被注入AuthenticationManager
,但它无法在应用程序上下文中公开UserDetailsService
)我可能通过简单地用@Service
标记MyUserDetailsService
bean,或者在我的websecurityConfigureAdapter
扩展中编写另一个@bean
方法来克服所有这些问题,该扩展返回我的自定义UserDetailsService
,然后