清晰搞懂Spring Security的登录认证

Spring Security是 Spring 家族中的一个安全管理框架 。相比与另外一个安全框架 Shiro ,它提供了更丰富的功能,社区资源也比Shiro丰富 。
一般来说中大型的项目都是使用 SpringSecurity 来做安全框架 。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单 。
一般Web应用的需要进行 认证 和 授权 ,而认证和授权也是SpringSecurity作为安全框架的核心功能 。

  • 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
  • 授权:经过认证后判断当前用户是否有权限进行某个操作
2、登录认证在这里主要介绍了使用Spring Security进行认证操作,授权并不会在这篇文章中过多涉及(其实并没有涉及)
一般来说,认证一般是用于登录时的一种操作,因此下面为使用Spring Security进行登录的一个简易流程图 。
清晰搞懂Spring Security的登录认证

文章插图
 
值得注意的是,这里会使用到 JWT(JSON Web Token) ,由于之前有对它进行一定的学习和记录,这里就不过多赘述(虽然狗子我自己也有点忘记了得去看两眼),有兴趣的小伙伴可以自行前往《Spring Boot整合JWT》进行查看 。
2.1、过滤器链SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器 。而核心的过滤器主要为以下三个:
  • UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求 。
  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException。
  • FilterSecurityInterceptor:负责权限校验的过滤器 。

清晰搞懂Spring Security的登录认证

文章插图
 
同时我们也可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序 。
清晰搞懂Spring Security的登录认证

文章插图
 
2.2、认证流程在认证过程中主要是以下接口发挥了重要作用:
  • Authentication 接口: 它的实现类,表示当前访问系统的用户, 封装了用户相关信息 ;
  • AuthenticationManager 接口: 定义了认证Authentication的方法 ;
  • UserDetailsService 接口:加载用户特定数据的核心接口 。里面 定义了一个根据用户名查询用户信息的方法 ;
  • UserDetails 接口: 提供核心用户信息  。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回,然后将这些信息封装到Authentication对象中 。

清晰搞懂Spring Security的登录认证

文章插图
 
2.3、大思路分析注注注注意!!!在这里我砍掉了视频里的快速入门,那个觉得没有太大必要记录下来,当你完成第一步的时候随便写一个Hello接口就可以实现了,因此想了解的小伙伴直接过弯去视频查看 。
在过了一遍视频和手敲了一遍之后,个人觉得很多地方还是很模糊,不太清晰,因此回过头来分析一波整体的一个思路并且记录在这里 。
  • 第一步,搭建基本环境 。第一步我们肯定是得先搭建一个符合我们需求的一个Spring Boot项目对吧,在这里的话就需要搞定下面几个家常便饭 。
    • 数据库搭建和配置,这里包括了MySQL和redis两个数据库;
    • SpringBoot项目搭建,导入对应需要的坐标,完成yml文件配置和MVC三层架构的搭建;
    • 工具类、部分配置类编写(其实这次也是一个合格的cv boy);
  • 第二步,自定义实现UserDetailsService接口,取代掉原本的接口实现类 。这一块主要是让我们自己输入的账号密码能够访问我们自己的数据库中进行查询验证,我们总不能还用着Spring Security给我们的账号密码对吧(框架中不进行任何操作的时候会有一个随机的自生成的账号密码,没啥用,就让你香一下)
  • 第三步,自定义登录接口,取代掉原有的登录接口 。因为Spring Security自带了一个登录接口,但这个一般来说很难满足我们开发过程中特定的需求,因此我们就需要重新搞一个登录接口来谋权夺位 。

清晰搞懂Spring Security的登录认证


推荐阅读