简介
Spring Security是Spring家族中的一个安全管理框架。相比于另外一个安全框架Shiro,他提供更丰富的功能,社区资源也比Shiro丰富。
一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目用Shiro的比较多,相比于SpringSecurity,Shiro的上手更加简单。
一般Web应用需要进行认证和授权。
认证:验证当前访问系统的是不是本系统的用户,并且要具体确认是哪个用户。
授权:经过认证后判断当前用户是否有权限进行某个操作。
引入依赖
1 | <!--security--> |
引入依赖后我们在尝试访问之前的接口就会自动跳转到一个SpringSecurity的默认登录页面,默认用户名是user,密码会输出在控制台。
登录校验流程
- 前端携带用户名、密码访问登录接口
- 与数据库中信息进行比较
- 如果正确,生成JWT,并返回前端
- 之后的请求中前端需要携带token,后端解析token响应请求
原理初探
SpringSecurity实际上就是一个过滤器链,内部包含了提供各种功能的过滤器。
- UsernamePasswordAuthenticationFilter:负责处理登录请求。
- ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException。
- FilterSecurityInterceptor:负责权限校验的过滤器。
相关准备
引入依赖
1 | <!--redis依赖--> |
添加redis相关配置
1 | package com.kaka.utils; |
1 | package com.kaka.config; |
响应类
1 | package com.kaka.utils; |
工具类
1 | package com.kaka.utils; |
1 | import java.util.*; |
1 | import javax.servlet.http.HttpServletResponse; |
数据库相关
相关依赖
1 | <!--mysql依赖--> |
1 | <!--mybatis依赖--> |
配置yml文件
1 | datasource: |
重写登录流程
重写UserDetailsService
1 | package com.kaka.service; |
重写UserDetails类
1 | package com.kaka.entity; |
用户密码加密
编写config类
1 | package com.kaka.config; |
两个函数
- passwordEncoder.encode(string s) :将s加密
- passwordEncoder.matches(string s1, string s2) :将加密过的s1与原密码s2进行对比
登录接口
自定义登录接口,让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。
在接口中通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把AuthenticationManger注入容器中。
编写登录接口业务(生成token并返回,将用户信息存入redis中)
1 | package com.kaka.service; |
1 | package com.kaka.config; |
redis配置
1 | redis: |
token认证过滤器
所有请求都会经过认证过滤器。
如果不含有token的请求直接放行。
如果含有token,解析并判断token是否正确。
1 | package com.kaka.filter; |
配置过滤器
将其添加在UsernamePasswordAuthenticationFilter的后面,即在登录认证之前
1 | http |
退出登录
不需要删除contextHolder中的用户信息,只需要删除redis中的用户信息即可。
1 | public ResponseResult logout() { |
授权
基本流程
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在Filter中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。
在项目中只需要把当前登录用户的权限信息页存入Authentication,然后设置资源所需要的权限。
授权实现
使用注解去指定访问对应的资源所需的权限。
先开启相关配置
1 |
然后使用对应的注解。@PreAuthorize
1 |
跨域
springboot跨域
1 | package com.kaka.config; |
SpringSecurity跨域
1 | http.cors(); |
自定义失败处理器
认证失败处理器
1 | package com.kaka.handler; |
授权失败处理器
1 | package com.kaka.handler; |
添加到配置类
1 | http.exceptionHandling() |