美文网首页
spring boot 之 security(三) 流程及原理

spring boot 之 security(三) 流程及原理

作者: _大叔_ | 来源:发表于2019-10-13 01:37 被阅读0次

一、认证处理流程

登陆后的流程
UsernamePasswordAuthenticationFilter

UsernamePasswordAuthenticationFilter 是用来获取账号和密码,并做简单检验,拼接信息到 UsernamePasswordAuthenticationToken 对象

AuthenticationManager、AuthenticationProvider、UserDetailsService、UserDetails

会根据所得到的 UsernamePasswordAuthenticationToken 对象获取合适的 provider(供应者) 进行检验,然后得到 UserDetails 对象,其中获取 UserDetails 对象 也是通过 UserDetailsService 的 loadUserByUsername 获取的,这里也是我们配置用户名,密码,权限,凭证等。得到 UserDetails 对象后 要经过 预检查,是否可用,是否被锁,是否过期,还要经过一个附加检查,请求加密的密码 和 得到的是否一致,最后是厚检查,检查凭证是否过期。都通过才认为是成功的,返回一个 Authentication 对象。得到对象最后一步就是走 登陆成功处理器 。

二、认证结果如何在多个请求之间共享

image.png

默认结果是在session中存放,但什么时候存放的呢?什么时候又从session中读取?
SecurityContextHolder 是 ThreadLoac 的一个封装 。
SecurityContext 是用来存放成功的 Authentication


SecurityContextPersistenceFilter

SecurityContextPersistenceFilter 在所有过滤器之前,再请求时 会先帮我们检查session中是否有 SecurityContext ,如果有就把 SecurityContext 拿出来放到线程里,没有则执行后面的filter。当响应时 检查线程有 SecurityContext ,则放到session里。保证不同的请求同一个session 就可以拿到认证信息。整个请求是在同一个线程,所以我们在 SecurityContextHolder 可以随地拿到用户信息。

三、获取认证用户信息

这里就比较简单了,直接上代码

    @GetMapping("/me")
    public Object me(){
        return SecurityContextHolder.getContext().getAuthentication();
    }
    @GetMapping("/me1")
    public Object me1(Authentication authentication){
        return authentication;
    }
    @GetMapping("/me2")
    public Object me2(@AuthenticationPrincipal UserDetails userDetails){
        return userDetails;
    }

相关文章

网友评论

      本文标题:spring boot 之 security(三) 流程及原理

      本文链接:https://www.haomeiwen.com/subject/dbgqmctx.html