2011-09-27 21 views
8

Giả sử tôi có một trang đơn giản có tên faq.html. Tôi muốn trang này để có thể truy cập công khai, vì vậy tôi áp dụng các cấu hình Spring an ninh thông thường:Truy xuất Xác thực của Spring Security, ngay cả trên các trang công cộng có bộ lọc = "none"

<sec:intercept-url pattern="/faq.html" filters="none" /> 

Cũng giả sử rằng nếu người dùng đến trang này sau khi chứng thực, tôi muốn in "Hi FirstName LastName" trên trang . Đối với các trang yêu cầu xác thực, tôi chỉ cần đặt the result of the following vào ModelMap của tôi, và sau đó là tên có thể truy cập theo quan điểm của tôi sau này:

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

này không làm việc cho faq.html, có lẽ bởi vì khi bạn chỉ định filters="none", sau đó cuộc gọi đến getPrincipal() trả về giá trị rỗng. (Hành vi này có ý nghĩa kể từ khi cấu hình không gây lọc để được áp dụng.) Vì vậy, thay vì có vẻ như rằng tôi phải làm một loạt các công cụ Xuân An bằng tay:

public static Authentication authenticate(HttpServletRequest request, 
     HttpServletResponse response, SecurityContextRepository repo, 
     RememberMeServices rememberMeServices) { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

    // try to load a previous Authentication from the repository 
    if (auth == null) { 
     SecurityContext context = repo.loadContext(
       new HttpRequestResponseHolder(request, response)); 
     auth = context.getAuthentication(); 
    } 

    // check for remember-me token 
    if (auth == null) { 
     auth = rememberMeServices.autoLogin(request, response); 
    } 

    return auth; 
} 

Có cách nào tốt hơn để làm điều này ? Ví dụ, có vẻ như Spring nên cung cấp một số cơ sở để kết nối các cuộc gọi API của họ thông qua cấu hình <sec:intercept-url /> gốc.

+0

Lưu ý rằng 'filters =" none "' dường như không được chấp nhận trong Spring 3.1.0: http://stackoverflow.com/a/5382178/521799 –

Trả lời

11

Đó là lý do không sử dụng filters = "none" cho các trang công khai.

Sử dụng access = "permitAll" thay vì (hoặc access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED" nếu bạn không có use-expressions = "true").

+0

Rock on. Tôi không biết tùy chọn đó. – jtoberon

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