安全框架Spring Security是什么?如何理解Spring Security的权限管理?
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
大家好我是卷心菜。本篇主要讲解Spring Security的基本介绍和架构分析如果您看完文章有所收获可以三连支持博主哦~嘻嘻。
文章目录
一、前言
🎁作者简介在校大学生一枚Java领域新星创作者Java、Python正在学习中期待和大家一起学习一起进步~
💗个人主页我是一棵卷心菜的个人主页
🔶本文专栏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 来负责的接口定义为
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 的授权体系中有两个关键接口
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 之间的关系。
感谢阅读一起进步嘻嘻~