前言
为什么需要登陆鉴权?
这个问题可以设想一下如果我们所写的接口没有登陆鉴权这个东西,就相当于无论是否登陆本平台的用户都可以访问所有接口,虽然对于一些功能来说可能未登陆是看不到的,但是接口是被暴露出去的,这样就会很不安全。通俗点讲就相当于别人出入我们自己家,不需要我们的房门钥匙,而且想干什么就干什么,我们都是无感知的,这样说是不是就很严重。
如何鉴权?
对于当前大众的鉴权措施来说大至分为两个步骤,第一个步骤就是需要登录,登录校验成功后需要生成一个token返回给前端,前端在后续每次请求时,需要在header中携带一个token键值对,这个键值对的名字一般都是对应的鉴权框架自定义的,比如token、Auth等等。此时接口请求到后端后后端会对所有的接口进行拦截,拦截后拿到该键值对与登录时缓存的信息进行比对,判断该用户是否已经登录,如果已登录则取出用户信息存储到LocalThread中对接口进行放行,如果未登陆则直接拦截该接口返回未授权信息(比如401)。
access_control插件介绍
access_control
插件是个人编写的登录鉴权插件,其主要愿景是轻量、尽量与原业务解偶、尽量多的位置可定制化,当然目前为第一版本,主要还是以轻量、快速解决鉴权问题为主。其余功能会在后续的迭代版本中进行推出,预计该插件会迭代一至两个版本(因为该插件开发出来的主要目的是供初学者开发简易鉴权使用,供大家共同学习和探讨,因为个人能力有限功能会有不足,接受大家的指导和建议,这些我会在后续的迭代版本中去改正)。
插件使用说明
软件架构
本插件基于spring boot框架编写,为一个starter
安装及使用
1.本版本安装方式为您可将本插件源码拉取到本地,通过maven的install将jar推送至本地仓库。
2.在进行第二步骤前确保顺利进行第一步操作。
在pom文件中引入如下依赖:
<dependency>
<groupId>com.purplestorm</groupId>
<artifactId>access-control-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
3.目前本插件暂未对侵入性做严格的控制,所以对现有代码有轻微拓展侵入,如需使用本插件需要实现本插件中的SessionCache接口,请在本接口的实现类中实现对应的接口方法。
eg:
/**
* @author wsy
* @date 2022/1/19
*/
@Service //此注解不可省略
public class SessionCacheService implements SessionCache<UserVO> {
@Autowired
private LoginUtil loginUtil; //该类为自定义工具类大致功能为在redis中根据token拼接key进行用户登录校验
@Override
public String response403() {
//此方法为当用户未登录且访问了登录后才能访问的接口时返回的内容
return JSON.toJSONString(TransResult.authorization("用户请求"));
}
@Override
public UserVO getUserByToken(String token) {
//该步骤为获取当前登录用户信息,方法入参为从请求header中取到的token
return loginUtil.getCurrentUser(token);
}
}
4.进行如上操作后即可对本插件进行开箱使用(理论上此时运行项目不会报错,如有报错请进行查看报错原因),对于插件中的接口访问限制配置可参照步骤5。
5.对接口访问权限进行配置,在项目的resource目录下新建authorization.yml
文件,文件中配置项如下:
# 配置接口授权
authorization:
open: # 需要进行权限校验的接口
- /test
unopen: # 不需要进行权限校验的接口
- /user/login
notcheck: # 不从header中检查token,此处接口的token在url中进行校验,比如:ws://192.168.31.50:8085/file/b5edf6a52162227ec0f75419adf937af,其中的b5edf6a52162227ec0f75419adf937af就是token
- /file
6.本插件特色功能为在需要使用用户信息的接口中可以通过直接注入CurrentUserBase<Map<String, Object>>
获取到当前请求接口的用户信息map,无需关心内部实现或直接通过继承CurrentUserBase接口指定类型的用户信息,eg:
/**
* @author wsy
*/
public interface CurrentUser extends CurrentUserBase<UserVO> {
}
注:使用该注解时需要在配置文件中配置authorize.interfacePath(自定义指定类型时接口的包路径)
项目gitee地址:access_control