1.认证授权概述
为了给学习SpringSecurity打下基础,我们来回顾一下传统的认证授权流程
1.1.什么是认证
认证是对主体/用户身份的确认,在我们的生活中随处可见认证场景,如:小区门禁卡,人脸识别,指纹识别等都是对用户身份的确认,在传统的应用中我们通常使用用户名/用户ID和密码来进行用户的身份确认,即登录,但登录的方式不仅限制于用户名/密码的方式,认证是我们应用的第一道安全门,所以对于整个系统的安全来说显得极其重要。
1.2.什么是授权
控制不同的用户访问不同的权限 ,用户认证成功后,就可以对某些资源进行访问,但是不同的用户有不同的资源访问权利,那么对用户的授权也都不一样。如:公司老板拥有对公司的所有权限,而部门主管只能有对自己管理的部门的权限,所以在程序中授权的过程就是赋予不同用户不同权限的过程。
1.3.什么是RBAC
RBAC是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
举例:可以把部门的展示,添加,修改,删除等资源或功能打包成角色“部门管理”,然后把“部门管理”这个角色赋予某个用户,那么这个用户就是部门管理员,拥有部门的相关权限。
RBAC 认为授权实际上是Who 、What 、How 三元组之间的关系,也就是Who 对What 进行How 的操作。
- 主体(Who ) :是权限的拥有者或主体(如:User,Role)。
- 资源 (what): 是操作或对象,如:页面,菜单,按钮,控制器(controller,hanler)等
- 权限(how) :具体的权限, 如:张三可以删除员工。 那么删除员工就是一个权限
2.基于session的认证授权
2.1.认证流程
基于Session的认证方案即当用户认证成功之后将认证信息缓存在session中,主体(用户)在发起资源访问时需要进行是否做过认证校验,即检查session中是否有缓存认证信息。详细的认证流程如下图:
认证流程
- 客户端(浏览器)提交用户名和密码发起认证请求
- 请求中的认证信息被封装成对象(User),控制层(controller)接收到认证请求
- Controller调用服务层(Service)的认证逻辑进行认证,传入User
- Service调用持久层(Dao)根据传入的User中的账号查询数据库中的认证信息(User)
- Service获取到持久层返回的User和请求传入的User进行密码比对
- 认证成功将认证信息(User)和用户的权限信息通过UserContext存储到(Session中)
- 返回认证结果给客户端
认证检查
当用户再次发起请求,拦截器会负责检查是否已经完成认证,通过UserContext从Session中获取User对象进行判断,如果没认证就会返回错误信息,如果已经完成认证就直接访问url对应的资源,返回资源给客户端。
2.2.授权流程
授权是约束用户对资源的访问权限,通过系统事先需要对资源做好授权操作,即约定好哪些资源需要什么样的权限才能访问。并且平台的用户需要被分配好其拥有的权限(用户/角色/权限) , 在用户认证成功之后即为用户加载其拥有的权限列表和认证信息一起封装成对象缓存到session中 ,当用户发起资源请求时,除了需要做认证检查还需要做权限检查,即判断当前认证用户所拥有的权限列表中是否拥有当前访问的资源所需要的权限。详细授权流程如下如:
- 认证通过,加载当前用户的权限列表,和认证信息一起封装成对象存储到session中
- 服务端登录检查拦截器,校验是否已经认证(从session获取认证信息)
- 服务端权限检查拦截器,校验是否拥有访问权限(用户的权限列表是否包含资源所需要的权限)