Я пытался реализовать сервер аутентификации OAuth2 с помощью руководств Дейва Сиера с некоторым вдохновением от JHipster. Но я не могу понять, как все это работает.Spring Security OAuth2, который решает проблему безопасности?
Похоже, что настройка безопасности с использованием WebSecurityConfigurerAdapter перезаписывается, когда я использую ResourceServerConfigurerAdapter.
@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {
private TokenExtractor tokenExtractor = new BearerTokenExtractor();
@Override
public void configure(HttpSecurity http) throws Exception {
http
.addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class)
.authorizeRequests()
.anyRequest().authenticated().and().httpBasic();
}
private OncePerRequestFilter contextClearer() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (tokenExtractor.extract(request) == null) {
SecurityContextHolder.clearContext();
}
filterChain.doFilter(request, response);
}
};
}
@Component
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
private final AuthenticationManager authenticationManager;
@Autowired
public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.parentAuthenticationManager(authenticationManager);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/login").permitAll()
.and()
.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.and()
.requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
.and()
.authorizeRequests().anyRequest().authenticated();
}
}
Это код, взятый из нескольких разных примеров, поэтому они могут не смешивать их хорошо. Но я не могу найти хороший список документации/примеров для OAuth2 (в отличие от Spring Boot, который имеет потрясающую документацию), поэтому у меня возникают проблемы с пониманием того, как все они подходят друг другу. Если я не добавлю loginForm в ResourceServerConfigurerAdapter, он просто даст мне несанкционированный доступ. Но я определил его в WebSecurityConfigurererAdapter как allowAll().
Это AuthorizationServerConfigurerAdapter:
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("acme")
.secret("acmesecret")
.authorizedGrantTypes("authorization_code", "refresh_token",
"password").scopes("openid");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager).accessTokenConverter(jwtAccessTokenConverter);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
}
Все, что я делаю неправильно? Должен ли я настроить всю безопасность в ResourceServerConfigurerAdapter? Мне еще нужен WebSecurityConfigurerAdapter?
Если кто-нибудь знает какие-либо руководства, учебные пособия, блоги или что-нибудь подобное, что может помочь мне обернуть голову вокруг того, как это работает, что было бы очень полезно.
С уважением, Кеннет.
Ваш 'OAuth2ResourceConfig' является избыточным, насколько я могу видеть. Просто говорю. –
Каковы симптомы (какие пути вы нажимаете и что видите)? Использование curl (-v для просмотра заголовков) и ведение журнала DEBUG для Spring Security должно сообщать вам все, что вам нужно знать. –
Симптомы состояли в том, что он в основном игнорировал WebSecurityConfigurerAdapter. Но после прочтения объяснений ниже, я получаю немного больше, как это работает. – LG87