spring security学习之路(一)理论知识储备

  最近在研究权限管理,接触到了spring security,因为这个框架本身的复杂性,在学习的过程中遇到了很多困难,但有阻力才有克服的动力。经历了一段时间的苦痛挣扎,基本实现了项目后台所需求的权限管理功能:基于spring security 安全框架的RBAC模型的细粒度权限管理。温故而知新,这里计划将整个实现过程记录下来,对知识进一步巩固。

  要使用spring security 首先要了解其工作原理,前期不要急于去写代码。安全框架,无非就是认证和授权这两个过程,所以我们要对其认证流程和授权流程有一定的了解。

一、认证过程

当用户首次访问系统资源的时候(没有登陆的情况下),spring security 的过滤器会“拦截”到用户的请求,判断用户的这个请求是否经过认证,如果系统(spring security 安全上下文)找不到用户的认证信息,那么就授与用户一个匿名用户的角色ROLE_ANONYMOUS,如果资源不允许用户匿名访,就引导用户进行登陆。当用户输入账号密码提交之后,spring security 的过滤器AbstractAuthenticationProcessingFilter的实现类UsernamePasswordAuthenticationFilter会截获用户的请求,获取到用户输入的账号密码,并将其封装成Authentication(一个待认证的对象),这个过程通常是Authentication的实现类UsernamePasswordAuthenticationToken来完成的。AuthenticationManager(身份管理器) 负责验证这个Authentication,AuthenticationManager只是一个接口,是发起认证的出发点,由他的实现类ProviderManager来认证,但其实ProviderManager也不是真的实现了认证功能,在ProviderManager的内部定义List<AuthenticationProvider>的列表存放多种认证的方式,这些AuthenticationProvider(认证提供者)的实现类才是真正的进行认证工作的,为什么会是一个列表呢?因为你可能有不同的认证方式,比如用户名+密码(UsernamePasswordAuthenticationToken),用户名+密码+验证码或者手机号登陆,每一种方式都会有一个AuthenticationProvider与之对应,Authentication(一个待认证的对象)会被列表中的AuthenticationProvider进行依次认证,只要有一个认证通过就返回了,视为认证成功(默认情况下是这样),然后将用户的认证信息保存到spring security 安全上下文(可以简单粗暴的理解为session)中,那么AuthenticationProvider又是如何具体进行认证的呢,通常用户的数据都保存在数据库(security可以基于内存的验证),通过登陆时输入的账号,查询数据库获取到用户信息(查询不到直接认证失败),封装成UserDetails(实现类为User)这对象就包含了用户账号密码以及权限信息,AuthenticationProvider就是用Authentication(一个待认证的对象)和UserDetauls对象进行比较来进行认证的。这样经过一系列的过程,Authentication经过认证就包含了用户的账号,权限等信息(敏感数据密码会剔除)

二、授权过程

在spring security 的核心过滤器中,FilterSecurityInterceptor 来决定访问的资源需要具备什么样的权限,由AccessDecisionManager的实现类来完成,该类所做的工作就是得到经过认证的用户对象Authentication,和用户访问的资源(url地址)以及资源所需要的权限,系统资源所需要的权限则由FilterInvocationSecurityMetadataSource的实现类来管理,通过这三者来决定用户是否有权访问。

这就是spring security进行权限管理的大致流程,标记出来的核心类是我们需要去查看api来仔细研究的,以上均为个人理解,不足之处,欢迎大家指正。

(后续内容,持续更新中......)

参考文章:https://www.cnkirito.moe/categories/Spring-Security/

猜你喜欢

转载自blog.csdn.net/Forever_and_ever/article/details/86149448