2016-08-23 3 views
0

Я пытаюсь улучшить свою безопасность провайдера OAuth2, защищая методы контроллера с помощью комментариев @PreAuthorize. Я также добавил @EnableGlobalMethodSecurity, так что @PreAuthorize будет работать с oauth.Поставщик Spring Oauth2 PreAuthorize не удалось ввести в автозагрузку

Вот моя текущая настройка:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
@EnableResourceServer 
@RestController 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @RequestMapping("/") 
    public String home() { 
     return "Hello World"; 
    } 

    @PreAuthorize("#oauth2.clientHasRole('ROLE_CUSTOM')") 
    @RequestMapping("/a") 
    public String a() { 
     return "foo"; 
    } 

    @PreAuthorize("#oauth2.clientHasRole('ROLE_TRUSTED_CLIENT')") 
    @RequestMapping("/b") 
    public String b() { 
     return "bar"; 
    } 

    // So that @PreAuthorize notations would work 
    @Configuration 
    @EnableGlobalMethodSecurity(prePostEnabled = true) 
    public static class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { 
     @Override 
     protected MethodSecurityExpressionHandler createExpressionHandler() { 
      return new OAuth2MethodSecurityExpressionHandler(); 
     } 
    } 

    @Configuration 
    @EnableWebSecurity 
    public static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore()); 
     } 

     @Bean 
     public ApprovalStore approvalStore() throws Exception { 
      TokenApprovalStore store = new TokenApprovalStore(); 
      store.setTokenStore(tokenStore()); 
      return store; 
     } 

     @Bean 
     public TokenStore tokenStore() { 
      return new InMemoryTokenStore(); 
     } 

     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 
      clients.inMemory() 
       .withClient("my-trusted-client") 
        .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
        .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
        .scopes("read", "write", "trust") 
        .resourceIds("oauth2-resource") 
        .accessTokenValiditySeconds(60) 
      .and() 
       .withClient("my-client-with-registered-redirect") 
        .authorizedGrantTypes("authorization_code") 
        .authorities("ROLE_CLIENT") 
        .scopes("read", "trust") 
        .resourceIds("oauth2-resource") 
        .redirectUris("http://anywhere?key=value") 
      .and() 
       .withClient("my-client-with-secret") 
        .authorizedGrantTypes("client_credentials", "password") 
        .authorities("ROLE_CLIENT","ROLE_CUSTOM") 
        .scopes("read") 
        .resourceIds("oauth2-resource") 
        .secret("secret"); 
     // @formatter:on 
     } 
    } 
} 

Он работает, когда я удалить @PreAuthorize нотации, но когда я добавляю их, компилятор бросает тонну отсутствующего инъекции autowired исключений, и я не могу на самом деле точно определить или найти объяснения того, что действительно вызывает проблему.

Here's my output

Мне очень жаль, что я не могу предоставить какие-либо дополнительные выходные или исследования, своего рода застрял в этой точке.

+0

Вы пытались извлечь ваш '@ RestController' из остальной части вашей конфигурации? кроме того, что это беспорядок для поддержания, у Spring могут возникнуть проблемы с настройкой безопасности метода _and_, используя ее в пределах одного класса. –

+0

BTW, пожалуйста, добавьте ваш стек в свой пост, используемый вами мусорный паштет уже недоступен. Это может также позволить пользователям, сталкивающимся с тем же исключением, найти этот пост. –

+1

@MichaelTecourt Я сделал это, и это сработало. Поздравляем, вы можете отправить ответ, если хотите – Benedictus

ответ

1

Попробуйте извлечь класс @RestController из остальной части конфигурации.

Помимо того, что классы конфигурации «все-все-все» - это беспорядок для обслуживания, у Spring могут возникнуть проблемы с настройкой безопасности метода и использованием его в одном классе.