当前位置:网站首页>中小型项目手撸过滤器实现认证与授权
中小型项目手撸过滤器实现认证与授权
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()));
}
}
}
总结
总体思路大致如上,细节上可根据项目信息具体进行变更。
边栏推荐
猜你喜欢

Fabric. JS iText sets the color and background color of the specified text

黑马笔记---Map集合体系

Fabric. JS activation input box

4. Flask cooperates with a tag to link internal routes

黑马笔记---Set系列集合
![[opencv] image binarization](/img/7e/b56a59ffae3bf6cac9c0bb7e090b85.jpg)
[opencv] image binarization

Straighten elements (with transition animation)

Storage of data

Fabric.js IText设置指定文字的颜色和背景色

Gee series: Unit 1 Introduction to Google Earth engine
随机推荐
Fabric.js 自由绘制矩形
Sliding window on the learning road
JVM class loading mechanism
Importation de studio visuel
Principle and implementation of parallax effect
从数组中找出和为目标的下标
Fabric. JS gradient
Fabric.js 精简JSON
ERP management system development and design existing source code
[quick view opencv] familiar with CV matrix operation with image splicing examples (3)
Global and Chinese market of commercial fish tanks 2022-2028: Research Report on technology, participants, trends, market size and share
Financial portal related information
Fabric.js 激活输入框
el form 表单validate成功后没有执行逻辑
Set the default style of scroll bar Google browser
Gee: explore the change of water area in the North Canal basin over the past 30 years [year by year]
黑马笔记---Map集合体系
Global and Chinese market of pressure gauges 2022-2028: Research Report on technology, participants, trends, market size and share
Get the details of the next largest number
Implementation of leetcode two number addition go