2015-10-21 20 views
5

Dưới đây là cấu hình bảo mật duy nhất của tôi cho một API được thực hiện với SpringBoot:phương pháp MVC điều khiển an toàn với @Secured chú thích

@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()); 
    } 

} 

Tất cả các URL được ánh xạ tới bộ điều khiển MVC web mùa xuân và tôi muốn tự xác định cấp độ truy cập cho các bộ điều khiển và phương pháp của họ như thế này:

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

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

nhưng khi tôi thực hiện một/api/tài nguyên/* yêu cầu là người dùng ẩn danh các câu trả lời ứng dụng với 403 mã trạng thái, nhưng tôi hy vọng các cuộc gọi phương thức. Có vẻ như chú thích @Secured không ảnh hưởng đến ủy quyền và tất cả các phương thức điều khiển chỉ được phép cho ROLE_USER.

TokenAuthenticationFilter chỉ thực hiện tác vụ nếu có mã thông báo, vì vậy tôi đoán nó không có hiệu lực.

@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); 
} 

Cập nhật:

Xét ý kiến ​​dưới đây câu hỏi này tôi nhận ra rằng chú thích @Secured là một phần của khái niệm phương pháp an ninh toàn cầu, và không có trong phần chung của bảo mật web. Bây giờ tôi đã folowing cân bằng:

  1. Sử dụng @Secured chú thích và đã phương pháp thông tin cấp độ truy cập trải rộng trên lớp điều khiển, có thể dẫn đến tình trạng xác định cấp độ truy cập phương pháp diffucult trong fufture với API phát triển.

  2. Giữ tất cả thông tin truy cập phương thức ở cùng một vị trí (config), nhưng phải hỗ trợ sự bình đẳng của giá trị @RequestMapping với url trong cấu hình.

Bạn sẽ xem xét phương pháp nào tốt nhất hoặc cho biết nếu tôi bỏ lỡ điều gì đó?

+0

Đó là những gì mà bạn chỉ định trong cấu hình của bạn ... cho tất cả các url bạn phải 'đã được xác thực'. –

+0

Vậy làm thế nào để tôi bảo Spring Security xem chú thích cho bất kỳ phương thức điều khiển nào khác của yêu cầu ánh xạ? – Aeteros

+0

cho phép tất cả quyền truy cập và sử dụng bảo mật phương pháp toàn cầu. Các URL và chú thích dành cho những thứ khác nhau. –

Trả lời

2

Để biết mùa xuân để xem cho chú thích @Secured, về an ninh Config của bạn, bạn phải thêm như sau:

@EnableGlobalMethodSecurity(securedEnabled = true) 
Các vấn đề liên quan