ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringSecurity认证流程

2021-07-03 14:00:59  阅读:214  来源: 互联网

标签:getSession 流程 认证 获取 session https SpringSecurity hello


写作目的

最近在学习SpringSecurity,中间就遇到了一个问题:我在浏览器中第一次输入localhost:8080/hello,提示我没有登陆,自动跳转到登陆页面,等我登陆成功后,我在输入localhost:8080/hello,就成功访问了,验证第二次的时候,验证信息是存储在哪呢

案例代码

https://gitee.com/cbeann/Demooo/tree/master/springboot-security-demo

源码分析

初始化

我们从WebSecurityConfiguration类的加载开始,因为这个类带有@Configuration,从这里出发也说的过去。这个类有一个带有@Autowired的方法,所以在Bean的生命周期的里会执行这个方法,执行这个方法的时候会执行this.webSecurity=xxx ,创建webSecurity。

然后创建SpringSecurityFilterChain对象,并且name 等于常量 "springSecurityFilterChain"

其中springSecurityFilterChain的类型是FilterChainProxy,里面有一个类型是DefaultSecurityChain属性filterChains,filterChains里包含11个默认的Filter。

登陆验证过程

在浏览器中输入http://localhost:8080/login  (这个地址是/login是配置的),跳转到登陆页面;输入正确的用户名(zhangsan)和密码(123456)后,我们看这个请求的执行流程。

我们从DelegatingFilterProxy.doFilter()开始,首先获取applicationContext,然后从applicationContext中获取DefalutSecurityFilterChain(包含11个Filter)

把11个Security Filter 和FilterChain 封装成VirtualFilterChain,执行VirtualFilterChain.doFilter()方法

获取SecurityContext对象。session存在并且session.getAttribute("SPRING_SECURITY_CONTEXT")!=null,返回SecurityContxt;

否则创建一个新的SecurityContext。

并且把SecurityContext放在SecurityContextHolder(ThreadLocal)中。

AbstractAuthenticationProcessingFilter.doFilter()方法里面做了认证,并且有认证成功后的 自定义处理逻辑

认证成功后。把认证成功的信息保存在session中

获取用户信息

@RequestMapping("/hello")
    @ResponseBody
    public String hello(Authentication authentication) {
        System.out.println(authentication.getName());
        return "hello security";
    }

    @RequestMapping("/hello2")
    @ResponseBody
    public String hello2(Authentication authentication) {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        return "hello security2";
    }

我们可以在controller层获取,也可以在SecurityContextHolder(ThreadLocal)中获取。

为什么可以在 SecurityContextHolder中获取,因为每次请求都会在session中获取认证信息,并且保存在ThreadLocal中。

拓展

request.getSession(true/false)的区别

HttpServletRequest.getSession(ture)等同于 HttpServletRequest.getSession() 
HttpServletRequest.getSession(ture)表示如果有session返回,没有创建一个返回
HttpServletRequest.getSession(false)表示如果有session返回,没有就为null; 

ThreadLocal笔记

https://blog.csdn.net/qq_37171353/article/details/116859018

参考

https://blog.csdn.net/icarusliu/article/details/78739006

https://blog.csdn.net/u014236541/article/details/49786493

https://blog.csdn.net/qq_37171353/article/details/116859018

标签:getSession,流程,认证,获取,session,https,SpringSecurity,hello
来源: https://blog.csdn.net/qq_37171353/article/details/118423048

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有