Spring Security(一)架构概览

一、 Spring Security 架构概览

1. Spring Security 简介

在Java企业级开发中,安全管理方面的框架非常少,一般来说,主要是三种方案:

  • Shiro
  • Spring Security
  • 开发者自己实现

Spring Security基于Spring框架,提供了一套Web应用安全性的完整解决方案。一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。

2. Spring Security 核心功能

1)用户认证 (Authentication)

用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。

Spring Security集成的主流认证机制包括:

  • 表单认证
  • OAuth2.0
  • CAS认证
  • RememberMe自动认证
2)**用户授权 (Authorization) **

用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

3)其他

Spring Security 还提供了很多按钮全管理的“周边功能”,例如,CSRF攻击、会话固定攻击等,同时Spring Security 还提供了 HTTP 防火墙来拦截大量的非法请求。

3. Spring Security 整体框架

1)认证

在 Spring Security 中,用户的认证信息主要由 Authentication 的实现类来保存,Authentication 接口定义如下:

public interface Authentication extends Principal, Serializable {// 用来获取用户的权限Collection<? extends GrantedAuthority> getAuthorities();// 用来获取用户凭证,一般来说就是密码Object getCredentials();// 用来获取用户携带的详细信息,可能是当前请求之类等Object getDetails();// 有用来获取当前用户,例如一个用户名或者一个用户对象Object getPrincipal();// 当前用户是否认证成功boolean isAuthenticated();void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}

当用户使用用户名/密码登录或者使用 Remember-me 登录时,都会对应一个不同的 Authentication 实例。

Spring Security 中的认证工作主要是由 AuthenticationManager接口来负责:

public interface AuthenticationManager {/** AuthenticationManager 只有一个 authenticate 方法可以用来做认证,该方法有三个不同的返回值:*   1. 返回 Authentication,表示认证成功*   2. 抛出 AuthenticationException 异常,表示用户输入了无效的凭证。*   3. 返回null,表示不能断定。*/  Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

在介绍了 AuthenticationManager 之后,我们介绍 AuthenticationManager 的主要实现类 ProviderManager,ProviderManager 管理了众多的 AuthenticationProvider 实例。

public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {private List<AuthenticationProvider> providers;public ProviderManager(AuthenticationProvider... providers) {this(Arrays.asList(providers), (AuthenticationManager)null);}public ProviderManager(List<AuthenticationProvider> providers, AuthenticationManager parent) {this.eventPublisher = new NullEventPublisher();this.providers = Collections.emptyList();this.messages = SpringSecurityMessageSource.getAccessor();this.eraseCredentialsAfterAuthentication = true;Assert.notNull(providers, "providers list cannot be null");this.providers = providers;this.parent = parent;this.checkState();}
}
public interface AuthenticationProvider {Authentication authenticate(Authentication authentication) throws AuthenticationException;// supports 方法用来判断是否支持给定的 Authentication 类型boolean supports(Class<?> authentication);
}

由于 Authentication 拥有众多的实现类,这些不同的实现类又有不同的 AuthenticationProvider 来处理,所以 AuthenticationProvider 会有一个 supports 方法来判断当前的 AuthenticationProvider 是否支持对应的 Authentication。

再一次完整的认证过程中,可能会存在多个 AuthenticationProvider (比如一个项目同时存在form表单登录和短信验证码登录),多个AuthenticationProvider 统一由 ProviderManager 来管理。如果所有的 AuthenticationProvider 都认证失败了,那么就会电泳 parent 进行认证,相当于是一个备用认证方式。

2)授权

在 Sping Security 的授权体系中,有两个关键接口:

  • AccessDecisionManager

    它是一个决策器,来决定此次访问是否被允许。

  • AccessDecisionVoter

    它是一个投票器,投票器会检查用户是否具备应有的角色,进而投出赞成、反对或弃权。

它们都有众多的实现类,在 AccessDecisionManager 会挨个访问 AccessDecisionVoter,进而决定是否允许用户访问,因此,AccessDecisionVoter 和 AccessDecisionManager 的关系似于 AuthenticationProvider 和 ProviderManager 之间的关系。

3)Web安全

在 Spring Security 中,认证和授权都是基于过滤器来完成的。这些过滤器按照既定的优先级排列,最终形成一个过滤器链。开发者也可以通过自定义过滤器,并通过@Order注解来调整自定义过滤器在过滤器链中的位置,并通过FiliterChainProxy来统一管理。Spring Security 中的过滤器链通过FiliterChainProxy 嵌入到 Web 项目的原生过滤器链中。

4) 登录数据保护

当用户登录成功后,Spring Security会将登录成功的用户信息保存到 SecurityContextHolder 中。存入其中的数据默认通过ThreadLocal 来实现的。用户数据是和当前请求线程绑定在一起的。当登录请求处理完毕后, Spring Security 会将 SecurityContextHolder 中的数据拿出来保存到Session 中, 同时,将 SecurityContextHolder 中的数据清空。

《深入浅出 Spring Security》 王松 著

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java常用注解

文章目录 第一章、Java注解与元数据1.1&#xff09;元数据与注解概念介绍1.2&#xff09;Java注解的作用和使用1.3&#xff09;注解的分类 第二章、Mybatis框架常用注解2.1&#xff09;Mybatis注解概览2.2&#xff09;常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…

学习openAI 短长期AGI计划、使命、宪章、开创性研究、产品、工作待遇等

网站的设计&#xff1a;简洁而现代 主页 使命&#xff1a;Creating safe AGI that benefits all of humanity. &#xff08;比人类更聪明的人工智能系统&#xff09;&#xff08;自己实现或帮别人实现都认为是达成使命&#xff09;&#xff08;造福全人类&#xff1a;最大限…

springboot笔记

1、springboot中的缓存标签Cacheable使用场景 Cacheable 只是为了让你省略掉是使用集合来保存缓存数据的代码&#xff0c;给你的业务代码横切入缓存的逻辑.然后使用缓存的场景就是读多写少的场景&#xff0c;读操作特别频繁的话&#xff0c;还是把热点数据缓存起来&#xff0c…

36V/48V转12V 10A直流降压DC-DC芯片-AH1007

AH1007是一款36V/48V转12V 10A直流降压&#xff08;DC-DC&#xff09;芯片&#xff0c;它是一种高性能的降压变换器&#xff0c;常用于工业、汽车和电子设备等领域。 AH1007采用了先进的PWM调制技术和开关电源控制算法&#xff0c;能够高效地将输入电压从36V/48V降低到12V&…

MATLAB实现图像变换和滤波

MATLAB实现图像变换和滤波方法对具有不同特征的灰度图像进行处理 图像变换方法包括&#xff1a;DFT及IDFT&#xff0c;DCT及IDCT 图像滤波方法包括低通滤波和高通滤波 图像变换 DFT/IDFT 图像一般是二维的&#xff0c;根据二维离散傅里叶变换公式DFT&#xff0c;可以将图片…

如何使用Docker将.Net6项目部署到Linux服务器(一)

目录 配置服务器环境 配置yum 配置docker 安装.NetCore SDK6.0 发布Net6 添加Dockerfile。 发布文件。 编辑DockerFile文件 ​编辑 上传文件 安装MySql 配置服务器环境 配置yum 在配置yum之前&#xff0c;我们需要先了解yum是什么&#xff0c;yum&#xff0c;是Yellow…

力扣日记12.13-【二叉树篇】从中序与后序遍历序列构造二叉树

力扣日记&#xff1a;【二叉树篇】从中序与后序遍历序列构造二叉树 日期&#xff1a;2023.12.13 参考&#xff1a;代码随想录、力扣 106. 从中序与后序遍历序列构造二叉树 题目描述 难度&#xff1a;中等 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二…

基于vue实现的疫情数据可视化分析及预测系统-计算机毕业设计推荐 django

本疫情数据可视化分析及预测系统 开发&#xff0c;用小巧灵活的MySQL数据库做完后台存储解释。本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;全国实时数据管理&#xff0c;每日实时数据管理&#xff0c;国内实时动态…

@Scheduled任务调度/定时任务-非分布式

1、功能概述 任务调度就是在规定的时间内执行的任务或者按照固定的频率执行的任务。是非常常见的功能之一。常见的有JDK原生的Timer, ScheduledThreadPoolExecutor以及springboot提供的Schduled。分布式调度框架如QuartZ、Elasticjob、XXL-JOB、SchedulerX、PowerJob等。 本文…

SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析

. # &#x1f4d1;前言 本文主要是SpringBoot进行自然语言处理&#xff0c;利用Hanlp进行文本情感分析&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及&#xff0c;医疗行业的各个场景都要求支持医保码一码通办&#xff0c;在此分享一下&#xff0c;在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

EasyRecovery2024功能强大且专业的mac电脑数据恢复程序

EasyRecovery15是一款功能强大且专业的IOS数据恢复程序&#xff0c;专为在iPhone&#xff0c;iPad和iPod touch上检索丢失的照片&#xff0c;消息&#xff0c;音乐等而设计。无论您是错误删除还是意外丢失了对您来说重要的任何内容&#xff0c;EasyRecovery都会帮助您找回它们。…

群晖(Synology)新建存储池使用 Home 服务

每一个用户都可以有一个自己的 Home 服务。 这个在群晖存储新建存储池后可以自动启用这个服务。 启用后&#xff0c;可以看到你的文件系统中有一个 homes 的文件了。 群晖&#xff08;Synology&#xff09;新建存储池使用 Home 服务 - 系统容器 - iSharkFly每一个用户都可以有…

编码遗传学:JavaScript 继承之道

引入 JavaScript中的继承问题是一个很重要的知识点&#xff0c;很多面试都会问到。本文主要来详细地讲解JavaScript实现继承的不同方法。其中包括原型链继承、构造函数基础、组合式继承以及寄生组合式继承等ES5的实现方式&#xff0c;也会介绍ES6新出现的class继承。 原型链继…

flutter调试器查看不了副页面(非主页面/子页面)

刚接触flutter&#xff0c;写了两个页面&#xff0c;通过按钮&#xff0c;可以从主页面跳转到副页面&#xff0c;副页面我自己写的一个独立的dart文件&#xff0c;在主页面的代码中导入使用。但是当我运行代码后&#xff0c;点击跳转的时候&#xff0c;却发现查看不到对应的副页…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

深度学习踩坑记录

深度学习踩坑记录 在跑一个深度学习的项目的时候&#xff0c;为了计算每个epoch的Loss&#xff0c;肯定要把每个batch_size的loss给加起来&#xff0c;就会有类似如下的代码 train_loss loss是的当时手抖&#xff0c;忘了是loss.item()&#xff0c;代码也能正常运行&#xf…

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖&#xff0c;没有需安装 rpm -q…

Android Studio的代码笔记--Adapter+GridView学习

AdapterGridView学习 AdapterGridViewSimpleAdapterGridViewactivity_main.xmlappicon.xmlMainActivity 自定义BaseAdapterGridView已下载应用PackageInfoAppAdapterMainActivity2 其他获取已下载应用信息函数获取所有应用信息函数ImageView产生圆角的方法背景设置很渐变设置选…

物联网架构之 Hadoop

修改/etc/hosts文件 192.168.107.197 node1 192.168.107.196 node2 192.168.107.195 node3 创建用户并加入组 groupadd hadoop useradd -g hadoop hduser passwd hduser vim /etc/sudoers hduser ALL(ALL) ALL 安装JDK rpm -ivh jdk-8u171-linux-x64.rpm vim /etc/profile e…