Spring Security如何实现单点登录系统的权限管理?
- 内容介绍
- 相关推荐
本文共计783个文字,预计阅读时间需要4分钟。
背景:在配置中心中,中心已增加权限功能。当前配置中已包含单点登录功能,可通过统一页面进行登录。登录后,将使用用户输入的用户名写入用户表,并使用RBAC的用户、角色、权限表CRUD及授权等操作已实现。希望:
背景在配置中心增加权限功能
- 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表
- RBAC的用户、角色、权限表CRUD、授权等都已经完成
- 希望不用用户再次登录,就可以使用SpringSecurity的权限控制
Spring Security最主要的两个功能:认证和授权
在这先简单了解一下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,先看下这个对象:
AuthenticationAuthentication包含三个字段:
- principal,代表用户
- credentials,用户密码
- authorities,拥有的权限
有两个作用:
- AuthenticationManager的入参,仅仅是用来存用户的信息,准备去认证
- AuthenticationManager的出参,已经认证的用户信息,可以从SecurityContext获取
SecurityContext和SecurityContextHolder用来存储Authentication, 通常是用了线程全局变量ThreadLocal, 也就是认证完成把Authentication放入SecurityContext,后续在整个同线程流程中都可以获取认证信息,也方便了认证
继续分析看到这可以得到,要实现不登录的权限认证,只需要手动造一个Authentication,然后放入SecurityContext就可以了,先尝试一下,大概流程是这样,在每个请求上
- 获取sso登录的用户
- 读取用户、角色、权限写入Authentication
- 将Authentication写入SecurityContext
- 请求完毕时将SecurityContext清空,因为是ThreadLocal的,不然可能会被别的用户用到
- 同时Spring Security的配置中是对所有的url都允许访问的
加了一个过滤器,代码如下:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.www.558idc.com/aqt.html提供,感恩】
本文共计783个文字,预计阅读时间需要4分钟。
背景:在配置中心中,中心已增加权限功能。当前配置中已包含单点登录功能,可通过统一页面进行登录。登录后,将使用用户输入的用户名写入用户表,并使用RBAC的用户、角色、权限表CRUD及授权等操作已实现。希望:
背景在配置中心增加权限功能
- 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表
- RBAC的用户、角色、权限表CRUD、授权等都已经完成
- 希望不用用户再次登录,就可以使用SpringSecurity的权限控制
Spring Security最主要的两个功能:认证和授权
在这先简单了解一下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,先看下这个对象:
AuthenticationAuthentication包含三个字段:
- principal,代表用户
- credentials,用户密码
- authorities,拥有的权限
有两个作用:
- AuthenticationManager的入参,仅仅是用来存用户的信息,准备去认证
- AuthenticationManager的出参,已经认证的用户信息,可以从SecurityContext获取
SecurityContext和SecurityContextHolder用来存储Authentication, 通常是用了线程全局变量ThreadLocal, 也就是认证完成把Authentication放入SecurityContext,后续在整个同线程流程中都可以获取认证信息,也方便了认证
继续分析看到这可以得到,要实现不登录的权限认证,只需要手动造一个Authentication,然后放入SecurityContext就可以了,先尝试一下,大概流程是这样,在每个请求上
- 获取sso登录的用户
- 读取用户、角色、权限写入Authentication
- 将Authentication写入SecurityContext
- 请求完毕时将SecurityContext清空,因为是ThreadLocal的,不然可能会被别的用户用到
- 同时Spring Security的配置中是对所有的url都允许访问的
加了一个过滤器,代码如下:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.www.558idc.com/aqt.html提供,感恩】

