我正在使用Spring Security(版本3.2.3)和Jaas的应用程序中工作。 为此,我们基本上添加了一个扩展J2eePreAuthenticatedProcessingFilter的自定义过滤器。它适用于简单的过滤器:
<http pattern="/intern/**" auto-config="false" use-expressions="true"
entry-point-ref="preAuthenticatedProcessingFilterEntryPoint">
<custom-filter ref="myJ2eePreAuthenticatedProcessingFilter" before="FIRST" />
<csrf />
</http>
但对于像这样的安全控制器方法:
@Secured({ ROLE_RIGHT_ADMIN })
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public SearchResult getAll(SearchParams searchParams) throws ModelException {
return getService().searchEntities(searchParams);
}
Spring返回禁止,403。 进行一些调试和代码潜水,我们发现其中一个过滤器HttpSessionSecurityContextRepository无法找到安全上下文。代码如下:
// Session exists, so try to obtain a context from it.
Object contextFromSession = httpSession.getAttribute(springSecurityContextKey);
if (contextFromSession == null) {
if (debug) {
logger.debug("HttpSession returned null object for SPRING_SECURITY_CONTEXT");
}
return null;
}
但安全上下文创建良好并存储。此外,当我调试代码时,我能够使用以下方式访问HttpSessionSecurityContextRepository中的安全上下文:
SecurityContextHolder.getContext()
那么,这个SecurityContextPersistenceFilter和HttpSessionSecurityContextRepository的问题是什么?
注意:我做了一个解决方法,手动存储HttpSessionSecurityContextRepository将要查找的上下文。