2015-10-21 4 views
5

Вот мой сингл конфигурации безопасности для API сделал с SpringBoot:Безопасные методы MVC контроллер с @Secured аннотацию

@Configuration 
@EnableWebSecurity 
@EnableWebMvcSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserService userService; 

    @Autowired 
    private TokenAuthenticationService tokenAuthenticationService; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf().disable() 
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
      .authorizeRequests() 
       .antMatchers("/").permitAll() 
       .antMatchers("/static/**").permitAll() 
       .antMatchers(HttpMethod.POST, "/api/user/registration").permitAll() 
       .antMatchers(HttpMethod.POST, "/api/user/authentication").permitAll() 
       .anyRequest().authenticated().and() 
      .addFilterBefore(new TokenLoginFilter("/api/user/authentication", authenticationManagerBean(), tokenAuthenticationService), 
        UsernamePasswordAuthenticationFilter.class) 
      .addFilterBefore(new TokenAuthenticationFilter(tokenAuthenticationService),UsernamePasswordAuthenticationFilter.class); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder()); 
    } 

} 

Все URL отображаются на пружинный веб MVC контроллеры, и я хотел бы, чтобы вручную указать уровни доступа для контроллеров и их методы, как это:

@RestController 
@RequestMapping("/api/resource/") 
@Secured("ROLE_ANONYMOUS") //as default role 
public class ResourceController { 
    ... 

    @Secured("ROLE_USER") 
    some_method... 
} 

но когда мне выполнить/API/ресурс/* запросы как анонимный пользователь ответов приложения с 403 кодом состояния, но я ожидаю вызова метода. Похоже, что аннотация @Secured не влияет на авторизацию, и все методы контроллера разрешены только для ROLE_USER.

TokenAuthenticationFilter выполняет действие только в том случае, если присутствует токен, поэтому я думаю, что это не влияет.

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest httpServletRequest = (HttpServletRequest) req; 
    String token = httpServletRequest.getHeader(TokenAuthenticationService.AUTH_HEADER_NAME); 
    if (token != null) { 
     try { 
      SecurityContextHolder.getContext() 
        .setAuthentication(tokenAuthenticationService.verifyToken(new TokenAuthentication(token))); 
     } catch (AuthenticationException e) { 
      ((HttpServletResponse) res).setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
      return; 
     } 
    } 
    chain.doFilter(req, res); 
} 

Update:

Учитывая комментарии ниже этот вопрос я понял, что @Secured аннотаций является частью глобальной концепции метод безопасности, а не в общей части веб-безопасности. Теперь я folowing компромисса:

  1. Использования @Secured аннотации и информация о методе уровня доступа распространяется на классах контроллера, которые могут привести к ситуации diffucult определения уровня доступа метода в fufture с API выращенным.

  2. Храните всю информацию о доступе к методу в одном и том же месте (config), но должны поддерживать равенство значения @RequestMapping с помощью URL-адресов в config.

Какой из них вы считаете лучшим подходом или скажите пожалуйста, если я что-то пропустил?

+0

Это то, что вы указали в конфигурации ... для всех URL-адресов вы должны быть 'authenticated'. –

+0

Итак, как я могу сообщить Spring Security о наблюдении за аннотацией для любого другого метода сопоставления с контроллером? – Aeteros

+0

разрешают все доступ и используют глобальную защиту метода. URL-адреса и аннотации для разных вещей. –

ответ

2

Для того, чтобы сказать Spring следить за @Secured аннотацию, на вашем Config безопасности необходимо добавить следующее:

@EnableGlobalMethodSecurity(securedEnabled = true) 
Смежные вопросы