• 使用 Spring Security 手动验证用户


    1。概述

    在这篇快速文章中,我们将重点介绍如何在 Spring Security 和 Spring MVC 中手动验证用户的身份。

    2。Spring Security

    简单地说,Spring Security 将每个经过身份验证的用户的主体信息保存在 ThreadLocal 中——表示为 Authentication 对象。

    为了构造和设置这个 Authentication 对象——我们需要使用 Spring Security 通常用来在标准身份验证上构建对象的相同方法。

    为此,让我们手动触发身份验证,然后将生成的 Authentication 对象设置为框架用来保存当前登录用户的当前 SecurityContext

    UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
    Authentication auth = authManager.authenticate(authReq);
    SecurityContext sc = SecurityContextHolder.getContext();
    sc.setAuthentication(auth);
    

    在上下文中设置 Authentication 后,我们现在可以使用 securityContext.getAuthentication().isAuthenticated() 检查当前用户是否已通过身份验证。

    3。Spring MVC

    默认情况下,Spring Security 在 Spring Security 过滤器链中添加了一个额外的过滤器——它能够持久化安全上下文(SecurityContextPersistenceFilter 类)。

    反过来,它将安全上下文的持久性委托给 SecurityContextRepository 的实例,默认为 HttpSessionSecurityContextRepository 类。

    因此,为了对请求设置身份验证并因此使其可用于来自客户端的所有后续请求,我们需要在 HTTP 会话中手动设置包含 AuthenticationSecurityContext

    public void login(HttpServletRequest req, String user, String pass) { 
        UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
        Authentication auth = authManager.authenticate(authReq);
        
        SecurityContext sc = SecurityContextHolder.getContext();
        sc.setAuthentication(auth);
        HttpSession session = req.getSession(true);
        session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
    }
    

    SPRING_SECURITY_CONTEXT_KEY 是静态导入的 HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY

    需要注意的是,我们不能直接使用 HttpSessionSecurityContextRepository -- 因为它与 SecurityContextPersistenceFilter. 一起工作

    这是因为我们使用的返回值是被 Wrapper 包装过后的对象,而 HttpSessionSecurityContextRepository 只能处理被 Wrapper 包装前的对象。

    4。结论

    在这个快速教程中,我们讨论了如何在 Spring Security 上下文中手动设置用户 Authentication 以及如何使其可用于 Spring MVC 目的,重点介绍了说明实现它的最简单方法的代码示例。

    与往常一样,可以在 GitHub 上 找到代码示例。

  • 相关阅读:
    OpenGL 灰度图
    HDLbits:Fsm onehot
    为什么axios会有params和data两个参数
    numpy傅里叶变换
    python的公有和私有属性,方法的使用
    图片怎么识别文字?这几个方法很实用
    阿里云4核8G服务器优惠价格表,最低价格501.90元6个月、983.80元1年
    Virtualenvwrapper 的安装教程
    胆囊结石的后果
    【App自动化测试】(四)Capability配置参数说明
  • 原文地址:https://www.cnblogs.com/hunterzhang/p/16771018.html