开发者社区> 我是一棵卷心菜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 学习笔记
+关注继续查看

大家好,我是卷心菜。本篇主要讲解Spring Security的基本介绍和架构分析,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。


一、前言

🎁作者简介:在校大学生一枚,Java领域新星创作者,Java、Python正在学习中,期待和大家一起学习一起进步~
💗个人主页:我是一棵卷心菜的个人主页
🔶本文专栏:Spring Security知识学习
📕自我提醒:多学多练多思考,编程能力才能节节高!

二、Spring Security简介

在这里插入图片描述

  • 官方文档: https://spring.io/projects/spring-security
  • Spring Security是⼀个功能强大、可高度定制的身份验证访问控制框架。它是保护基于Spring的应用程序的事实标准。
  • Spring Security是⼀个面向Java应用程序框架。与所有Spring项目⼀样,Spring Security的真正威力在于它可以轻松地扩展以满足定制需求。

三、权限管理

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

1、什么是权限管理

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

2、什么是认证

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

3、什么是授权

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

四、整体架构

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

核心类:
在这里插入图片描述

1、认证

  • AuthenticationManager 接口,在Spring Security中认证是由 AuthenticationManager 来负责的,接口定义为:
public interface AuthenticationManager {
    Authentication authenticate(Authentication var1) 
                throws AuthenticationException;
}

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

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

在这里插入图片描述


  • 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 层以及任何代码中获取当前登录用户数据。

2、授权

  • 在 Spring Security 的授权体系中,有两个关键接口:AccessDecisionManagerAccessDecisionVoter
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 OAuth 实现 GitHub 快捷登录
Spring Security 5中集成了OAuth的客户端模块,该模块包含以下三个子模块
41 0
从一手资料学习--Spring Security与OAuth(一)
不知道大家对于上面的几个问题被问及的时候会心里发慌。强哥发现,大多数小伙伴对于一些工作中使用较少的知识,或者说是平常都在用,但是不需要自己去实现的知识,主动学习的积极性都比较低。
74 0
从一手资料学习--Spring Security与OAuth(二)
上回我们聊到,既然Spring官网也有提到,要学习Spring Security OAuth相关的知识,最好先学习OAuth2.0相关的知识,而官网中OAuth 2.0 Framework的链接地址对应的就是rfc6749的文档,结构是这样的
72 0
再见,Spring Security OAuth!!
本次将 《Spring Authorization Server》项目正式上线,去掉了之前的体验状态,此举恰逢 0.2.0 版本发布,这也是第一个正式支持的生产就绪版本。
91 0
从零开始的Spring Security Oauth2(三)
从零开始的Spring Security Oauth2(三)
126 0
从零开始的Spring Security Oauth2(一)
从零开始的Spring Security Oauth2(一)
1403 0
Spring Security OAuth 2开发者指南译
Spring Security OAuth 2开发者指南译 介绍 这是用户指南的支持OAuth 2.0。对于OAuth 1.0,一切都是不同的,所以看到它的用户指南。
1572 0
spring security oauth2
https://connect.qq.com/manage.html#/   Spring Boot Oauth2 with H2 databasehttps://github.com/rajithd/spring-boot-oauth2使用oauth2.
2913 0
Spring boot 通用配置文件模板
001 # =================================================================== 002 # COMMON SPRING BOOT PROPERTIES 003 # 004 # This sample file is provided as a guideline.
1612 0
+关注
我是一棵卷心菜
大二学生,一起加油。
70
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载