SpringSecurity学习笔记(一)springSecurity的整体架构

2023-11-10

参考视频,编程不良人。

1、什么是SpringSecurity?

首先我们要知道SpringSecurity是Spring家族中的一员,是基于spring框架提供的一套web应用安全性的完整解决方案,包括可高度定制的认证、授权、鉴权等一系列的流程。
它在和springcloud进行整合时候具有其他的框架无法比拟的优势,因此逐渐成为微服务时代首选的安全框架。

除了SpringSecurity以外还有其他的框架也能够提供安全的支持,比如

  • Shiro:阿帕奇旗下的比较老牌的安全框架,轻量、简单、易于集成、可以单独在Javase环境中使用而不用在spring环境中使用。但是在微服务时代,它的扩展性比较差,显得力不从心。
  • 自定义安全框架:这个一般是有一定的难度的,需要考虑各种防御策略。一般只有比较大型的公司才会有能力自研自己的安全框架。

2、springSecurity的整体架构

在这里插入图片描述

认证

  • 认证AuthenticationManager

在这里插入图片描述

public interface AuthenticationManager {
    Authentication authenticate(Authentication var1) throws AuthenticationException;
}

返回Authentication 表示认证成功,抛出AuthenticationException表示认证失败。它的实现类有几种
在这里插入图片描述
主要实现类是ProviderManager,它管理着很多AuthenticationPrividor 实例,SpringSecurity允许存在多个AuthenticationPrividor 用来实现多种认证方式。

  • Authentication

Authentication类用来保存认证成功的用户的信息。

public interface Authentication extends Principal, Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    Object getCredentials();//获取用户凭证信息,一般指密码

    Object getDetails();//获取用户详细信息

    Object getPrincipal();//获取用户身份信息,用户名,用户对象等

    boolean isAuthenticated();//用户是否认证成功

    void setAuthenticated(boolean var1) throws IllegalArgumentException;
}
  • SecurityContextHolder维护用户信息

SpringSecurity会将用户的认证信息保存在session中。SecurityContextHolder中维护了Authentication ,方便获取用户的信息。SecurityContextHolder中的数据保存是通过ThrealLocal来实现的,将用户的请求数据和当前处理用户请求的线程绑定在了一起。当用户登录完成之后就会清空SecurityContextHolder中的数据然后将用户的认证信息保存在session中,后面每当有请求过来的时候都会从session中取出用户的认证信息放到SecurityContextHolder中和当前线程绑定在一起,这样就可以实现在controller、service层都能够获取到用户的认证数据,当请求处理完成之后就会将认证信息放回session中然后删除SecurityContextHolder中的数据。

授权

  • AccessDecisionManager 访问决策管理器

这个是用来判断这个请求是否允许被访问。接口源码如下:

public interface AccessDecisionManager {
    void decide(Authentication var1, Object var2, Collection<ConfigAttribute> var3) throws AccessDeniedException, InsufficientAuthenticationException;

    boolean supports(ConfigAttribute var1);

    boolean supports(Class<?> var1);
}
  • AccessDecisionVoter访问决策投票器

这个投票器会判断用户是否拥有访问该资源应有的角色,进而投出赞成、反对票或者弃权票。

public interface AccessDecisionVoter<S> {
    int ACCESS_GRANTED = 1;
    int ACCESS_ABSTAIN = 0;
    int ACCESS_DENIED = -1;

    boolean supports(ConfigAttribute var1);

    boolean supports(Class<?> var1);

    int vote(Authentication var1, S var2, Collection<ConfigAttribute> var3);
}

AccessDecisionManagerAccessDecisionVoter都有众多的实现类,在AccessDecisionManager 中会遍历所有的AccessDecisionVoter进而判断用户是否拥有对应的访问权限。

  • ConfigAttribute用来保存授权时的角色信息

当一个请求过来的时候AccessDecisionManager会将当前用户的角色封装成ConfigAttribute然后和AccessDecisionVoter进行遍历对比,如果投出了赞成票则用户对该资源有访问权限,否则没有访问权限,抛出异常。

public interface ConfigAttribute extends Serializable {
    String getAttribute();
}

3、springSecurity环境搭建

搭建一个springboot项目编写接口
在这里插入图片描述
访问测试
在这里插入图片描述
然后加入我们的security的start依赖

<dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

这个时候我们再启动项目
在这里插入图片描述
可以发现启动日志里面多了一条信息

Using generated security password: 40ea0442-79c3-4b2d-ae39-deeb27e3e279

然后我们继续访问刚才的接口
在这里插入图片描述
发现这里直接跳转到了登录页上面去,原来的接口已经无法直接访问到了。

然后我们登录,使用用户名user,密码40ea0442-79c3-4b2d-ae39-deeb27e3e279,这个就是刚才日志打印的uuid密码。然后就跳转到了正常的接口返回,这个时候访问其他的接口都可以实现访问。
在这里插入图片描述

4、springSecurity实现原理(官方文档

以下图片来自官网

在架构上的实现是基于servlet容器中的过滤器来实现的。但是基于过滤器进行了一些封装。
在这里插入图片描述
DelegatingFilterProxy(委派过滤器代理类)就相当于是一个桥梁,连通servlet容器的生命周期和spring的ApplicationContext。官方大概的意思就是说提供了可以将servlet的过滤器使用springbean的方式来实现。

在这里插入图片描述

Spring Security的Servlet支持包含在FilterChainProxy中。FilterChainProxy是Spring Security提供的一种特殊过滤器,允许通过SecurityFilterChain委托给许多过滤器实例。由于FilterChainProxy是一个Bean,因此它通常包装在DelegatingFilterProxy中。

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringSecurity学习笔记(一)springSecurity的整体架构 的相关文章

随机推荐

  • FastDB简单介绍及实例(Linux)

    本文内容主要是通过学习官网 博客及阅读官网demo做出的总结 FastDB是一个内存数据库 通过把数据加载到内存中实现对数据的操作 相比于传统的数据库 操作的速度更快 但是存在一个缺点就是使用FastDB数据库的应用程序都必须运行在同一台主
  • 【LWIP】stm32用CubeMX(6.4版)配置LwIP+Ping+TCPclient+TCPserver发送信息到PC(操作部分)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 零 更新 2022 08 07 一 实验平台 二 手把手全程配置步骤 1 配置电脑环境 2 配置cubeMX 3 配置MDK Keil5 4 配置TCPcli
  • 监听屏幕滚动开始和结束事件(scroll start 和scroll stop)

    背景 最近在写一个专题页 产品要求右边导航栏在滑动的时候收起 滑动停止时显示 这样就需要监听到屏幕滚动 scroll start 事件和滚动结束 scroll end 事件 但是又不能为了这个功能专门引入jQuery mobile这个库 所
  • 来,看看这20个常用的宏定义!

    关注 星标公众号 直达精彩内容 ID 技术让梦想更伟大 作者 李肖遥 写好C语言 漂亮的宏定义很重要 使用宏定义可以防止出错 提高可移植性 可读性 方便性等等 下面列举一些成熟软件中常用的宏定义 1 防止一个头文件被重复包含 1 ifnde
  • npm 查看安装包版本

    npm info 安装包包名 如 npm info webpack
  • Linux查看CPU信息[//proc/loadavg]

    工作原理 基于 proc 文件系统 Linux 系统为管理员提供了非常好的方法 使其可以在系统运行时更改内核 而不需要重新引导内核系统 这是通过 proc 虚拟文件系统实现的 proc 文件虚拟系统是一种内核和内核模块用来向进程 proce
  • 1Panel 和宝塔有什么区别?

    宝塔是一款被广泛使用的 Linux 面板 与宝塔 Linux 面板相比 1Panel 的特色是开源和现代化 开源 1Panel 强调开源开放 广泛获取社区使用反馈 并快速迭代 现代化 一方面 1Panel 采纳最新的前端技术 并通过精心设计
  • SpringBoot Restful API 请求响应总结

    Controller 映射注解分为两大类 url映射注解和参数绑定注解 url映射注解 Controller 修饰class 用来创建处理http请求的对象 RestController Spring4之后加入的注解 原来在 Control
  • 2020-11-14

    MySQL学习周报 视图 数据库数据导入导出数据 数据库设计 1 视图 view 1 1 什么是视图 站在不同的角度去看到数据 同一张表的数据 通过不同的角度去看待 1 2 怎么创建视图 怎么删除视图 create view myview
  • 使用宝塔面板安装Rocket.Chat多功能团队聊天室

    安装 官方文档 https rocket chat docs 环境要求 NodeJS 8 11 4 Mongodb 4 0 9 Nginx 非必需 提示 由于官方建议的最低内存1G 所以512M或更小的建议加点虚拟内存 可以使用Swap一键
  • Linux 配置SSH免密登录

    介绍 SSH原理其实是非对称加密 即公钥加密私钥解密 免密登录原理 即事先将RSA非对称加密的公钥由主节点拷贝到到其他节点 只需实现主节点至其他节点的免密即可 流程如下 Client将自己的公钥存放在Server上 追加在文件authori
  • 华为荣耀8手机微信登录显示服务器错误,华为荣耀8手机无法登录360会员圈由于华为荣耀8手机无法登录3 爱问知识人...

    2017 10 12 05 41 48 保存个人资料恢复出厂值试一下 全部 2017 10 12 05 41 48 2017 10 12 05 41 48 会员的名称密码还有么 全部 2017 10 12 05 41 48 2017 10
  • STL算法之排序

    stl 算法库中提供的排序相关算法主要有以下几种 除了 q sort 定义在 cstdlib 头文件中 其余都定义在 algorithm 头文件 算法 功能 sort 排序 stable sort 稳定排序 保证等值情况时的原有顺序 par
  • 【C++】教大家在七夕new一个对象

    new是啥 new 是C 的关键字之一 它一般用来在堆上创建对象 但它与一般的创建对象的方法不同 它在创建对象时 会返回这个对象的指针 堆是啥 还有 和栈有什么区别 栈是由编译器自动分配和释放的 一般存放函数的参数值 局部变量的值等 速度较
  • c++primer 第十七章笔记 01tuple类型

    tuple类型 tuple看作一个 快速而随意 的数据结构 三个成员都设置为0 tuple
  • flowable实战(四):构建命令行程序

    实际上前面那些都是前置知识 真正上手的话其实还是一脸懵的情况 这里我也是按照文档生成一个最简单的demo 这个demo就是一个简单的Maven工程 你只要启动main方法就可以看到效果 github实例代码地址 这里如果直接下载代码 如果不
  • TCP的乱序和丢包判断(附Reordering更新算法)-实例case

    写前一篇文章TCP的乱序和丢包判断 附Reordering更新算法 理论的时候 我觉得我在一边拉一边吃 玩的都是排泄物 言之无味 不知所云 我想把一些能看得见摸得着的东西独立出来 就成了本文 如果有一天我忘掉了TCP的细节 我想我直接把本文
  • ADB无线连接/wifi调试 安卓设备

    一般 对android设备使用adb命令前 需要先用数据线连接设备后 才可以继续使用 此篇文章 我们来讲另外一种android设备的连接方式 无线连接 一 无线连接设置的具体步骤如下 第一步 先用USB数据线 将手机和电脑连接在一起 1 数
  • Python兼职接单也能月入过万,整理了70个练手的小项目,赶快学起来

    下面是一些的python兼职单子截图 心动了吗 快去抓紧时间学习起来吧 上述这份完整版的Python全套学习资料已经上传CSDN官方 朋友们如果需要可以直接划到文末免费领取 保证100 免费 关于Python技术储备 学好Python 不论
  • SpringSecurity学习笔记(一)springSecurity的整体架构

    参考视频 编程不良人 1 什么是SpringSecurity 首先我们要知道SpringSecurity是Spring家族中的一员 是基于spring框架提供的一套web应用安全性的完整解决方案 包括可高度定制的认证 授权 鉴权等一系列的流