我有一个使用Spring Security进行角色验证但不用于登录的混合应用程序。 PreAuthorize失败,并显示“在SecurityContext中找不到身份验证对象”
我尝试将其添加到我的Login控制器中,但似乎不起作用:
SecurityContextHolder.getContext().setAuthentication(makeAuthentication(op));
配置如下:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebConfig extends WebSecurityConfigurerAdapter {}
我被迫使用身份验证提供程序吗?在这种情况下如何运作?用户角色存储在Operator对象中。
编辑:看来在请求之间清除了SecurityContext。我如何使其持久?
我尝试将安全上下文作为SPRING_SECURITY_CONTEXT_KEY
属性添加到会话中,但还是没有运气。
最后,我通过在拦截器中还原上下文来使其工作。不确定这是否是最好的方法。
答案 0 :(得分:0)
确保您的客户端在与自定义登录请求相同的会话中发送后续请求
如果可以确保,请检查您的自定义登录URL是否通过spring安全性,但作为不安全的URL。如果不是这种情况,则必须在自定义登录成功阶段添加以下内容。
SecurityContextHolder.getContext().setAuthentication(makeAuthentication(op));
HttpSession session = req.getSession(true);
session.setAttribute(SPRING_SECURITY_CONTEXT_KEY,
SecurityContextHolder.getContext());
SecurityContextPersistenceFilter
将确保在后续请求中填充SecurityContextHolder.getContext()
。