如何理解Spring Security的权限管理和安全框架?

浅析安全框架-Shiro和Spring Security 阅读详情

一、前言

二、Spring Security简介

  • Spring Security是⼀个功能强大、可高度定制的 身份验证 和 访问控制 框架。它是保护基于Spring的应用程序的事实标准。

  • Spring Security是⼀个面向Java应用程序框架。与所有Spring项目⼀样,Spring Security的真正威力在于它可以轻松地扩展以满足定制需求。

三、权限管理

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

1、什么是权限管理

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

2、什么是认证

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

3、什么是授权

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

四、整体架构

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

核心类:

1、认证

  • AuthenticationManager 接口,在Spring Security中认证是由 AuthenticationManager 来负责的,接口定义为:
<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public interface AuthenticationManager {
    Authentication authenticate(Authentication var1) 
                throws AuthenticationException;
}

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

AuthenticationManager 主要实现类为 ProviderManager,在 ProviderManager 中管理了众多AuthenticationProvider实例。在⼀次完整的认证流程中,Spring Security允许存在多个 AuthenticationProvider ,用来实现多种认证方式,这些 AuthenticationProvider 都是由 ProviderManager 进行统⼀管理的。

  • Authentication 接口,认证以及认证成功的信息主要是由 Authentication 的实现类进行保存的,接口定义如下:
<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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 用来获取登录之后用户信息。定义如下(省略了一些属性和方法):

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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 层以及任何代码中获取当前登录用户数据。

2、授权

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

AccessDecisionManager (访问决策管理器),用来决定此次访问是否被允许。接口定义如下:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public interface AccessDecisionManager {
    void decide(Authentication var1, Object var2, Collection<ConfigAttribute> var3) throws AccessDeniedException, InsufficientAuthenticationException;
    boolean supports(ConfigAttribute var1);
    boolean supports(Class<?> var1);
}

AccessDecisionVoter (访问决定投票器),投票器会检查⽤户是否具备应有的角色,进而投出赞成、反对或者弃权票。接口定义如下:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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,用来保存授权时的角色信息。接口定义如下:

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public interface ConfigAttribute extends Serializable {
    String getAttribute();
}
<pre class="hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">ROLE_ 

感谢阅读,一起进步,嘻嘻~

Spring boot+Spring Security 4配置整合实例 本例所覆盖的内容: 1. 使用Spring Security管理用户身份认证、登录退出 2. 用户密码加密及验证 3. 采用数据库的方式实现Spring Security的remember-me功能 4. 获取登录用户信息。 5.使用Spring Security管理url和权限   本例所使用的框架: 1. Spring boot 2. Spring MVC 3. Sprin 阅读详情

相关推荐

Spring Security-全面详解(学习总结---从入门到深化)

虽然Spring Security给我们提供了登录页面,但在实际项目中,更 多的是使用自己的登录页面。Spring Security也支持用户自定义登 录页面。用法如下:1、编写登录页面2、在Spring Security配置类自定义登录页面//Spring Security配置@Override// 自定义表单登录.loginPage("/login.html") //自定义登录页面.usernameParameter("username")// 表单中的用户名项。

2473

安全框架Spring Security是什么?如何理解Spring Security的权限管理?

Spring Security是⼀个功能强大、可高度定制的身份验证和访问控制框架。从这一篇文章开始学习Spring Security吧~

知识记录 8029

从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1

用AN9238采集信号的方法(1),包含PLL、FIFO、ILA的基础教程。

WZT725的博客 3092

Spring Security 基本介绍及基础项目搭建

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方 案。正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控 制),一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权 (Authorization)两个部分,这两点也是 Spring Security 重要核心功能。

一个菜鸡的博客 2万+

【CTFWP】ctfshow-web40

CTFWP:ctfshow-web40

LongL_GuYu的博客 1861

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

Spring Security详解

AuthenticationManager进行认证时,将该认证管理器中的所有认证提供器遍历一遍,遍历过程中,首先检测认证提供器是否支持认证的票据类型,如果支持,则认证提供器开始进行认证。用于处理基于表单的登录请求,从表单中获取用户名和密码,默认情况下处理来自/login的请求,从表单中获取用户名和密码, 默认使用表单name值为username和password,这两个值可以通过这个过滤器的usernaemparamter个passwordParameter连个参数的值进行修改。

JAVA_KX的博客 3万+

Tauri开发环境配置避坑指南:从Rust到Node.js的全流程实战

本文是一份详尽的Tauri开发环境配置实战指南,重点解析了从Rust工具链安装、Node.js版本管理到IDE配置的全流程。文章深入探讨了包管理器选择、依赖锁定、网络镜像加速等关键环节,并提供了开发与构建过程中典型问题的排查思路与解决方案,旨在帮助开发者高效避坑,顺利搭建跨平台桌面应用开发环境。

w3x4y的博客 292

Spring Security详细介绍使用

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。正如你可能知道的关于安全方面的两个核心功能是“

书启鸿蒙知秋枫 5513

【007】C++编程必知:原码、补码、反码的全面解读

计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。

Lion_Long的博客 2917

【视频】GStreamer+WebRTC(九):使用NVIDIA硬编解码

2)下载 GStreamer-bad 插件包源码注意要下载和 GStreamer版本对应的插件包3)下载NVIDIA硬编解码SDK最新的SDK下载地址注意 GStreamer 1.24.2 中调用的 NVIDIA Video_Codec_SDK 不是最新的,先使用下面的方法,查看gst-plugins-bad-1.24.2.tar.xz 对应的NVIDIA Video_Codec_SDK 的版本是多少。

郭老二 260

security安全框架,用户登录安全认证与退出

一、创建用户表及实体类 二、编写security配置文件 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance...

diaona1404的博客 508

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4517

SpringSecurity(一)基础知识

本文主要是介绍权限管理中认证与授权的概念、权限管理框架有哪些、简单介绍,不涉及原理详细讲解,通过一个入门案例来引入SpringBoot中怎么使用。本文和接下来的几篇文章不涉及原理详细讲解,都是在讲解怎么去使用它,然后会有一篇讲解认证与授权的源码文章,最后会有一个完整的用户认证与授权的代码编写。是一个提供身份验证、授权和防止常见攻击的框架。用户认证和用户授权是重要核心功能。官方文档:spring-security6.X中文官网spring-security5.X中文网址。

2401_87705025的博客 832

JAVA:Spring Boot 集成 Atomikos 实现分布式事务

摘要: Atomikos是一款基于JTA标准的分布式事务协调器,通过两阶段提交(2PC)协议实现跨数据库/消息系统的事务一致性,适用于金融等高要求场景。本文以Spring Boot集成Atomikos为例,演示多数据源(订单库、库存库)的分布式事务管理。核心步骤包括:引入Atomikos依赖、配置XA数据源、设置两阶段提交的MyBatis多数据源,并通过Atomikos协调全局事务,确保跨库操作原子性。代码示例涵盖配置类、YAML定义及MySQL XA数据源初始化,为分布式系统提供强一致性解决方案。

木头 334

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java编程代码题库及答案,分享PDF高清版

Spring Security观后感——手绘思维脑(供参考) 手绘的思维导图,是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的,相当于是一个知识的总结与梳理,我将其分为“核心组件”与“工作原理/认证流程”。 Spring Security王者晋级文档-Spring Security 4.2内部资料 Spring Security 4.2内部资料——主要专注于企业级 Java 安全的研究,尤其是 Spring Security。因此,我们的一切内容会以 Ja

m0_57768035的博客 477

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

shiro 数据权限_开源权限框架Shiro架构及设计原理介绍

权限框架在Shiro之前,权限框架有JAAS和Spring Security,但是它们在Shiro面前都不够强大和灵活。Shiro的前身是J-security,后来更名为Shiro。Apache Shiro 是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实...

weixin_39834788的博客 364

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第7章Spring Boot整合安全管理

7.1 使用Shiro安全管理 Shiro是由Apache开源的一款强大的安全框架,本节从了解Shiro框架开始,带领大家学习Spring Boot如何使用Shiro进行身份认证和权限认证。 7.1.1 什么是Shiro Apache Shiro(官网地址:http://shiro.apache.org/)是一个功能强大且易于使用的Java安全框架,可以利用它进行身份验证、授权、加密和会话管理。通过使用Shiro易于理解的API文档,可以轻松地构建任何应用程序。 如Apache Shiro官网所说,Apac

weixin_44195615的博客 431

13.Spring security权限管理

文章目录*权限管理**13.1什么是权限管理**13.2Spring security权限管理策略**13.3核心概念**13.3.1角色与权限**13.3.2角色继承**13.3.3两种处理器**13.3.4前置处理器**投票器**决策器**13.3.5后置处理器**13.3.6权限元数据**`ConfigAttribute`**`SecurityMetadataSource`**13.3.7权限表达式**`SecurityExpressionRoot`**`WebSecurityExpressionRo

EdSheeran的博客 1万+

安全框架Spring Security是什么?如何理解Spring Security的权限管理?_sprinf security可以不使用权限控制吗

Spring Security是⼀个功能强大、可高度定制的身份验证和访问控制框架。它是保护基于Spring的应用程序的事实标准。Spring Security是⼀个面向Java应用程序框架。与所有Spring项目⼀样,Spring Security的真正威力在于它可以轻松地扩展以满足定制需求。基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制 ,按照安全规则 或者 安全策略控制用户 可以访问而且只能访问自己被授权的资源。

2401_89820175的博客 759

安全框架 Shiro 和 Spring Security 如何选择?

如果使用 OpenID ,你的网站地址(URI)就是你的用户名,而你的密码安全的存储在一个 OpenID 服务网站上(你可以自己建立一个 OpenID 服务网站,也可以选择一个可信任的 OpenID 服务网站来完成注册)。Shiro 主要分为两个部分就是认证和授权,在个人感觉来看就是查询数据库做相应的判断而已,Shiro只是一个框架而已,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。...

zhaohuodian的博客 380

Spring Security权限管理原理

授权是更具系统提前设置好的规则,给用户分配可以访问某一资源的权限,用户根据自己所具有的权限,去执行相应的操作,spring security提供的权限管理功能主要有两种: 基于过滤器的权限管理功能(FilterSecurityInterceptor) 基于AOP的权限管理功能(MethodSecurityInterceptor)

Littlemotor 2666

SpringBoot集成Security安全框架

SSM 集成 spring security安全框架

关鱼吃的博客 1490

【权限管理】使用spring security 实现默认登录,源码解析

【权限管理】使用spring security 实现默认登录,源码解析 其他文章可以通过菜单查看:【BookCase 菜单】 1、前言 在springboot 之前使用shiro实现权限管理的比较多,现在使用springboot 整合spring security 更方便。 2、实现 创建子项目 bookcase-auth 添加配置 <dependency> <groupId>com.github.xiaoymin</groupId> <artifac

燃尽余火的博客 2146
上一篇: spring接口多实现类,该依赖注入哪一个?
下一篇: filebeat收集java程序多行报错
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值