2015-06-13 24 views
20

tôi làm việc trên hệ thống quản lý nội dung, mà có năm antMatchers như sau:Nhiều antMatchers trong an ninh mùa xuân

http.authorizeRequests() 
     .antMatchers("/", "/*.html").permitAll() 
     .antMatchers("/user/**").hasRole("USER") 
     .antMatchers("/admin/**").hasRole("ADMIN") 
     .antMatchers("/admin/login").permitAll() 
     .antMatchers("/user/login").permitAll() 
     .anyRequest().authenticated() 
     .and() 
     .csrf().disable(); 

mà giả sử có nghĩa là du khách có thể nhìn thấy tất cả các trang web tại đường dẫn gốc (/ *) và người dùng chỉ có thể xem (/ người dùng), quản trị viên chỉ có thể xem (/ admin) và có hai trang đăng nhập cho người dùng và một trang dành cho quản trị viên.

Mã này có vẻ hoạt động tốt, ngoại trừ phần quản trị - nó không hoạt động nhưng trả lại quyền truy cập bị từ chối ngoại lệ.

Trả lời

39

Tôi tin rằng vấn đề là theo thứ tự các quy tắc của bạn:

.antMatchers("/admin/**").hasRole("ADMIN") 
.antMatchers("/admin/login").permitAll() 

Thứ tự của các quy tắc các vấn đề và các quy tắc cụ thể hơn nên đi đầu tiên. Bây giờ mọi thứ bắt đầu bằng /admin sẽ yêu cầu người dùng được xác thực với vai trò ADMIN, ngay cả đường dẫn /admin/login (vì /admin/login đã khớp với quy tắc /admin/** và do đó quy tắc thứ hai bị bỏ qua).

Quy tắc cho trang đăng nhập do đó phải đi trước quy tắc /admin/**. VÍ DỤ.

.antMatchers("/admin/login").permitAll() 
.antMatchers("/admin/**").hasRole("ADMIN") 
Các vấn đề liên quan