У меня есть @ EnableOAuth2Sso в моем классе Application, один WebSecurityConfigurererAdapter с @EnableWebSecurity и один ResourceServerConfigurerAdapter с @ EnableResourceServer.
Приложение:
@SpringBootApplication
@EnableCaching
@EnableOAuth2Sso
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
* 100S
1006 *:1008 * ResourceServerConfigurerAdapter:
@Configuration
@EnableResourceServer
public class ResourceServerOktaConfig extends ResourceServerConfigurerAdapter {
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
.authorizeRequests().anyRequest().fullyAuthenticated();
}
}
Теперь я ожидал, что моя служба пользовательских данных пользователя будет учтена, но это не так.
Существует способ ввести пользовательские данные пользователяобслуживать, переопределяя конвертер и устанавливая его в конвертере токенов пользователя, но это переопределяет конфигурацию по умолчанию и создает довольно сложный код, как показано здесь:
@Configuration
@EnableResourceServer
public class ResourceServerPingConfig extends ResourceServerConfigurerAdapter {
@Autowired
PingFederateAccessTokenConverter converter;
@Autowired
CustomUserDetailsService customUserDetailsService;
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices()).resourceId("swissre");
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
@Bean
public TokenStore tokenStore() {
DefaultUserAuthenticationConverter userAuthConverter = new DefaultUserAuthenticationConverter();
userAuthConverter.setUserDetailsService(customUserDetailsService);
DefaultAccessTokenConverter accessTokenConverter =
(DefaultAccessTokenConverter) converter.getAccessTokenConverter();
accessTokenConverter.setUserTokenConverter(userAuthConverter);
return new JwtTokenStore(converter);
}
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatcher(new RequestHeaderRequestMatcher("Authorization"))
.authorizeRequests().anyRequest().fullyAuthenticated();
}
}
Теперь мой вопрос: кто-то там указывает на возможную ошибку- С моей стороны, или просто лучший, более простой способ внедрить службу сведений о пользователе при использовании конфигурации сервера ресурсов?
Добавление:
Я понял, что я должен добавить конфигурацию OAuth2:
security:
oauth2:
client:
client-id: xxxxx
client-secret: yyyy
access-token-uri: https://dev-aaaaaa.oktapreview.com/oauth2/default/v1/token
user-authorization-uri: https://dev-aaaaaa.oktapreview.com/oauth2/default/v1/authorize
scope: openid profile email
resource:
user-info-uri: https://dev-aaaaaa.oktapreview.com/oauth2/default/v1/userinfo
token-info-uri: https://dev-aaaaaa.oktapreview.com/oauth2/default/v1/introspect
prefer-token-info: false