SpringSecurity登录认证和动态权限流程

SpringSecurity

简介

SpringSecurity的操作都是通过Filter实现,就是Servlet的Filter。
主要是分为两步登录认证和访问授权。

一、总体结构

总体结构
SecurityContextPersistenceFilter:这个一个贯穿整个流程的Filter,拦截过程的出口以及入口,负责初始化。
UsernamePasswordAuthenticationFilter:处理来源于表单传输的Username和Password进行认证处理,当认证成功或者失败之后都会有相应的方法(类)处理。AuthenticationManager会操作登录认证的整体流程。
FilterSericutyInterceptor:进行访问授权的验证,是用于保护Web资源的。AccessDecisionManager会操作授权访问的整体流程。
ExceptionTranslationFilter:该Filter能捕获FilterChain所有的异常,但只能处理AuthenticationException和AccessDeniedException,别的异常都会继续抛出。

(现在的实现技术种类比较多,后面实现的过程中,个别地方会用别的类代替实施,但角色不会变)

二、登录认证

1、认证流程

认证流程

(1)在config中添加过滤器

在这里插入图片描述

(2)当接收到登录信息之后(对应流程图第一步),会由UsernamePasswordAuthenticationFilter接收,登录成功或者失败都会有相应的方法进行处理

在这里插入图片描述

(3)attemptAuthentication()这个方法是进行校验的。用构造一个UsernamePasswordAuthenticationToken 作为参数(对应流程图第二步),让AuthenticationManager.authenticate(upt) 调用(对应流程图第三步)。

在这里插入图片描述

(4)AuthenticationManager通过ProviderManager再委托给DaoAuthenticationProvider (它的父类是实现了AuthenticationProvider接口) ,(这就是对应流程第四步)

在这里插入图片描述

(5)DaoAuthenticationProvider.retrieveUser()调用loadUserByUsername()方法,获取一个UserDetails。(对应流程第五步)

在这里插入图片描述

(6)自定义一个service并实现UserDetailsService接口,同时返回的实体类要继承UserDetails;这里通过用户名在数据库中查找用户的账号密码信息,然后返回一个UserDetails的实体类对象。(对应流程第六步)

在这里插入图片描述

(7)将从数据库中给到的账号密码解密,并与页面提交的信息进行对比(对应流程第七步)。DaoAuthenticationProvider的父类(抽象类)中的authenticate()方法整合两种信息进行比较,认证成功后创建一个Authentication认证信息。

在这里插入图片描述

在这里插入图片描述

(8)DaoAuthenticationProvider的父类(抽象类)就一直往上返回。最后返回至UsernamePasswordAuthenticationFilter(对应流程第九步)。

在这里插入图片描述
在这里插入图片描述

2、认证后处理

(1)当认证成功之后就会生成一个JWT,放置Http协议中的头部的Authentication中,然后进行下一个过滤器的处理。而失败直接返回

在这里插入图片描述

(2)添加新的过滤器验证http中的Authentication信息是否有效。

在这里插入图片描述

(3)判断Authentication认证信息是否有效,然后将认证信息存放到SecurityContextHolder中(对应流程最后一步)。

在这里插入图片描述

二、授权过程

1、

在这里插入图片描述

(1)在配置类中设置授权的过滤器,当访问的时候会被拦截(对应流程第一步)。

在这里插入图片描述

(2)根据我们getAttributes()找到当前访问路径(对应流程第二步),根据访问路径从数据库中找到所需要的角色或者权限。然后就返回角色或者权限(对应流程第三步)。

在这里插入图片描述

(3)AccessDecisionManager.decide()方法,对权限进行匹配(对应流程第四步)

在这里插入图片描述

(4) 这两个方法设置为true,使用默认的投票决策(对应流程第五步)

在这里插入图片描述

(5)这里就是最后两步了,没找源码跟踪,但是不影响整体思路。

主要参考:
http://yun.itheima.com/course/597.html

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值