2015-01-21 20 views
7

Tôi đã nhận được sau cấu hình Spring Security:Xuân Boot: accessDeniedHandler không hoạt động

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/api/private/**", "/app/**").authenticated(); 
     http.csrf().disable(); 
     http.logout().logoutSuccessUrl("/"); 
     http.exceptionHandling().accessDeniedPage("/403"); //.accessDeniedHandler(accessDeniedHandler); 
    } 
} 

tôi mong đợi sau logic: không phải người dùng authenitcated sẽ được chuyển đến /403. Thay vào đó, Spring hiển thị trang Tomcat 403 mặc định. Tôi cũng đã thử tùy chỉnh accessDeniedHandler nếu không thành công.

Làm cách nào để triển khai logic tùy chỉnh khi truy cập bị lỗi?

Trả lời

15

AccessDeniedHandler chỉ áp dụng cho người dùng được xác thực. Hành vi mặc định cho người dùng chưa được xác thực là chuyển hướng đến trang đăng nhập (hoặc bất kỳ điều gì phù hợp với cơ chế xác thực đang sử dụng).

Nếu bạn muốn thay đổi mà bạn cần định cấu hình AuthenticationEntryPoint, được gọi khi người dùng chưa được xác thực cố gắng truy cập tài nguyên được bảo vệ. Bạn sẽ có thể sử dụng

http.exceptionHandling().authenticationEntryPoint(...) 

thay vì những gì bạn có. Để biết thêm chi tiết, hãy kiểm tra API docs.

1

Hành vi bảo mật thông thường của Spring là chuyển hướng người dùng chưa được xác thực đến trang đăng nhập của bạn như được định cấu hình bên dưới. Xác thực người dùng không được uỷ quyền (không có vai trò ADMIN) sẽ được dẫn đến việc tiếp cận trang bị từ chối:

http.authorizeRequests().antMatchers("/admin/**") 
    .access("hasRole('ADMIN')") 
    .and().formLogin().loginPage("/login") 
    .and().exceptionHandling().accessDeniedPage("/403"); 

Nếu bạn đã thực hiện cơ chế xác thực của riêng bạn và bạn không trông chờ vào cấu hình Xuân An để cung cấp không được thẩm định người dùng đến trang đăng nhập của bạn, bạn có thể chơi cấu hình Spring Security như sau - để phục vụ trang 403 tùy chỉnh của bạn thay vì trang đăng nhập thực sự:

http.authorizeRequests().antMatchers("/admin/**") 
    .access("hasRole('ADMIN')") 
    .and().formLogin().loginPage("/403") 
    .and().exceptionHandling().accessDeniedPage("/403"); 
Các vấn đề liên quan