SpringBoot集成认证授权之SpringSecurity常规实现
in JavaDevelop with 0 comment

SpringBoot集成认证授权之SpringSecurity常规实现

in JavaDevelop with 0 comment

完成权限管理需要三个对象

在权限管理的概念中,有两个非常重要的名词:
认证:通过用户名和密码成功登陆系统后,让系统得到当前用户的角色身份。
授权:系统根据当前用户的角色,给其授予对应可以操作的权限资源。

注:这三个对象中,用户与角色是多对多的关系,角色与权限是多对多的关系,用户与权限没有直接关系,二者是通过角色来建立关联关系的。

系统安全和系统保护设计

在实际开发过程中,为了保证我们的系统能够安全稳定的运行下去,一般都要从下面两点来考虑:

  1. 系统安全性:防止非法入侵、非法请求、非法拦截等。我们需要阻止和屏蔽不信任的请求源访问,保证数据的安全可靠,不被人窃取。
  2. 系统健壮性:也就是系统可用性,最常见的解决方案就是做服务 “冗余”。当然量级够大的话,要做的事情会很多很多,比如限流、熔断、降级等等。

这里只简单的谈一谈系统的安全性,在项目的开发中需要从全方位、多角度做工作,以确保整个业务链路、整个体系范围都能保证安全。下面就大致介绍下在实际开发过程中,开发者经常用到的一些方法:

在系统的安全方面,我们的 Spring Security 框架,解决的最主要的问题就是 认证安全登录鉴权

Spring Security 核心功能介绍

Spring Security 其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在 Spring Security 中一种过滤器处理一种认证方式。比如,对于 username password 认证过滤器来说:

然后下一个认证过滤器,再次按照自身职责判定是否是自身需要的信息。中间可能还有更多的认证过滤器,只要有一个认证过滤器通过了,就是用户登录成功。

在整个过滤器中的最后一环是 FilterSecurityInterceptor,这里会判定该请求是否能进行访问 REST 服务,如果被拒绝了就会抛出不同的异常(根据具体的原因)。Exception Translation Filter 会捕获抛出的错误,然后根据不同的认证方式进行信息的返回提示。

认证授权分析

用户在进行资源访问时,要求系统要对用户进行权限控制,其具体流程如图-1所示:

在这里插入图片描述

简单来说,认证就是登录,授权其实就是权限的鉴别,看用户是否具备相应请求的权限。

SpringSecurity 架构设计

鸟瞰SpringSecurity 基本技术架构,例如:
在这里插入图片描述

绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:短信验证)。认证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效。下面会重点介绍以下三个过滤器:

UsernamePasswordAuthenticationFilter 过滤器:该过滤器会拦截前端提交的 POST 方式的登录表单请求,并进行身份认证。

BasicAuthenticationFilter:检测和处理 http basic 认证。

ExceptionTranslationFilter 过滤器:该过滤器不需要我们配置,对于前端提交的请求会直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。

FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并由 ExceptionTranslationFilter 过滤器进行捕获和处理。

SpringSecurity实现后端模块式登录

在Spring Security,默认使用Session机制存储成功登录的用户信息(因为HTTP协议是无状态协议,并不保存客户端的任何信息,所以,同一个客户端的多次访问,对于服务器而言,等效于多个不同的客户端各访问一次,为了保存用户信息,使得服务器端能够识别客户端的身份,必须采取某种机制),当下,更推荐使用Token或相关技术(例如JWT)来解决识别用户身份的问题。

要在Spring Security中使用JWT,至少需要:

不能让Spring Security按照原有模式来处理登录(原有模式中,登录成功后,自动装用户信息存储到Session中,且跳转页面),需要

  1. 需要自动装配AuthenticationManager对象
  1. 创建IAdminService接口

  2. 在IAdminService接口中添加登录的抽象方法

String login(AdminLoginDTO adminLoginDTO);
  1. 创建AdminServiceImpl类,实现以上接口
  1. 创建AdminController类,在类中处理登录请求

  2. 在SecurityConfiguration中配置Spring Security,对特定的请求进行放行(默认所有请求都必须先登录)

SpringSecurity实现前后端分离式模块登录

参考文件

  1. SpringSecurity入门使用
  2. 用户认证流程
  3. SpringSecurity图片验证码
  4. SpringSecurity添加记住我功能
  5. SpringSecurity短信验证码接口发送
  6. SrpingSecurity的Session管理与退出登录
  7. 使用Spring Security控制授权
  8. JWT实现SSO单点登录
  9. SpringSecurity用户身份认证与授权