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.mfbz.cn/a/242633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用的建表但范式、反规范化

规范化&#xff1a; 规范化是用于数据库设计的一系列原理和技术&#xff0c;它可以减少表中数据的冗余&#xff0c;增加数据完整性和一致性。通常有很多范式。 第一范式&#xff08;1NF&#xff09;&#xff1a; 常用的三种范式&#xff1a; 表中的字段都是不可再分割的原子属…

Linux---切换目录命令

1. 切换目录命令的使用 命令说明cd 目录切换到指定目录cd ~切换到当前用户的主目录cd ..切换到上一级目录cd .切换到当前目录cd -切换到上一次目录 注意: cd命令切换目录时&#xff0c;这个目录必须存在。cd 后面不写目录等价于cd ~ cd 目录效果图: cd ~效果图: cd ..效果图…

git 实用命令杂记

使用解决冲突的方式合并&#xff0c;将避免简单的自动合并 git merge origin/dev --strategyresolve清理本地已经合并到 dev 的分支 git branch --merged | grep -v dev | xargs -n 1 git branch -d分支清理 Git 之删除本地无用分支_dearfulan 的博客 - CSDN 博客_git 删除本…

同义词替换论文降重工具 快码论文

大家好&#xff0c;今天来聊聊同义词替换论文降重工具&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;同义词替换论文降重工具&#xff1a;原理、应用与优势 一、引言 在学术研究中&am…

数据入表 | 详解数据资产会计核算与企业应对

从2015年《促进大数据发展行动纲要》到2022年《数据20条》到2023年8月份出台了《企业数据资源相关会计处理暂行规定》&#xff0c;可见国家层面对数据的重视和探索如何进一步挖掘数据价值&#xff0c;发挥数据的应用潜力。一石激起千层浪&#xff0c;面对如此重要的规定&#x…

高通平台开发系列讲解(外设篇)高通平台EMMC适配说明

文章目录 一、EMMC的内部框图说明二、EMMC 设备树配置三、EMMC 内核配置四、EMMC 源码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台 EMMC适配说明。 eMMC(嵌入式多媒体卡)是一种集成了闪存存储器和控制器的存储芯片,通常用于嵌入式设备中,…

WPF-一个简单登录界面

一个简单登录界面 文章目录 一个简单登录界面一、效果展示二、准备代码 一、效果展示 二、准备代码 创建一个WPF工程&#xff0c;创建名为 Login5 的WPF项目。 添加Nuget包 MaterialDesignThemes 界面的整体布局和样式代码 <Window x:Class"Login5.MainWindow&quo…

01详解Gateway服务网关的功能,实现,分类.工作流程

Gateway服务网关 网关功能 Gateway网关是是所有微服务的统一入口, 网关的核心功能特性主要体现在请求路由,权限控制,限流三部分 路由: 由于网关不能处理业务,所以网关需要根据某种规则(断言)把请求转发给匹配的主机或者接口上,这个转发的过程就叫做路由负载均衡: 当路由的目…

听觉动态范围是什么?

什么是动态范围&#xff0c;它如何影响您的听力&#xff1f; 简单地说&#xff0c;动态范围就是您可用的听力范围。它是从你能听到的最柔和的声音&#xff08;你的听力阈值&#xff09;到声音非常响亮的地方&#xff08;不舒服的响度水平&#xff09;的分贝&#xff08;dB&…

Web前端 ---- 【Vue】Vue路由传参(query和params)

目录 前言 为什么用路由 路由route和路由器router Vue中路由的工作原理 安装配置vue-router 使用VueRouter 多级路由 路由传参 query传参 params传参 前言 本文介绍路由相关知识路由传参 为什么用路由 为了单页面应用开发&#xff0c;只更换组件&#xff0c;不频繁刷…

Postman接口测试工具使用

一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致&#xff0c;任何一方的进度跟不上&#xff0c;都无法及…

跨境电商如何利用跨境客服软件提升销售额

随着全球化的推进&#xff0c;跨境电商成为了许多企业拓展市场的重要途径。然而&#xff0c;跨境电商面临着语言、文化、时差等多种挑战&#xff0c;为了提供更好的客户服务并提升销售额&#xff0c;跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标&#xff1a; 学习目录&#xff1a; 学习时间&#xff1a; 学习内容&#xff1a; 什么是 AJAX&#xff1f; 怎么用 AJAX &#xff1f; 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios&#xff0d;查询参数 常用请求方法和数据提…

数据库 02-03 补充 SQL的子查询(where,from),子查询作为集合来比较some,exists,all(某一个,存在,所有)

子查询&#xff1a; where字句的子查询&#xff1a; 通常用in关键字&#xff1a; 举个例子&#xff1a; in关键字&#xff1a; not in 关键字&#xff1a; in 也可以用于枚举集合&#xff1a; where中可以用子查询来作为集合来筛选元祖。 some&#xff0c;all的运算符号…

C语言:指向数组的指针和指向数组元素的指针

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆&#xff0c;或者笼统地被称为数组指针&#xff0c;但它们之间是有差别的&#xff0c;本文就将对此进行讨论。 下面的代码…

<VR串流线方案> PICO 4 Pro VR串流线方案 Oculus Quest2 Link串流线方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…

Postman-脚本自动化及定时执行脚本(7)

一.postman脚本自动化&#xff08;从postman至Newman可以一键执行脚本并生成报告&#xff1a;&#xff09; Postman Newman 是一个 CLI&#xff08;命令行界面&#xff09;工具&#xff0c;可以使用它来运行 Postman 中的集合&#xff08;Collection&#xff09;和环境&#xf…

052:vue重新发布,软件热更新方面的一点经验示例

第052个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

C语言之动态内存管理

一、引言 当我们写了一段程序&#xff0c;创建了一个变量或者一个数组&#xff0c;这些操作都需要在内存中开辟出一块空间。但是我们过去的这些操作有一定的局限性&#xff1a;开辟的空间大小是固定的&#xff0c;并且数组在申明的时候&#xff0c;必须指定数组的长度&#xf…

DeepMind的最新研究:人类最后的自留地失守了?

AI对人类世界的学习能力&#xff0c;到目前为止仍然停留在语言层面。 喂给大模型语料——最初是维基百科和Reddit&#xff0c;后来扩展到音频、视觉图像甚至雷达和热图像——后者广义上说是换了种表达方式的语言。也因此有生成式AI的创业者认为&#xff0c;一个极度聪明的大语…
最新文章