这是我在这里的第一个问题,所以,它很有帮助,节省了我很多时间,但现在我找不到任何解决我的问题的办法。因为我对spring,尤其是Spring Security 还比较陌生,所以如果我有更多的知识的话,我会被一些很容易的东西困住。我有一个使用本地用户数据库的现有应用程序。它使用自定义的userdetails实现,如果与user:password authentification 通过登录表单。以下是当前设置:
public class SecurityContext extends WebSecurityConfigurerAdapter {
....
@Autowired
public void configureGlobal(final AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider()).userDetailsService(userDetailsService());
}
@Bean
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider result = new DaoAuthenticationProvider();
result.setUserDetailsService(userDetailsService());
result.setPasswordEncoder(passwordEncoder());
return result;
}
现在我想从一个说openidconnect的外部idp使用sso。通过阅读文档,我能够以“默认”的方式启动并运行它。这就是,在我的进程的和处,获取一个用户,该用户是oidcuser的示例。我需要该用户要么被扩展,要么合并现有的userdetails。文档(spring-boot和oauth2)建议
实现并公开oauth2userservice以调用授权服务器和数据库。您的实现可以委托给默认实现,这将完成调用授权服务器的繁重工作。您的实现应该返回扩展自定义用户对象并实现oauth2user的内容。
我能够引入自己的oauth2userservice,通过设置:
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler())
.and()
.oauth2Login()
.failureHandler(authenticationFailureHandler())
.successHandler(authenticationSuccessHandler())
.userInfoEndpoint()
.userService(this.oauth2UserService())
.oidcUserService(this.oidcUserService());}
private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
final OidcUserService delegate = new OidcUserService();
return (userRequest) -> {
OidcUser oidcUser = delegate.loadUser(userRequest);
//..DO some additional Stuff check against external Server
//Here I could load my custom userDetails
GatesUserDetails userDetails = (GatesUserDetails) userDetailsService.loadUserByUsername("131:" + username);
....
但我现在知道了如何让我的customuser有效地返回到我的函数。我试图在userdetails中实现oidcuser接口,但它仍然不起作用。任何提示(即使是对一个更容易理解的医生)都将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!