Допустим, у меня есть простая страница с именем faq.html. Я хочу, чтобы эта страница была общедоступной, поэтому я применяю обычную конфигурацию Spring Security:
<sec:intercept-url pattern="/faq.html" filters="none" />
Скажем также, что если пользователь заходит на эту страницу после аутентификации, я хочу напечатать «Привет, Фамилия, Имя» на странице. Для страниц, требующих аутентификации, я просто помещаю результат следующего в свой ModelMap
, и тогда имена, на мой взгляд, будут доступны позже:
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
Это не работает для faq.html
, возможно потому, что когда вы указываете filters="none"
, то вызов getPrincipal()
возвращает ноль. (Такое поведение имеет смысл, поскольку конфигурация не приводит к применению фильтров.) Итак, вместо этого мне кажется, что я должен выполнить кучу вещей Spring Security вручную:
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;
}
Есть ли лучший способ сделать это? Например, кажется, что Spring должен предоставить некоторую возможность для перехвата своих вызовов API через исходную конфигурацию <sec:intercept-url />
.