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.
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 –