Java安全框架(一):Spring Security基础
Java安全框架(三):JWT(Json Web Token)
Java安全框架(四):Spring Security + JWT综合应用(流程梳理)
一、结构总览
1、原理
通过一系列的过滤链,交由认证器和授权器,拦截校验用户请求。

2、过滤链

- SecurityContextPersistenceFilter
这个Filter是整个拦截过程的入口和出口,初始化一些环境。
请求开始
—-->从配置好的SecurityContextRepository(上下文储存器)中获取SecurityContext
—-->把它设置给SecurityContextHolder
请求完成
—-->把SecurityContextHolder中的SecurityContext保存到配置好的SecurityContextRepository,并清除SecurityContextHolder中的SecurityContext
请求结束
-
UsernamePasswordAuthenticationFilter
用于控制表单提交,即登录页面 -
BasicAuthenticationFilter
用于访问时验证是否登录 -
FilterSecurityInterceptor
使用AccessDeniedManager对当前用户进行授权访问。 -
ExceptionTranslationFilter
能够捕获来自过滤链的异常,并进行处理,但是只能处理两类异常(AuthenticationException && AccessDeniedException),其他的异常会继续抛出。
二、认证流程
1、原理

用户输入用户名和密码
- ------> 进入密码用户过滤链(UsenamePasswordAuthenticationFilter)「继承此方法,自定义登录」
- ------> 交给认证器(Authentication Manger)
- ------> 认证器调用DaoAuthenticationProvider进行认证
- ------> 先调用UserDetailService中的loadUserByUsername,通过用户输入的用户名,拿到数据库中用户的信息(包括角 色和权限)「重写此方法可以配置数据库信息查询」
- ------>再调用PasswordEncoder中的matches()方法 「重写此方法采用md5加密」,对用户密码进型比较,不正确则抛出异常,正确则SecurityContextHolder.getContext().setAuthentication()方法将Authentication保存至安全上下文(这样在授权的时候,就会自动获取到该用户的角色和权限)。
2、认证原理修改
原因:BasicAuthenticationFilter会根据session验证的方式进行认证,可以修改为token的验证方式。
- 调用BasicAuthenticationFilter 验证用户是否登录 「可以继承此方法,定义tocken验证」
三、授权流程
1、原理

- 投票决策
AccessDecisionManager三个实现类:用于指定投票方式,拿到用户权限和访问需要的权限进行对比相同则投1,不同投-1- AffirmativeBased(默认):有一个赞成则通过,否则抛出AccessDeniedException异常
- ConsensusBased:少数服从多数,否则抛出AccessDeniedException异常
- UnanimousBased:有一个反对则抛出AccessDeniedException异常
2、授权方式

方式一:web授权通过url拦截进行授权(在SecuriotyConfig中配置)
.antMatchers("/admin/**").hasRole("admin")
方式二:方法授权是通过方法拦截进行授权
// 在角色配置的类上加上
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
// 在controller的方法上添加授权拦截的注解
@PreAuthorize("hasRole('admin')") // 只有admin可以访问
@PreAuthorize("hasAnyRole('admin', 'user')")
@PreAuthorize("hasAuthority('xxx')")
@PreAuthorize("hasAuthority(‘xxxx', ‘xxx')")
四、总结
以上讲解了Spring Security工作原理,其整个流程是通过一系列的过滤链完成的,其中,认证环节我们需要编写各种自定义类去完成实际使用中的自定义;当认证环节配置完毕,用户信息会保存至安全上下文;用户访问时,会根据内置授权机制自动授权,关于授权部分,只需掌握授权方式即可。
最后修改时间:2020-08-27 14:29:46
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




