2011-11-30 43 views
8

Trong bảo mật mùa xuân 3.0, chúng tôi đang có lớp AuthenticationProcessingFilter, trong đó chúng tôi đang sử dụng phương pháp determineTargetUrl(), trả về url dựa trên các vai trò khác nhau.xác định url mục tiêu dựa trên vai trò trong bảo mật mùa xuân 3.1

Bây giờ, chúng tôi đang chuyển sang bảo mật mùa xuân 3.1.0.RC3 và tôi bị kẹt như thế nào bây giờ tôi nên xác định url dựa trên vai trò khác nhau như AuthenticationProcessingFilter lớp học đã được gỡ bỏ từ phiên bản mới. Bất cứ ai có thể xin vui lòng cho tôi các bước trong ngắn gọn với một số mã để tôi có thể thực hiện các bộ lọc tùy chỉnh để chuyển hướng đến các trang khác nhau cho các vai trò khác nhau.

Trả lời

19

Cách tốt nhất để xác định url mục tiêu dựa trên vai trò là chỉ định url mục tiêu trong cấu hình Spring Security của bạn như được hiển thị bên dưới. Điều này sẽ hoạt động trong Spring 3.0 hoặc 3.1

<http> 
    ... 
    <form-login login-page="/login" default-target-url="/default"/> 
</http> 

Sau đó, tạo bộ điều khiển xử lý url mục tiêu mặc định. Bộ điều khiển nên chuyển hướng hoặc chuyển tiếp dựa trên cuộn. Dưới đây là một ví dụ về việc sử dụng Spring MVC, nhưng bất kỳ loại điều khiển nào sẽ hoạt động (ví dụ: Struts, Servlet, v.v.).

@Controller 
public class DefaultController { 
    @RequestMapping("/default") 
    public String defaultAfterLogin(HttpServletRequest request) { 
     if (request.isUserInRole("ROLE_ADMIN")) { 
      return "redirect:/users/sessions"; 
     } 
     return "redirect:/messages/inbox"; 
    } 
} 

Ưu điểm của phương pháp này không được kết hợp với bất kỳ triển khai bảo mật cụ thể nào, nó không được kết hợp với bất kỳ triển khai MVC cụ thể nào và nó hoạt động dễ dàng với cấu hình không gian tên Spring Security. Một ví dụ đầy đủ có thể được tìm thấy trong dự án SecureMail tôi đã trình bày tại SpringOne năm nay.

Cách khác là bạn có thể tạo AuthenticationSuccessHandler tùy chỉnh. Việc triển khai có thể mở rộng SavedRequestAwareAuthenticationSuccessHandler là AuthenticationSuccessHandler mặc định. sau đó nó có thể được kết nối bằng không gian tên như được hiển thị bên dưới.

<sec:http> 
    <sec:form-login authentication-success-handler-ref="authSuccessHandler"/> 
</sec:http> 
<bean:bean class="example.MyCustomAuthenticationSuccessHandler"/> 

Tôi sẽ không khuyên bạn nên làm điều này vì nó được gắn với API bảo mật mùa xuân và tốt hơn là tránh điều đó khi có thể.

Các vấn đề liên quan