一、简介
Spring的安全框架,主要包含两个部分,包括用户认证和用户授权。本质上就是Filter(过滤器),对请求进行过滤,
- 基于session:则通过对cookie里的sessionid进行解析,然后在服务器中查询确认,
- 基于token:解析token,然后加到Spring-security中管理
1. 用户认证
用户的登录认证,用来判断用户是否能访问这个系统。
2. 用户授权
对不同的用户角色,分配不同的权限
二、 认证与授权的流程
用户通过用户名和密码登录以后,就拥有该用户的权限,系统以用户名为key,权限为value存入到Redis中,根据用户名等信息生成token(生成协议采用JWT),返回给前端,前端将该token存储在cookie中,每次调用接口时都会将该token放到Header(请求头)中,用于认证,SpringSecurity对Header中的token进行解析,获取用户信息,通过查询Redis获取用户权限,从而决定该用户是否有访问某些请求(接口)的权限,所有的接口权限交给了SpringSecurity来管理了。
三、 RBAC
基于角色的访问控制
RBAC(Role-Based Access Control),是按照角色进行授权。
基于资源的访问控制(更灵活)
RBAC(Resource-Based Access Control),是按照资源进行授权。
四、工作原理
Spring Security底层同样采用Filter过滤器,不过是多个Filter过滤器,通过FilterChainProxy代理来产生多个Filter,从而实现认证和授权。
而需要我们干预的就是通过实现UserDetailsService接口来通过数据库查询信息,比对密码
1. 密编码器
NoOpPasswordEncoder:表示不加密,直接比对(不用)
BCryptPasswordEncoder:常用的密码加密方式,通过随机加盐存储。
在配置文件中注入了以后,会自动的通过用户输入的与加密后的进行比较。
2. 授权流程
参考文档的图的流程,一般不需要改写,只需要根据认证过程中从数据库获取权限信息,在配置中,通过方法授权。
3. 授权码模式
安全级别最高的模式,也是微信第三方登录的模式。先认证,然后颁发授权码,拿授权码获取令牌,再通过令牌去访问资源。
4. 密码模式
很简单的模式,会泄露密码给客户端,因此要求这个客户端是我们自己开发的APP或单页应用。流程如下:
5. 客户端模式
只使用用户名和密码就可以获取令牌了。内部系统使用。
五、深入理解
- 前后端分离,采用密码模式
- Oauth2包含了授权服务和资源服务
- 用户登录时前端携带用户名、密码、app_id,app_security
- app_id,app_security是用来区分APP的,每个APP发一个,我自己的网站也是这个认证系统的一个APP(应用)
- 不使用授权码模式是因为前后端分离对于授权码模式不友好,需要跳转页面。
六、注册中心
注册中心保存服务的地址,微服务把各自的地址上报上去。
七、 网关
认证服务生成JWT令牌,所有的请求在网关层进行验证,判断权限,将API网关作为Oauth2的资源服务角色,实现接入客户端权限拦截,对令牌解析获得用户信息并转发到微服务,这样下游微服务就不需要关心令牌格式和Oauth2的相关机制了。
- 注意: 网关对资源访问服务进行了配置,所以资源那里就不需要配置了,待确认。
...
...
本文为作者原创文章,未经作者允许不得转载。