Spring Security如何实现单点登录系统的权限管理?

2026-05-17 04:051阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计783个文字,预计阅读时间需要4分钟。

Spring Security如何实现单点登录系统的权限管理?

背景:在配置中心中,中心已增加权限功能。当前配置中已包含单点登录功能,可通过统一页面进行登录。登录后,将使用用户输入的用户名写入用户表,并使用RBAC的用户、角色、权限表CRUD及授权等操作已实现。希望:

背景

在配置中心增加权限功能

  • 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表
  • RBAC的用户、角色、权限表CRUD、授权等都已经完成
  • 希望不用用户再次登录,就可以使用SpringSecurity的权限控制
Spring Security

Spring Security最主要的两个功能:认证和授权

Spring Security如何实现单点登录系统的权限管理?

功能 解决的问题 Spring Security中主要类 认证(Authentication) 你是谁 AuthenticationManager 授权(Authorization) 你可以做什么 AuthorizationManager 实现

在这先简单了解一下Spring Security的架构是怎样的,如何可以认证和授权的

过滤器大家应该都了解,这属于Servlet的范畴,Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息

DelegatingFilterProxy是一个属于Spring Security的过滤器

通过这个过滤器,Spring Security就可以从Request中获取URL来判断是不是需要认证才能访问,是不是得拥有特定的权限才能访问。

已经有了单点登录页面,Spring Security怎么登录,不登录可以拿到权限吗

Spring Security官方文档-授权架构中这样说,GrantedAuthority(也就是拥有的权限)被AuthenticationManager写入Authentication对象,后而被AuthorizationManager用来做权限认证

The GrantedAuthority objects are inserted into the Authentication object by the AuthenticationManager and are later read by either the AuthorizationManager when making authorization decisions.

为了解决我们的问题,即使我只想用权限认证功能,也得造出一个Authentication,先看下这个对象:

Authentication

Authentication包含三个字段:

  • principal,代表用户
  • credentials,用户密码
  • authorities,拥有的权限

有两个作用:

  • AuthenticationManager的入参,仅仅是用来存用户的信息,准备去认证
  • AuthenticationManager的出参,已经认证的用户信息,可以从SecurityContext获取

SecurityContext和SecurityContextHolder用来存储Authentication, 通常是用了线程全局变量ThreadLocal, 也就是认证完成把Authentication放入SecurityContext,后续在整个同线程流程中都可以获取认证信息,也方便了认证

继续分析

看到这可以得到,要实现不登录的权限认证,只需要手动造一个Authentication,然后放入SecurityContext就可以了,先尝试一下,大概流程是这样,在每个请求上

  1. 获取sso登录的用户
  2. 读取用户、角色、权限写入Authentication
  3. 将Authentication写入SecurityContext
  4. 请求完毕时将SecurityContext清空,因为是ThreadLocal的,不然可能会被别的用户用到
  5. 同时Spring Security的配置中是对所有的url都允许访问的

加了一个过滤器,代码如下:

import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.www.558idc.com/aqt.html提供,感恩】

本文共计783个文字,预计阅读时间需要4分钟。

Spring Security如何实现单点登录系统的权限管理?

背景:在配置中心中,中心已增加权限功能。当前配置中已包含单点登录功能,可通过统一页面进行登录。登录后,将使用用户输入的用户名写入用户表,并使用RBAC的用户、角色、权限表CRUD及授权等操作已实现。希望:

背景

在配置中心增加权限功能

  • 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表
  • RBAC的用户、角色、权限表CRUD、授权等都已经完成
  • 希望不用用户再次登录,就可以使用SpringSecurity的权限控制
Spring Security

Spring Security最主要的两个功能:认证和授权

Spring Security如何实现单点登录系统的权限管理?

功能 解决的问题 Spring Security中主要类 认证(Authentication) 你是谁 AuthenticationManager 授权(Authorization) 你可以做什么 AuthorizationManager 实现

在这先简单了解一下Spring Security的架构是怎样的,如何可以认证和授权的

过滤器大家应该都了解,这属于Servlet的范畴,Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息

DelegatingFilterProxy是一个属于Spring Security的过滤器

通过这个过滤器,Spring Security就可以从Request中获取URL来判断是不是需要认证才能访问,是不是得拥有特定的权限才能访问。

已经有了单点登录页面,Spring Security怎么登录,不登录可以拿到权限吗

Spring Security官方文档-授权架构中这样说,GrantedAuthority(也就是拥有的权限)被AuthenticationManager写入Authentication对象,后而被AuthorizationManager用来做权限认证

The GrantedAuthority objects are inserted into the Authentication object by the AuthenticationManager and are later read by either the AuthorizationManager when making authorization decisions.

为了解决我们的问题,即使我只想用权限认证功能,也得造出一个Authentication,先看下这个对象:

Authentication

Authentication包含三个字段:

  • principal,代表用户
  • credentials,用户密码
  • authorities,拥有的权限

有两个作用:

  • AuthenticationManager的入参,仅仅是用来存用户的信息,准备去认证
  • AuthenticationManager的出参,已经认证的用户信息,可以从SecurityContext获取

SecurityContext和SecurityContextHolder用来存储Authentication, 通常是用了线程全局变量ThreadLocal, 也就是认证完成把Authentication放入SecurityContext,后续在整个同线程流程中都可以获取认证信息,也方便了认证

继续分析

看到这可以得到,要实现不登录的权限认证,只需要手动造一个Authentication,然后放入SecurityContext就可以了,先尝试一下,大概流程是这样,在每个请求上

  1. 获取sso登录的用户
  2. 读取用户、角色、权限写入Authentication
  3. 将Authentication写入SecurityContext
  4. 请求完毕时将SecurityContext清空,因为是ThreadLocal的,不然可能会被别的用户用到
  5. 同时Spring Security的配置中是对所有的url都允许访问的

加了一个过滤器,代码如下:

import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.www.558idc.com/aqt.html提供,感恩】