Spring Security简单理解

        最近在学习Spring Security,于是就写了这篇Spring Security的博客来记录自己的学习中的一些总结,本文主要是一些简单的原理分析,没有涉及很深的源码分析。

1. Spring Security初体验

未引入Spring Security前请求接口情况,接口可以随意定义一个controller测试

引入Spring Security后,接口的请求情况

 

如果使用浏览器模拟访问更加明显,会跳到一个登录页面,效果如下:

然后输入默认的用户名和密码,默认的用户名是:user,密码是会在控制台中显示,如下:

在登录页面输入后,就可以访问接口了,访问后的效果如下

 

 我们都知道401状态码就是表示没有权限的意思,请求被拦截了。这就是Spring Security的作用,用于服务的认证与授权,这里体现的是认证的作用了。实际运用中我们不可能通过使用默认登录页面来进行认证的。

2. Spring Security的认证阶段

2.1 登录流程

        登录是每个系统的入口,经过登录校验后,后端服务才知道你是谁,你有哪些权限,所以我们来梳理一下现在在前后端分离的模式下,登录接口的常规流程,流程总结如下图:

 2.2 Spring Security执行流程

        Spring Security的原理其实就是一个过滤器链,内部包含了各种功能的过滤器。示例如图

 图中列举的名字是Spring Security过滤器链中的重要过滤器。以下是对这些重要过滤器的说明:

  • UsernamePasswordAuthenticationFilter:负责处理在登录接口输入的用户名和密码的校验
  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException,其中AccessDeniedException是授权异常,AuthenticationException是认证异常
  • FilterSecurityInterceptor:是负责权限校验的过滤器,授权和资源权限的校验

以上是完整的一个流程简介,主要分为两个阶段,认证与授权。

2.2.1 Spring Security认证流程

认证是所有请求的第一步,认证通过后,才说明该请求是一个合法的请求。Spring Security的完整认证流程如下图所示:

图中涉及的接口与类的简单描述

  • Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户的相关信息
  • AuthenticationManager接口:定义认证Authentication的方法
  • UserDetailsService接口:用于加载用户特定数据的核心接口,里面定义了一个根据用户名查询用户信息的方法,loadUserByUsername。
  • UserDetails接口:提供用户的核心信息,通过UserDetailsService的loadUserByUsername查询到的用户信息需要封装成UserDetails对象返回,然后讲这些信息封装到Authentication对象中

以上是认证的逻辑与流程,Spring Security还有一个重要的功能就是授权。

2.2.2 Spring Security授权

        每个用户的权限都是不一样的,在不同的用户进行访问系统时,需要对用户进行授权。在Spring Security中,使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取用户的权限信息。然后判断用户是否拥有资源权限。所以就是需要在用户登录时,也需要查询出用户的权限信息,并将权限信息存储到Authentication对象中。

        首先需要在配置类上开启注解控制权限,使用

@EnableGlobalMethodSecurity(prePostEnabled = true)

然后使用@PreAuthorize来定义接口需要使用的权限,例如:

@PreAuthorize("hasAuthority('test')")

这个就是需要test权限才可以访问资源!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值