Ich habe versucht, einen OAuth2-Authentifizierungsserver mit den Leitern von Dave Syer zu implementieren, der von JHipster inspiriert wurde. Aber ich kann nicht herausfinden, wie alles zusammen funktioniert.Spring Security OAuth2, die Sicherheit entscheidet?
Es sieht so aus, als ob die Sicherheitskonfiguration mit dem WebSecurityConfiguratorAdapter überschrieben wird, wenn ich ResourceServerConfigurerAdapter verwende.
@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();
}
}
Dies ist Code aus ein paar verschiedenen Beispielen, so dass sie nicht so gut mischen können. Aber ich kann keine gute Dokumentations-/Beispielliste für OAuth2 finden (anders als Spring Boot, die eine großartige Dokumentation hat), so dass ich Probleme habe zu verstehen, wie alles zusammenpasst. Wenn ich das LoginForm nicht dem ResourceServerConfigurerAdapter hinzufüge, wird es mich nur nicht autorisiert. Aber ich habe es im WebSecurityConfigurerAdapter als permitAll() definiert.
Dies ist 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()");
}
}
Alles, was ich falsch mache? Muss ich die gesamte Sicherheit im ResourceServerConfigurerAdapter einrichten? Brauche ich den WebSecurityConfigurerAdapter noch?
Wenn jemand irgendwelche Anleitungen, Tutorials, Blogs oder ähnliches kennt, die mir helfen könnten, meinen Kopf darüber zu wickeln, wie das funktioniert, wäre das sehr zu schätzen.
Mit freundlichen Grüßen, Kenneth.
Ihre 'OAuth2ResourceConfig' ist so weit redundant, wie ich sehen kann. Sag es einfach. –
Was sind die Symptome (welche Wege schlagen Sie und was sehen Sie)? Die Verwendung von curl (-v, um die Header anzuzeigen) und die DEBUG-Protokollierung für Spring Security sollten Ihnen alles sagen, was Sie wissen müssen. –
Die Symptome waren, dass es den WebSecurityConfigurerAdapter grundsätzlich ignorierte. Aber nachdem ich Ihnen die Erklärung unten gelesen habe, bekomme ich ein bisschen mehr, wie es funktioniert. – LG87