我在我的网络应用程序中使用Spring Security进行身份验证 现在,我需要访问用户信息,Controller中存在以下方法:
@RequestMapping(value = "/userstuff")
@Controller
public class SomeUserController {
@RequestMapping(value = "getUser", method = RequestMethod.GET)
@ResponseBody
public UserDetails getUser(Locale locale, Model model) {
UserDetails userDetails = null;
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
if (authentication != null) {
Object principal = authentication.getPrincipal();
userDetails = (UserDetails) (principal instanceof UserDetails ? principal
: null);
}
return userDetails;
}
}
如果控制器URL在applicationContext-Security.xml中没有进行安全检查:
<security:http pattern="/userstuff/**" security="none" />
然后调用
http:// host:port / app / userstuff / getUser - 返回null 。
但是,如果确实将其评论出来(允许弹簧安全拦截它):
<!-- <security:http pattern="/userstuff/**" security="none" /> -->
然后调用:
http:// host:port / app / userstuff / getUser 返回正确登录用户。
为什么会这样?
答案 0 :(得分:0)
当您使用security="none"
时,所有春季安全过滤器都将关闭(请参阅官方文档中的this entry)。所以没有SecurityContextHolder
,没有@PreAuthorize
,没有其他Spring Security功能可用。例如,通常SecurityContextHolder
由安全过滤器链中的一个过滤器填充。
作为一种解决方法几乎总是可以通过限制仅为匿名用户替换security="none"
构造:
<security:http ... />
...
<security:intercept-url pattern="/userstuff/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
....
</security:http>