当前位置:网站首页>中小型项目手撸过滤器实现认证与授权
中小型项目手撸过滤器实现认证与授权
2022-07-02 05:24:00 【泊船夜雪,他年可期】
中小型项目手撸过滤器实现认证与授权
代码实现
@Component
@WebFilter(urlPatterns = "/*", filterName = "tokenFilter")
public class TokenFilter implements Filter {
// token 过期时间
@Value("${token-expired-time}")
private int tokenExpiredTime;
// uri 请求白名单
@Resource
private WhiteListConfig whiteListConfig;
@Resource
private RedisTemplate<String, Object> redisTemplate;
// 进行异常处理
@Resource
@Qualifier("handlerExceptionResolver")
private HandlerExceptionResolver resolver;
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
// 请求头里的 token 值,这里需要注意自己项目里 token 对应的 key 是什么
// 我这里是 public static final String AUTH_TOKEN = "auth-token";
String authToken = request.getHeader(Constants.AUTH_TOKEN);
// 请求地址
String requestURI = request.getRequestURI();
// 校验白名单里是否包含当前 uri
boolean flag = whiteListConfig.getNotCheck().stream().anyMatch(u -> requestURI.equals("/"+u));
// 通过校验
if (flag) {
// 则通过认证,进行放行
filterChain.doFilter(request, response);
} else if (StringUtils.isNotBlank(authToken) && redisTemplate.hasKey(authToken)) {
// 非白名单,需要 token 认证
// 进行授权
// redis 里面存储了该用户的权限信息集合,如:角色、菜单、功能等权限信息
TokenInfo tokenInfo = (TokenInfo) redisTemplate.opsForValue().get(authToken);
assert tokenInfo != null;
boolean empower = tokenInfo.getEmpowers() != null && tokenInfo.getEmpowers().size() > 0 && tokenInfo.getEmpowers().stream().anyMatch((requestURI)::equals);
// 认证并授权则通过
if (empower){
// 刷新 token 的过期时间
redisTemplate.expire(token,tokenOvertime,TimeUnit.SECONDS);
filterChain.doFilter(request, response);
}else {
// 如果已认证但无授权信息
resolver.resolveException(request, response, null,new Err(Status.ILLEGAL_REQUEST.getStatus(),Status.ILLEGAL_REQUEST.getError()));
}
} else {
// 没有匹配到 redis 里面的 key,key 就是 authToken;这些请求业务中是直接拒绝请求并抛出异常,记录相关信息
resolver.resolveException(request, response, null, StringUtils.isBlank(authToken) ? new Err("请求头中的 auth-token 信息不能为空!") : new Err(Status.NOT_LOGIN.getStatus(), Status.NOT_LOGIN.getError()));
}
}
}
总结
总体思路大致如上,细节上可根据项目信息具体进行变更。
边栏推荐
- Thread pool batch processing data
- 在线音乐播放器app
- Fabric. JS free draw rectangle
- Nodejs (03) -- custom module
- [quick view opencv] familiar with CV matrix operation with image splicing examples (3)
- Straighten elements (with transition animation)
- Fabric.js 圆形笔刷
- Fabric. JS upload local image to canvas background
- Gee series: Unit 2 explore datasets
- Dark horse notes -- Set Series Collection
猜你喜欢
Fabric. JS compact JSON
Fabric.js 激活输入框
Gee dataset: chirps pentad high resolution global grid rainfall dataset
Straighten elements (with transition animation)
LeetCode 241. Design priorities for operational expressions (divide and conquer / mnemonic recursion / dynamic programming)
Gee series: unit 6 building various remote sensing indexes in Google Earth engine
Detailed explanation of Pointer use
Gee: explore the characteristics of precipitation change in the Yellow River Basin in the past 10 years [pixel by pixel analysis]
Nodejs (02) - built in module
JVM class loading mechanism
随机推荐
操作符详解
Storage of data
Leetcode18题 【四数之和】递归解法
Fabric.js 将本地图像上传到画布背景
Johnson–Lindenstrauss Lemma(2)
Collectors. Groupingby sort
go实现leetcode旋转数组
数据库批量插入数据
在线音乐播放器app
Reflection of the soul of the frame (important knowledge)
Financial portal related information
Fabric. JS three methods of changing pictures (including changing pictures in the group and caching)
php/js cookie共享跨域的问题
ubuntu20.04安装mysql8
Using Kube bench and Kube hunter to evaluate the risk of kubernetes cluster
7.TCP的十一种状态集
Gee data set: export the distribution and installed capacity of hydropower stations in the country to CSV table
Get the details of the next largest number
Online English teaching app open source platform (customized)
JVM class loading mechanism