开源工具系列8:Spring Security

Spring Security 是一套认证授权框架, 支持认证模式如 HTTP BASIC 认证头 (基于 IETF RFC-based 标准), HTTP Digest 认证头 ( IETF RFC-based 标准), Form-based authentication (用于简单的用户界面), OpenID 认证等, Spring Security使得当前系统可以快速集成这些验证机制亦或是实现自己的一套验证机制.

Spring Security 是什么

 

  • Spring Security 是一套认证授权框架, 支持认证模式如 HTTP BASIC 认证头 (基于 IETF RFC-based 标准), HTTP Digest 认证头 ( IETF RFC-based 标准), Form-based authentication (用于简单的用户界面), OpenID 认证等, Spring Security使得当前系统可以快速集成这些验证机制亦或是实现自己的一套验证机制.
  • Spring Security 是⼀个功能强大、可高度定制的身份验证和访问控制框架。它是保护基于 Spring 的应用程序的事实标准。
  • Spring Security 是⼀个面向Java应用程序框架。与所有Spring项目⼀样,Spring Security 的真正威力在于它可以轻松地扩展以满足定制需求。

权限管理

认证和授权

在Spring Security中,权限管理主要包括两个方面:认证和授权。简单来说,认证就是用户的登录认证;授权就是登录成功之后,用户可以访问资源的多少。

什么是认证和授权

权限管理

基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制 ,按照安全规则 或者 安全策略控制用户 可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限才可访问。

认证

认证 ,就是判断⼀个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令(密码),看其是否与系统中存储的该用户的用户名和口令⼀致,来判断用户身份是否正确。这就好比我们登录QQ、微信、游戏账号等等需要的账号和密码~

授权

授权 ,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限才可访问系统的资源,对于某些资源没有权限是无法访问的。这就好比学校的网站,有学生可以访问的资源,然而老师的资源学生就无法访问~

整体架构

架构设计

在 Spring Security 的架构设计中, 认证 和 授权 是分开的,但无论使用什么样的认证方式。都不会影响授权,这是两个独立的存在,这种独立带来的好处之⼀,就是可以非常方便地整合⼀些外部的方案。

1、认证

// AuthenticationManager 接口,在Spring Security中认证是由 AuthenticationManager 来负责的,接口定义为:
public interface AuthenticationManager {Authentication authenticate(Authentication var1)throws AuthenticationException;
}
// 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;
}

方法介绍:

  • getAuthorities 获取用户权限信息
  • getCredentials 获取用户凭证信息,⼀般指密码
  • getDetails 获取用户详细信息
  • getPrincipal 获取用户身份信息,用户名、用户对象等
  • isAuthenticated 用户是否认证成功
// SecurityContextHolder 类,SecurityContextHolder 用来获取登录之后用户信息。定义如下(省略了一些属性和方法):
public class SecurityContextHolder {public static void clearContext() {strategy.clearContext();}public static SecurityContext getContext() {return strategy.getContext();}public static int getInitializeCount() {return initializeCount;}public static void setContext(SecurityContext context) {strategy.setContext(context);}public static void setStrategyName(String strategyName) {strategyName = strategyName;initialize();}public static SecurityContextHolderStrategy getContextHolderStrategy() {return strategy;}public static SecurityContext createEmptyContext() {return strategy.createEmptyContext();}public String toString() {return "SecurityContextHolder[strategy='" + strategyName + "'; initializeCount=" + initializeCount + "]";}
}
  • Spring Security 会将登录用户数据保存在 Session 中。但是,为了使用方便,Spring Security在此基础上还做了一些改进,其中最主要的⼀个变化就是线程绑定。
  • 当用户登录成功后,Spring Security 会将登录成功的用户信息保存到SecurityContextHolder 中。SecurityContextHolder 中的数据保存默认是通过ThreadLocal 来实现的,使用ThreadLocal 创建的变量只能被当前线程访问,不能被其他线程访问和修改,也就是用户数据和请求线程绑定在⼀起。
  • 当登录请求处理完毕后,Spring Security 会将 SecurityContextHolder 中的数据拿出来保存到 Session 中,同时将 SecurityContexHolder 中的数据清空。以后每当有请求到来时,Spring Security 就会先从 Session 中取出用户登录数据,保存到 SecurityContextHolder 中,方便在该请求的后续处理过程中使用,同时在请求结束时将 SecurityContextHolder 中的数据拿出来保存到 Session 中,然后将SecurityContextHolder 中的数据清空。
  • 这⼀策略非常方便用户在 Controller、Service 层以及任何代码中获取当前登录用户数据。

注意

注意:当返回Authentication 时,表示认证成功;当返回AuthenticationException异常时,表示认证失败。

AuthenticationManager 主要实现类为 ProviderManager,在 ProviderManager 中管理了众多AuthenticationProvider实例。在⼀次完整的认证流程中,Spring Security允许存在多个

AuthenticationProvider ,用来实现多种认证方式,这些 AuthenticationProvider 都是由 ProviderManager 进行统⼀管理的。

2、授权

在 Spring Security 的授权体系中,有两个关键接口:AccessDecisionManager和AccessDecisionVoter。

// 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);
}

注意

注意:需要注意的是:AccessDecisionManager中会挨个遍历 AccessDecisionVoter,进而决定是否允许用户访问。

// ConfigAttribute,用来保存授权时的角色信息。接口定义如下:
public interface ConfigAttribute extends Serializable {String getAttribute();
}

在 Spring Security 中,用户请求⼀个资源需要的角色会被封装成一个 ConfigAttribute 对象。

在 ConfigAttribute 中只有⼀个 getAttribute方法,该方法返回⼀个 String 字符串,就是角色的名称。

⼀般来说,角色名称都带有⼀个 ROLE_ 前缀,投票器AccessDecisionVoter 所做的事情,其实就是比较用户所具各的角色和请求某个资源所需的 ConfigAtuibute 之间的关系。

项目使用

Spring Security

其实在 Spring Boot 出现之前,Spring Security 就已经诞生多年了。

但 Spring Security 的发展一直都不是很顺利,主要问题在于应用程序中集成和配置 Spring Security 框架的过程比较复杂。

但是随着 Spring Boot 的兴起,基于 Spring Boot 所提供的针对 Spring Security 的自动配置方案,开发人员可以零配置使用 Spring Security。

如果想要在 Spring Boot 应用程序中使用 Spring Security,只需要在 Maven 工程的 pom 文件中添加如下依赖:

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

小结

总之,Spring Security 框架,基于日常开发,框架具备的功能体系完全满足各项安全需求。

不同的功能对应不同的应用场景,在普通的单体应用、微服务架构、响应式系统中都可以使用 Spring Security 框架提供的各种功能确保系统的安全性。

项目信息

Github 项目地址:

https://github.com/spring-projects/spring-security

Spring Security 官方文档:https://spring.io/projects/spring-security

关于HummerRisk

HummerRisk 是开源的云原生安全平台,以非侵入的方式解决云原生的安全和治理问题,核心能力包括混合云的安全治理和K8S容器云安全检测。

 

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

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

相关文章

创建四大经济区shp矢量图

准备 1、具有省域划分的shp矢量图 2、Arcgis 一、创建新要素 右击目录-新建-要素文件 选择要素开始编辑 矩形框选需要的行政边界要素点—右击要素线复制—粘贴至新要素文件中 &#xff08;长按shift键&#xff0c;多点选择&#xff09; 结果图&#xff08;部分&#xff0…

【数据结构】顺序表

目录 &#x1f4d6;线性表&#x1f4d6;顺序表&#x1f4d6;动态顺序表&#x1f516;结构&#x1f516;初始化&#x1f516;销毁&#x1f516;尾插&#x1f516;扩容&#x1f516;尾删&#x1f516;头插&#x1f516;头删&#x1f516;在pos位置插入&#x1f516;删除pos位置元…

CC2530 外部中断配置步骤

第一章 硬件原理图分析 第二章 配置按键中断步骤

微信小程序页面导航

1.声明式导航 1.1声明式跳转Tab页面 1.1.1配置的Tab页面 1.1.2页面跳转书写 <navigator url"/pages/home/home" open-type"switchTab">跳转首页</navigator> 1.2.3页面展示 1.2声明式跳转到非Tab页面 1.2.1页面跳转代码 <navigator ur…

Nexus如何导入jar以及批量导入Maven的本地库目录

前言 本篇基于 Nexus 的版本是 nexus-3.55.0-01本方法适用Linux和WindowsWindows 需要安装Git , 使用Git Bash执行 Nexus上传依赖包的方式 上传依赖包到Nexus 服务器的方式有多种&#xff0c; 包含&#xff1a; 单个jar上传&#xff1a; 在Nexus管理台页面上传单个jar源码编…

大势智慧软硬件技术答疑第四期

1.重建大师是否支持bigmap绘制的范围线&#xff1f; 答&#xff1a;目前重建大师仅支持面格式的&#xff0c;bigmap的还没试验过&#xff0c;globalmapper或者arcgis是可以的。 2.为什么6.1建模的时候引擎一直是等待呢&#xff1f; 答&#xff1a;检查一下引擎面板引擎监控目录…

如何看待低级爬虫与高级爬虫?

爬虫之所以分为高级和低级&#xff0c;主要是基于其功能、复杂性和灵活性的差异。根据我总结大概有下面几点原因&#xff1a; 功能和复杂性&#xff1a;高级爬虫通常提供更多功能和扩展性&#xff0c;包括处理复杂页面结构、模拟用户操作、解析和清洗数据等。它们解决了开发者…

【STM32】keil MDK-Arm 5.38 功能详解

一、基本概念二、软件安装三、软件介绍3.1 Intro3.2 keil菜单栏3.21 file选项3.22 Edit 选项3.23 View选项3.24 Project选项3.25 Flash选项3.26 Debug选项3.27 Peripherals选项3.28 Tools选项3.29 SVCS选项3.2.10 Window选项3.2.11 Help选项 3.3 keil工具栏 四、设置与项目设置…

LITE TRANSFORMER WITH LONG-SHORT RANGE ATTENTION

1.摘要 在这篇论文中&#xff0c;我们提出了一种高效的移动NLP架构——Lite Transformer&#xff0c;以在边缘设备上部署移动NLP应用。Transformer已经成为自然语言处理&#xff08;例如机器翻译、问答系统&#xff09;中无处不在的技术&#xff0c;但要实现高性能需要大量计算…

numpy反向传播算法示例

numpy反向传播算法示例 数据 通过 scikit-learn 库提供的便捷工具生成 2000 个线性不可分的 2 分类数据集 按着7: 3比例切分训练集和测试集 backpropagation.py #!/usr/bin/env python # encoding: utf-8 """ desc: 反向传播算法 """impor…

树莓派 Raspberry Pi Zero 2W 安装默认系统时 ssh 登录并开启摄像头推流一段时间B

Raspberry Pi Zero 2W有点鸡肋&#xff0c;hdmi口用的microhdmi口&#xff0c;不是树莓派4b的minihdmi口&#xff0c;然后zero 2W也没有usb接口&#xff0c;有一个microusb安卓的otg接口&#xff0c;很烦&#xff0c;还好有wifi蓝牙模块&#xff0c;这样子还能ssh&#xff0c;不…

ASP.NET Core MVC 从入门到精通之缓存

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…