2016-07-27 20 views
0

Hallo Ich bin neu zu Frühling Sicherheit und versuchen, herauszufinden, wie Authentifizierung Auth-Server Tokens zu konfigurieren. das Problem, das ich jetzt habe, ist, dass ich Cors 401 oder 403 auf den Preflight-Anfragen bin zu empfangen und nicht sicher, wie unten zu lösen ist ein Barebone Implementierung basiert sie auf einige TutorialsFrühling CorsFilter scheint nicht zu arbeiten immer noch ein 401 auf Preflight-Anfragen

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework http://www.baeldung.com/spring-security-oauth-jwt

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity 
@PropertySource(value = "classpath:oauth.properties") 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    UserRepository userRepository; 


    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.authenticationProvider(authenticationProvider()); 
    } 


    @Override 
    public void configure(WebSecurity web) throws Exception { 

     super.configure(web); 
    } 

    @Autowired 
    ObjectMapper mapper; 




    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable(); 

     http.authorizeRequests().antMatchers(HttpMethod.OPTIONS,"/oauth/token").permitAll() 
     .anyRequest().authenticated(); 
    } 




    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception{ 

     auth.inMemoryAuthentication(). 
     withUser("john").password("123").roles("USER"). 
     and(). 
     withUser("tom").password("111").roles("ADMIN"); 

    } 
    @Bean 
    public FilterRegistrationBean corsFilter() { 
     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter2()); 
     bean.setOrder(0); 
     return bean; 
    } 


} 


@Configuration 
@EnableAuthorizationServer 
public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter{ 

    @Autowired 
    private Environment env; 

    @Autowired 
    @Qualifier("authenticationManagerBean") 
    private AuthenticationManager authenticationManager; 


    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer){ 
     oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()"); 
    } 


    @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){ 
     final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); 
     tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(),accessTokenConverter())); 
     endpoints.tokenStore(tokenStore()) 
       .tokenEnhancer(tokenEnhancerChain) 
       .authenticationManager(authenticationManager); 

    } 

    @Bean 
    public JwtAccessTokenConverter accessTokenConverter(){ 
     final JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
     return converter; 
    } 

    @Bean 
    public TokenStore tokenStore(){ 

     return new JwtTokenStore(accessTokenConverter()); 

    } 

    @Bean 
    public FilterRegistrationBean corsFilter() { 
     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter2()); 
     bean.setOrder(0); 
     return bean; 
    } 

    @Bean 
    @Primary 
    public DefaultTokenServices tokenServices() { 
     DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); 
     defaultTokenServices.setTokenStore(tokenStore()); 
     defaultTokenServices.setSupportRefreshToken(true); 
     return defaultTokenServices; 
    } 
} 

Der CorsFilter2 ist ein Feder-Cors-Filter, der im Frühjahr 4.2 eingeführt wurde. Ich benutzte ihn, um die richtigen Antwort-Header einzufügen, um sie an den Kunden zurückzusenden. CoresRequest Anfrage auch ignorieren so im Inneren des configure-Block für die WebSecurity musste ich setzen Sie diesen

web.ignoring().requestMatchers(CorsUtils::isPreFlightRequest); 

Antwort

0

So habe ich herausgefunden, was mein Problem, das ich meine WebSecurity konfigurieren hatte und es begann zu arbeiten.

+0

Hey Mann wo hast du es konfiguriert, bekomme ich: '' 'Die Methode Ignoring() ist nicht definiert für den Typ ExpressionUrlAuthorizationConfigurer .ExpressionInterceptUrlRegistry''' wenn ich es nach''authorizeRequests''' und' '' Die Methode Ignoring() ist nicht definiert für den Typ HttpSecurity '' '' direkt nach http – mattobob

+0

@mattobob Ich habe es der configure-Methode in meiner SecurityConfig hinzugefügt die Methodensignatur sollte in etwa so aussehen \t public void configure (WebSecurity web) löst Ausnahme {} aus – jcdevbot