Spring Security-没有提供者的自定义身份验证?

时间:2020-07-10 09:57:58

标签: spring-security

我有一个使用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属性添加到会话中,但还是没有运气。 最后,我通过在拦截器中还原上下文来使其工作。不确定这是否是最好的方法。

1 个答案:

答案 0 :(得分:0)

  1. 确保您的客户端在与自定义登录请求相同的会话中发送后续请求

  2. 如果可以确保,请检查您的自定义登录URL是否通过spring安全性,但作为不安全的URL。如果不是这种情况,则必须在自定义登录成功阶段添加以下内容。

    SecurityContextHolder.getContext().setAuthentication(makeAuthentication(op));
    HttpSession session = req.getSession(true);
    session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, 
    SecurityContextHolder.getContext()); 
  1. 完成这些步骤后,Spring安全性的SecurityContextPersistenceFilter将确保在后续请求中填充SecurityContextHolder.getContext()