spring security 是构建在一系列filter之上的,这些filter会拦截请求,检测身份信息并将其重定向到身份认证组件或者授权组件,我自己常用的是UsernamePasswordAuthenticationFilter + AuthenticManager + 真正的调用提供者Provider。每一个Filter都要有AuthenticManager ,从而可以用其调用authenticate方法,进而找到ProviderManager 中的Provider 的authenticate方法进行调用。

//Filter类
this.getAuthenticationManager().authenticate(authRequest);

结果就是要么被后端接口执行,要么抛出相关异常(认证不通过、权限不够)。
最终要的是 WebSecurityConfigureAdapter类该类作为一个抽象类,自己的配置类通过继承他来配置信息。比如UserDetailService 用来定义数据库获取操作以及根据用户名查到的用户所具有的权限。Provider是自定义认证逻辑,Filer 定义其过滤链中的位置、其失败处理器和成功处理器。一般配置的Filter有FilterSercurityInteceptor (自定义的)用来实现。

重要的Filter FilterSercurityInteceptor主要是做鉴权的工作,其中FilterSecurityInterceptor 过滤器是通过对url的拦截,从而首先获得调用(SecurityMetaSource自定义类)得到此路径(资源)相关的权限,然后可以调用AccessDecisionManager 来对该请求进行判断。从而决定抛出异常还是,放行访问对应的API.
最后还有一些资源路径的配置,比如哪些是不需要认证与鉴权的,哪些是需要的。

    @Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());/*add */auth.authenticationProvider(getCustomUsernamePasswordAuthenticationProvider());}


spring security 主要做认证和授权两部分工作。
在我们配置好认证需要的UsernameService(从数据库中获取用户 ) 和 AuthenticationProvider(主要做认证工作) 之后,在用户登陆时,我们会拦截到其http请求,得到用户名和密码然后创建未认证的token 去 认证管理器认证,它会选择我们定义的AuthenticationProvider去进行认证工作,从而返回结果。如果成功则 调用成功处理器 AuthenticationSuccessHandler,失败则调用失败处理器。认证成功之后其认证信息就被框架记录下来,在之后的访问中就需要对其鉴权。

鉴权时候 首先得到对应URL 的角色信息,然后调用decisionMannager 来进行鉴权,我们现在有该url需要的角色信息,有框架缓存的认证信息 该认证信息里面有其角色信息,那么只需要一比对,如果认证信息的角色 在 需要的角色里面 则权限验证通过,否则权限验证失败,调用AccessDeniedHandler 进行处理。

2021 9 4 日更新
spring security 主要用于权限设计,对用户进行认证,对url进行授权。spring security 是基于过滤器的,即函数回调,SecurityFilterChain 默认有十几个过滤器,同时我们也可在webSecurityConfig 配置文件中添加自己的过滤器到过滤器链中从而实现功能 ,过滤器有SecurityContextPersistFilter 主要是用来 获取SercurityContext 放置在ThreadLocal中,同时在请求完成后清除ThreadLocal中的SercurityContext ,将其放在session中。(每一个客户端用户会对应一个session 放置在服务端的ConcurrentHashMap 中(sessionId,session)) 还有usernamePasswordFilter 用来进行账户名和把密码的认证。认证成功之后将Authentication设置在ThreadLocal的securityContext中。 FilterSecurityInteceptor主要是对进行鉴权的工作,首先需要从数据库中获取url->权限表,然后从ThreadLocal中获取context中的认证成功后的Authentication,之后便可以通过decissionManager进行decide 到底有没有权限,如果authentication中的url和将要访问的url匹配之后判断 权限是否匹配,如果匹配则放行,否则通知无权限。
spring secuirty 通过过滤器 功能划分明确,并且方便扩展。

WebSecurityConfiguration 生成 名为springSecurityFilterChain 类型为FilterChainProxy(实现了FIlter 接口)的 bean,该bean 只是作为 代理,所有请求都会经过该bean,真正起作用的是该类中的一个个FilterChain 。每个FilterChain中的Filter 各有各的职责。但是他们并不是直接处理用户的认证和授权,而是交给AuthenticationManager 和AccessDecisionManager 进行管理。
AuthenticationManager 主要是认证工作,ProviderManager 是其实现类,其内部维护了AuthenticationProvider 列表做认证工作。认证失败则抛出异常 认证成功则进行后续的操作。

spring security面试相关推荐

  1. 【200期】面试官问:Spring Security 和 Shiro 该如何选择?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  2. springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...

    Spring作为现在最流行的java 开发技术,其内部源码设计非常优秀.如果你不会Spring,那么很可能面试官会让你回家等通知. Spring是什么? 有一个工地,几百号人在用铁锹铲子挖坑. 如果开 ...

  3. 使用Spring Security 资源服务器来保护Spring Cloud 微服务

    我在上一篇对资源服务器进行了简单的阐述,让大家对资源服务器的概念有了简单的认识,今天我将用实际例子来演示单体应用改造为Spring Cloud微服务时的资源服务器实现. 资源服务器改造 以Spring ...

  4. Spring Security 5.5发布,正式实装OAuth2.0的第五种授权模式

    今天Spring Security 5.5发布了,主要涉及OAuth2.0和SAML2.0两个协议.其中最大的亮点是支持了OAuth2.0的另一种授权模式jwt-bearer.这个模式可能对大家比较陌 ...

  5. Spring Security 实战干货:OAuth2登录获取Token的核心逻辑

    作者 | 码农小胖哥 来源 | https://mp.weixin.qq.com/s/zdTBdSVunqwVGx-spHjLjw 1. 前言 在上一篇Spring Security 实战干货:OAu ...

  6. Spring Security 实战干货:OAuth2第三方授权初体验

    1. 前言 现在很多项目都有第三方登录或者第三方授权的需求,而最成熟的方案就是OAuth2.0授权协议.Spring Security也整合了OAuth2.0,在目前最新的 Spring Securi ...

  7. 在 SpringBoot 项目中,Spring Security 和 Shiro 该如何选择?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 要知道Shiro和Sprin ...

  8. Spring Security构建Rest服务-0100-前言

    一.我的前言 这是看慕课网老师讲的SpringSecurity的学习笔记,老师讲的很好,开篇就说到了我的心里,老师说道: 有一定经验的程序员如何提升自己? 1,每天都很忙,但是感觉水平没有提升 2,不 ...

  9. springsecurity sessionregistry session共享_不用 Spring Security 可否?试试这个小而美的安全框架...

    写在前面 在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题.用户的合法性与数据的可见性是数据安全中非常重要的一部分.但是,一方面,不同的应用对于数据的合法性和可见性要求的维度与粒度都有所区别 ...

  10. java面试spring_针对Java程序员的二十大Spring REST面试问题答案

    java面试spring 大家好,过去两周来,我一直在与Spring教程共享一些REST,今天,我将向申请Web开发人员角色的Java开发人员共享一些常见的Spring和REST采访问题. 由于Spr ...

最新文章

  1. ebuild 中的软件包依赖
  2. 数据库中的数据类型和c#的数据类型的映射表[转]
  3. JAVA中console方法怎么用_Java中Console对象实例代码
  4. MySQL 主外键约束与标准SQL不同的地方
  5. 关于如何使用反编译器,获取源码清单
  6. js 图形化工作流设计器
  7. 按住 ctrl 并滚动鼠标滚轮才可缩放地图_Firefox 73 将引入全局缩放功能,在所有网站都可适用...
  8. 赚小钱,靠学一门技术没问题,那想赚大钱该怎么做呢?
  9. 如何在.NET控制台应用程序中获取应用程序的路径?
  10. LabVIEW数字抽奖程序
  11. 数字图像处理matlab蔡利梅,数字图像处理:使用MATLAB分析与实现:using MATLAB
  12. dsoframer java_(二)   内嵌WORD/OFFICE的WINFORM程序——DSOFRAMER使用小结
  13. cad画多段线时不显示轨迹_为什么CAD直线、多段线等图形只显示一个夹点? - CAD自学网...
  14. linux卸载apache服务器,centos 7 安装卸载apache(httpd)服务的详细步骤
  15. JQuery 简单表单验证
  16. Qt5示例addressBook源码解析
  17. 华为鸿蒙系统失败,世界首富很无奈,第三大手机系统失败,华为鸿蒙会成功吗...
  18. 【排序】堆排序详解 附代码
  19. 如何提高内存卡的读写速度
  20. hutool工具类生成二维码案例

热门文章

  1. 折叠屏能否治愈年轻人的“换机焦虑”
  2. 各编程语言用途及分类
  3. 使用python压缩文件夹
  4. java编程 编写求解九宫格_java编程-九宫格问题
  5. 设计参考之不凡的日本LOGO
  6. ubuntu下终于安装好了nvidia的gt540显卡驱动
  7. mac桌面存在顽固文件无法删除?怎么办?
  8. 爬取斗鱼4300W热度的小姐姐是一种什么样的体验?
  9. 量子计算机大致原理,通俗简介量子计算机原理
  10. 嚯,这款AI建模工具实在太强大了,快来pick!