Получить аутентификацию Spring Security, даже на общедоступных страницах с помощью filter = "none" - PullRequest
8 голосов
/ 27 сентября 2011

Допустим, у меня есть простая страница с именем 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 />.

1 Ответ

11 голосов
/ 27 сентября 2011

Это причина не использовать filters = "none" для общедоступных страниц.

Вместо этого используйте access = "permitAll" (или access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED", если у вас нет use-expressions = "true").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...