检索Spring Security的身份验证,即使在filter ="none"的公共页面上也是如此

jto*_*ron 8 java spring-security

假设我有一个名为faq.html的简单页面.我希望此页面可公开访问,因此我应用通常的Spring Security配置:

<sec:intercept-url pattern="/faq.html" filters="none" />
Run Code Online (Sandbox Code Playgroud)

我们还要说,如果用户在进行身份验证后到达此页面,我想在页面上打印"Hi Firstname Lastname".对于需要身份验证的页面,我只需将以下结果放入my中ModelMap,然后在我的视图中可以访问这些名称:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()
Run Code Online (Sandbox Code Playgroud)

这不起作用faq.html,大概是因为当你指定时filters="none",那么调用getPrincipal()返回null.(这种行为是有道理的,因为配置导致不应用过滤器.)所以,似乎我必须手动执行一堆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;
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?例如,看起来Spring应该提供一些工具来通过原始<sec:intercept-url />配置挂钩他们的API调用.

axt*_*avt 11

这就是不filters = "none"用于公共页面的原因.

access = "permitAll"改为使用(或者access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED"如果你没有use-expressions = "true").