SpringSecurity权限框架(OAuth2)

Posted by Beyonderwei on 2020-05-03
Words 936 and Reading Time 3 Minutes
Viewed Times

一、简介

​ 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的相关机制了。

  • 注意: 网关对资源访问服务进行了配置,所以资源那里就不需要配置了,待确认。

本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00