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

Posted

技术标签:

【中文标题】是否可以通过 Spring Security 以编程方式进行身份验证并使其持久化?【英文标题】:Is it possible to programmatically authenticate with Spring Security and make it persistent? 【发布时间】:2011-07-02 12:13:27 【问题描述】:

我在 Spring Controller 中使用以下方法来允许通过 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);
    

我需要做什么才能使身份验证持久化?

【问题讨论】:

Matt - 你有想过这个吗?我现在正在尝试做同样的事情。打算从 Spring Security 论坛尝试这段代码:forum.springsource.org/… 是的,请参阅以下评论并发布解决方案:raibledesigns.com/rd/entry/… 【参考方案1】:

确定

您已配置SecurityContextPersistenceFilter 您没有将<security:http> 标记的create-session 属性设置为none

【讨论】:

我尝试查看 SecurityContextPersistenceFilter 中的逻辑并复制它。我添加了对 SecurityContextRepository 的引用,并在验证用户身份后尝试调用其 saveContext() 方法。还是没有骰子。 以标准方式配置 Spring Security 过滤器链比模仿它更容易吗?顺便说一句,请注意SecurityContextPersistenceFilter javadoc:必须在任何身份验证处理机制之前执行此过滤器。身份验证处理机制(例如 BASIC、CAS 处理过滤器等)期望 SecurityContextHolder 在执行时包含有效的 SecurityContext。这意味着上下文创建和存储应该发生在之前执行身份验证。 我已经成功地使用这种技术与 j_security_check 对话,并让它像 LoginService 实现一样工作。但是,我仍然面临着让 HTTPS 登录持续到 HTTP 的相同问题。我在 GitHub 项目中创建了一个 j_security_check 分支来尝试让这个替代实现工作。 github.com/mraible/ajax-login/tree/j_security_check

以上是关于是否可以通过 Spring Security 以编程方式进行身份验证并使其持久化?的主要内容,如果未能解决你的问题,请参考以下文章

spring security 判断用户是否登录 只要登录就可以访问资源

是否可以使用jsp登录表单作为spring security的自定义登录表单

是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFal

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

是否可以在 Spring Security 中仅使用刷新令牌请求访问令牌 oauth2?没有基本身份验证?

spring-security 登录 无法进入UserDetailsService类