在应用@Preauthorize spring安全注释之前,DispatcherServlet不会发现身份验证对象

时间:2014-08-03 17:27:14

标签: spring spring-security

当我尝试在Spring控制器方法上使用@PreAuthorize(“@ accessControl.hasActivity('abc')”)时,我在安全上下文中找不到Authentication对象。 调试后发现DispactcherServlet正在抛出此异常。

我已经设置了SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_THREADLOCAL); 当我第一次创建Authentication对象并在安全上下文中设置时

还尝试使用SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);但没有运气,它仍无效。

我无法理解为什么spring是servlet抛出此异常

1 个答案:

答案 0 :(得分:1)

首先,在Spring MVC拦截器中进行身份验证很奇怪。考虑在DispatcherServlet之前使用过滤器。有很多记录在案的例子。

其次,SecurityContextHolder.setStrategyName重新初始化策略,并可能使所有先前的身份验证无法访问,因此您必须在进行任何身份验证之前只调用一次(如果有的话)。

第三,如果要设置@PreAuthorize使用的当前身份验证并确定您正在执行的操作,请使用SecurityContextHolder.getContext().setAuthentication(anAuthentication);。在大多数情况下,API中有一个适合您的过滤器。