Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringSecurity 入门(二)

SpringSecurity 入门(二)

作者头像
是小张啊喂
发布于 2021-08-09 09:38:43
发布于 2021-08-09 09:38:43
28300
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

上一篇有点水了,这期我们直接上干货,学习认证流程。

先来考虑一下,关于SpringSecurity如何实现的安全权限管理,角色校验,来对比一下权限和角色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 验证角色 访问 "/product/add" 所应该拥有 admin 的角色
.antMatchers("/product/add").hasRole("admin");
// 访问 "/product/add" 所应该拥有 PRODUCT_ADD 的权限
.antMatchers("/product/add").hasAnyAuthority("PRODUCT_ADD")

SpringSecurity验证当前的用户是否具有这样的角色或者权限,但是这限制于当前的项目需要是前后端同时的情况,我们只需要将当前的权限设置给SpringSecurity,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 查询权限并将权限放入 security 中
 *
 * @param http
 * @throws Exception
 */
public void selectPurview(HttpSecurity http) throws Exception {
    List<Purview> purviews = purviewService.selectPurview();
    for (Purview purview : purviews) {
        http.authorizeRequests()
            // 设置权限
            .antMatchers(purview.getUrl()).hasAnyAuthority(purview.getAuthority());
    }
}

如果你想设置成角色,那就将设置权限的代码改成设置角色即可,简单的东西就不上代码了,我们还是抓紧来看下在前后端分离的情况下,怎么处理。

谁开发的,看谁的讲解,直接看 SpringSecurity官方文档第10章文档,第一眼看上去肯定是 SecurityContextHolder,这个类存储经过身份验证的人员的详细信息,讲的真的是很模糊,其实就是登录过后的人员信息。

下面就是SecurityContext,可以从中获取,SecurityContextHolder并包含Authentication当前经过身份验证的用户的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

AuthenticationManager认证管理器就很强, 可以提供用户提供的用于身份验证的凭据,也可以提供来自的当前用户SecurityContext ,已经进行过身份验证的用户,Authentication可以从SecurityContext获取。

Authentication包含:

  • principal-识别用户。使用用户名/密码进行身份验证时,通常是的一个实例UserDetails
  • credentials-通常是密码。在许多情况下,将在验证用户身份后清除此内容,以确保它不会泄漏。
  • authorities-在GrantedAuthoritys是用户被授予高级别权限。角色或范围是几个例子。

这样的话我们可以猜测一下,如果我们将登录成功的用户信息封装成toekn,当他请求接口时通过拦截器,将他的信息进行解析,再传递给 SecurityContextHolder,那是不是就完成了校验。比如这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SecurityContextHolder.getContext().setAuthentication(Authentication authentication);

值得思考的是,如何构建这样的一个Authentication authentication对象,回头再去看官方文档10.1,官方文档中提到:

创建一个新Authentication对象。Spring Security并不关心Authentication在上设置了什么类型的实现SecurityContext。在这里我们使用TestingAuthenticationToken它是因为它非常简单。更常见的生产方案是UsernamePasswordAuthenticationToken(userDetails, password, authorities)

UsernamePasswordAuthenticationToken设计用于简单呈现用户名和密码的实现。查看源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken;
public abstract class AbstractAuthenticationToken implements Authentication,CredentialsContainer;

这下就不难明白为什么UsernamePasswordAuthenticationToken可以构建出一个Authentication对象了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	private final Object principal;
	private Object credentials;

	/**
	 * This constructor should only be used by <code>AuthenticationManager</code> or
	 * <code>AuthenticationProvider</code> implementations that are satisfied with
	 * producing a trusted (i.e. {@link #isAuthenticated()} = <code>true</code>)
	 * authentication token.
	 *
	 * @param principal
	 * @param credentials
	 * @param authorities
	 */
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
                Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        this.credentials = credentials;
        super.setAuthenticated(true); // must use super, as we override
    }

那就是说实际上,我们应该使用这个构建函数去构建Authentication对象,也就是UsernamePasswordAuthenticationToken(principal, credentials, authorities)

详细解释一下这三个参数

  • principal 显然这个使用final修饰不可以修改,所以传递的值一定是在认证之后不需要修改的,例如:用户信息
  • credentials用于防止认证的信息,可以是token
  • authorities权限集合

思路好像又清晰了,认证的过程是这样的,我们进行登录认证,验证账号密码,生成TOEKN,然后解析当前的TOEKN,获取用户信息,权限集合,用于生成Authentication,放在SecurityContext中,将权限校验和验证都交由SpringSecurity管理,这个思路应该没有什么毛病了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Springboot之Security前后端分离登录
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。 Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求 官方网站:https://spring.io/projects/spring-security#learn
海加尔金鹰
2020/09/16
9.5K3
SpringSecurity 入门 (三)
SecurityVerificationConfiguration配置类也是最为核心的一个类,在其中配置了关于上面的一些信息
是小张啊喂
2021/08/09
3530
从零玩转SpringSecurity+JWT整合前后端分离
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准
杨不易呀
2022/01/19
1.6K0
从零玩转SpringSecurity+JWT整合前后端分离
权限框架 | 学会Spring Security权限框架,就是这么简单
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架(简单说是对访问权限进行控制 )。
码神联盟
2019/07/31
4.5K0
权限框架 | 学会Spring Security权限框架,就是这么简单
👍SpringSecurity单体项目最佳实践
用户7630333
2023/12/07
2880
👍SpringSecurity单体项目最佳实践
深入理解SpringSecurity中的Authentication信息与登录流程和过滤器的配置:addFilterBefore
使用SpringSecurity可以在任何地方注入Authentication进而获取到当前登录的用户信息,可谓十分强大。
烂猪皮
2023/09/04
4.3K0
深入理解SpringSecurity中的Authentication信息与登录流程和过滤器的配置:addFilterBefore
SpringSecurity入坑(五)
基于SpringSecurity做基本权限验证,在之前都写的差不多了,顺便加入了在登录时,动态验证码的验证,这些都是在SpringSecuity提供好的基础上,那如何自定义这些登录的实现,仔细看一下,不管是基于内存验证、jdbc验证...
是小张啊喂
2021/08/09
8950
【第二篇】SpringSecurity的第一次美好约会
  首先来看看在spring-security-core中的SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象。也就是当前认证的相关信息会存储在Authentication对象中。
用户4919348
2022/05/10
3190
【第二篇】SpringSecurity的第一次美好约会
一文理清SpringSecurity中基于用于名密码的登录认证流程
SpringSecurity作为一个出自Spring家族很强大的安全框架时长被引用到SpringBoot项目中用作登录认证和授权模块使用,但是对于大部分使用者来说都只停留在实现使用用户名和密码的方式登录。而对于企业的项目需求大多要实现多种登录认证方式,例如一个的登录功能往往需要支持下面几种登录模式:
用户3587585
2022/04/14
3.8K0
一文理清SpringSecurity中基于用于名密码的登录认证流程
SpringSecurity
Spring Security 是一个非常强大的身份验证和授权控制框架。为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障。
堆栈哲学
2022/11/24
5410
SpringSecurity
了解SecurityContext
通常我们在认证后访问需要认证的资源时需要获取当前认证用户的信息。比如 “查询我的个人信息”。如果你直接在接口访问时显式的传入你的 UserID 肯定是不合适的。因为你认证通过后访问资源,系统是知道你是谁的。而且显式的暴露用户的检索接口也不安全。所以我们需要一个业务中可以检索当前认证用户的工具。 接下来我们来看看 Spring Security 是如何解决这个痛点的。
橘子君丶
2023/03/06
4740
了解SecurityContext
SpringSecurity 从入门到精通详解
Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
BUG弄潮儿
2023/02/24
6530
SpringSecurity 从入门到精通详解
Security 登录认证流程详细分析 源码与图相结合
对于一门技术,会使用是说明我们对它已经有了一个简单了解,把脉络都掌握清楚,我们才能更好的使用它,以及更好的实现定制化。
宁在春
2022/10/31
5940
Security 登录认证流程详细分析 源码与图相结合
Spring Security 架构简介
Spring Framework 为开发 Java 应用程序提供了全面的基础架构支持。它包含了一些不错的功能,如 “依赖注入”,以及一些现成的模块:
阿宝哥
2019/11/05
2.8K0
浅析 Spring Security 核心组件
近几天在网上找了一个 Spring Security 和JWT 的例子来学习,项目地址是
BUG弄潮儿
2022/12/05
4260
Spring Security (四) 核心过滤器源码分析
前面的部分,我们关注了Spring Security是如何完成认证工作的,但是另外一部分核心的内容:过滤器,一直没有提到,我们已经知道Spring Security使用了springSecurityFillterChian作为了安全过滤的入口,这一节主要分析一下这个过滤器链都包含了哪些关键的过滤器,并且各自的使命是什么。 4 过滤器详解 4.1 核心过滤器概述 由于过滤器链路中的过滤较多,即使是Spring Security的官方文档中也并未对所有的过滤器进行介绍,在之前,《Spring Security(
程序猿DD
2018/02/01
1.5K0
Spring Security (四) 核心过滤器源码分析
SpringSecurity学习
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式
云边小卖部
2022/12/02
7130
Spring Security 架构与源码分析
Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowe
JadePeng
2018/07/31
7710
Spring Security 架构与源码分析
SpringSecurity + JWT,从入门到精通!
RBAC 全称为基于角色的权限控制,本段将会从什么是 RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述 RBAC,绘制思维导图如下:
后端码匠
2020/07/14
5.6K3
【第九篇】SpringSecurity核心过滤器-SecurityContextPersistenceFilter
  首先来看看在spring-security-core中的SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象。也就是当前认证的相关信息会存储在Authentication对象中。
用户4919348
2022/05/18
8770
【第九篇】SpringSecurity核心过滤器-SecurityContextPersistenceFilter
相关推荐
Springboot之Security前后端分离登录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验