Java 是否可以通过编程方式使用Spring Security进行身份验证并使其持久化?

Java 是否可以通过编程方式使用Spring Security进行身份验证并使其持久化?,java,security,spring,spring-security,Java,Security,Spring,Spring Security,我在Spring控制器中使用以下方法来允许通过Ajax进行身份验证。它可以工作,但它似乎不会创建cookie或任何使身份验证持久化的东西 @RequestMapping(method = RequestMethod.POST) @ResponseBody public LoginStatus login(@RequestParam("j_username") String username, @RequestParam("j_password")

我在Spring控制器中使用以下方法来允许通过Ajax进行身份验证。它可以工作,但它似乎不会创建cookie或任何使身份验证持久化的东西

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public LoginStatus login(@RequestParam("j_username") String username,
                         @RequestParam("j_password") String password) {

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);

    try {
        Authentication auth = authenticationManager.authenticate(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
        return new LoginStatus(auth.isAuthenticated(), auth.getName());
    } catch (BadCredentialsException e) {
        return new LoginStatus(false, null);
    }
}
我需要做什么才能使身份验证持久化?

确保

  • 您已经配置了
    SecurityContextPersistenceFilter
  • 您没有将
    标记的
    create session
    属性设置为
    none

我尝试查看SecurityContextPersistenceFilter中的逻辑并复制它。我添加了对SecurityContextRepository的引用,并在对用户进行身份验证后尝试调用其saveContext()方法。还是不行。用标准的方式配置Spring安全过滤器链不是比模仿它更容易吗?顺便说一句,请注意
SecurityContextPersistenceFilter
javadoc:此过滤器必须在任何身份验证处理机制之前执行。身份验证处理机制(例如基本、CAS处理筛选器等)希望SecurityContextHolder在执行时包含有效的SecurityContext。这意味着上下文创建和存储应该在执行身份验证之前进行。我已经成功地使用此技术与j_security_check进行了交谈,并使其与LoginService实现一样工作。然而,在让HTTPS登录持久化到HTTP时,我仍然面临同样的问题。我在GitHub项目中创建了一个j_security_check分支,以尝试让这个替代实现正常工作。马特-你有没有想过这个?我现在正试图做同样的事情。要从Spring安全论坛中尝试此代码:是的,请参阅以下注释和帖子以了解解决方案: