暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Java安全框架(二):Spring Security工作原理

一叶扁舟 2020-08-27
3760

Java安全框架(一):Spring Security基础
Java安全框架(三):JWT(Json Web Token)
Java安全框架(四):Spring Security + JWT综合应用(流程梳理)

一、结构总览

1、原理

通过一系列的过滤链,交由认证器和授权器,拦截校验用户请求。
image.png

2、过滤链

image.png

  • SecurityContextPersistenceFilter
    这个Filter是整个拦截过程的入口和出口,初始化一些环境。
请求开始
—-->从配置好的SecurityContextRepository(上下文储存器)中获取SecurityContext
—-->把它设置给SecurityContextHolder
请求完成
—-->把SecurityContextHolder中的SecurityContext保存到配置好的SecurityContextRepository,并清除SecurityContextHolder中的SecurityContext
请求结束
  • UsernamePasswordAuthenticationFilter
    用于控制表单提交,即登录页面

  • BasicAuthenticationFilter
    用于访问时验证是否登录

  • FilterSecurityInterceptor
    使用AccessDeniedManager对当前用户进行授权访问。

  • ExceptionTranslationFilter
    能够捕获来自过滤链的异常,并进行处理,但是只能处理两类异常(AuthenticationException && AccessDeniedException),其他的异常会继续抛出。

二、认证流程

1、原理

image.png

用户输入用户名和密码

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

2、认证原理修改

原因:BasicAuthenticationFilter会根据session验证的方式进行认证,可以修改为token的验证方式。

  • 调用BasicAuthenticationFilter 验证用户是否登录 「可以继承此方法,定义tocken验证」

三、授权流程

1、原理

image.png

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

2、授权方式

image.png
方式一: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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论