当我尝试在Spring控制器方法上使用@PreAuthorize(“@ accessControl.hasActivity('abc')”)时,我在安全上下文中找不到Authentication对象。 调试后发现DispactcherServlet正在抛出此异常。
我已经设置了SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_THREADLOCAL); 当我第一次创建Authentication对象并在安全上下文中设置时
还尝试使用SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);但没有运气,它仍无效。
我无法理解为什么spring是servlet抛出此异常
答案 0 :(得分:1)
首先,在Spring MVC拦截器中进行身份验证很奇怪。考虑在DispatcherServlet之前使用过滤器。有很多记录在案的例子。
其次,SecurityContextHolder.setStrategyName
重新初始化策略,并可能使所有先前的身份验证无法访问,因此您必须在进行任何身份验证之前只调用一次(如果有的话)。
第三,如果要设置@PreAuthorize使用的当前身份验证并确定您正在执行的操作,请使用SecurityContextHolder.getContext().setAuthentication(anAuthentication);
。在大多数情况下,API中有一个适合您的过滤器。