<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p><strong>Spring Security</strong> 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架<strong>Shiro</strong>,它提供了更丰富的功能,社区资源也比Shiro丰富。</p>
讯享网
一般来说中大型的项目都是使用SpringSecurity 来做安全框架。
小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。
一般Web应用的需要进行和。
- 认证:这个人是不是我们公司的
- 授权:这个人什么职位,进而确定 活动范围的楼层
而认证和授权也是SpringSecurity作为安全框架的核心功能。
1.1 准备工作
我们先要搭建一个简单的SpringBoot工程
① 设置父工程 添加依赖
讯享网
② 创建启动类
③ 创建Controller
讯享网
1.2 引入SpringSecurity
在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例。
2.1 登陆校验流程
2.2 原理初探
想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。
2.2.1 SpringSecurity完整流程
SpringSecurity的原理其实就是一个 ,内部包含了提供 各种功能 的 过滤器。
这里我们可以看看入门案例中的过滤器:

图中只展示了 核心过滤器,其它的非核心过滤器并没有在图中展示。
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了 用户名 密码 后的登陆请求。入门案例的认证工作主要有它负责。
ExceptionTranslationFilter: 负责处理 过滤器链 中抛出的任何 AccessDeniedException 和 AuthenticationException 。
FilterSecurityInterceptor: 负责 权限校验 的过滤器。
我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。
2.3 认证实现
2.3.1 思路分析
登录
①自定义登录接口
调用 ProviderManager 的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中
②自定义UserDetailsService
在这个实现类中去 查询数据库
校验
①定义Jwt认证过滤器
获取token
解析token获取其中的userid
从redis中获取用户信息
存入SecurityContextHolder
2.3.2 准备工作
①添加依赖
讯享网
② 添加Redis相关配置
讯享网
③ 响应类
④工具类
讯享网
讯享网
⑤实体类
2.3.3 实现
2.3.3.1 数据库校验用户
从之前的分析我们可以知道,我们可以自定义一个UserDetailsService,让SpringSecurity使用我们的UserDetailsService。我们自己的UserDetailsService可以从数据库中查询用户名和密码。
准备工作
我们先创建一个用户表, 建表语句如下:
讯享网
引入MybatisPuls和mysql驱动的依赖
配置数据库信息
讯享网
定义Mapper接口
修改User实体类
讯享网
配置Mapper扫描
添加junit依赖
讯享网
测试MP (MybatisPlus) 是否能正常使用
核心代码实现
讯享网
因为UserDetailsService方法的返回值是 UserDetails类型,所以需要定义一个类,实现该接口,把用户信息封装在其中。
注意:如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密码前加 。例如

这样登陆的时候就可以用sg作为用户名,1234作为密码来登陆了。
2.3.3.2 密码加密存储
实际项目中我们不会把密码明文存储在数据库中。

默认使用的 PasswordEncoder 要求数据库中的密码格式为:{id}password 。它会根据id去判断密码的加密方式。但是我们一般不会采用这种方式。所以就需要替换PasswordEncoder。
我们一般使用SpringSecurity为我们提供的 。
我们只需要使用把 BCryptPasswordEncoder 对象注入 Spring容器 中,SpringSecurity就会使用该PasswordEncoder来进行密码校验。
我们可以定义一个SpringSecurity的配置类,SpringSecurity要求这个配置类要继承WebSecurityConfigurerAdapter。
讯享网
2.3.3.3 登陆接口
接下我们需要自定义登陆接口,然后让 SpringSecurity 对这个接口放行
更改 上面我们 自定义SpringSecurity的配置类:
讯享网
2.3.3.4 认证过滤器
我们需要自定义一个过滤器,这个过滤器会去获取请求头中的token,对token进行解析取出其中的userid。
使用userid去redis中获取对应的LoginUser对象。
然后封装Authentication对象存入SecurityContextHolder
讯享网
2.3.3.5 退出登陆
只需 获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。
讯享网
3.0 权限系统的作用
总的来说就是不同的用户可以使用不同的功能。这就是权限系统要去实现的效果。
我们不能只依赖前端去判断用户的权限来选择显示哪些菜单哪些按钮。因为如果只是这样,如果有人知道了对应功能的接口地址就可以不通过前端,直接去发送请求来实现相关功能操作。
3.1 授权基本流程
3.2 授权实现
3.2.1 限制访问资源所需权限
但是要使用它我们需要先 开启相关配置。
然后就可以使用对应的注解。@PreAuthorize
讯享网
3.2.2 封装权限信息
我们前面在写 UserDetailsServiceImpl 的时候说过,在查询出用户后还要获取对应的 权限信息,封装到UserDetails 中返回。
我们先直接把权限信息 wtt 写死封装到UserDetails中进行测试。
我们之前定义了UserDetails的实现类 LoginUser,想要让其能 封装权限信息 就要对其进行修改。
LoginUser修改完后我们就可以在 UserDetailsServiceImpl 中去把权限信息封装到 LoginUser 中了。我们写死权限进行测试,后面我们再从数据库中查询权限信息。
讯享网
3.2.3 从数据库查询权限信息
3.2.3.1 RBAC权限模型
RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

3.2.3.2 准备工作
3.2.3.3 代码实现
我们只需要根据用户id去查询到其所对应的权限信息即可。
所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息。
讯享网
尤其是自定义方法,所以需要创建对应的mapper文件,定义对应的sql语句
在application.yml中配置mapperXML文件的位置
讯享网
然后我们可以在UserDetailsServiceImpl中去调用该mapper的方法查询权限信息封装到LoginUser对象中即可。
我们还希望在 认证失败 或者是 授权失败 的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。
要实现这个功能我们需要知道SpringSecurity的 。
在SpringSecurity中,如果我们在 认证 或者 授权 的过程中出现了异常会被 捕获到。在ExceptionTranslationFilter 中会去判断是 认证失败 还是 授权失败 出现的异常。
如果是 认证过程 中出现的异常会被封装成 然后调用AuthenticationEntryPoint 对象的方法去进行异常处理。
如果是 授权过程 中出现的异常会被封装成 然后调用AccessDeniedHandler对象的方法去进行异常处理。
所以如果我们需要自定义异常处理,我们只需要自定义 AuthenticationEntryPoint 和 AccessDeniedHandler 然后配置给SpringSecurity即可。
①自定义实现类
讯享网
②配置给SpringSecurity
先注入对应的处理器
然后我们可以使用HttpSecurity对象的方法去配置。
讯享网
前后端分离项目,前端项目和后端项目一般都不是同源的,所以肯定会存在跨域请求的问题。
所以我们就要处理一下,让前端能进行跨域请求。
①先对SpringBoot配置,运行跨域请求
②开启SpringSecurity的跨域访问
由于我们的资源都会收到 SpringSecurity 的保护,所以想要跨域访问还要让 SpringSecurity 同意才行。
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/191140.html