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").