当前位置:网站首页>中小型项目手撸过滤器实现认证与授权
中小型项目手撸过滤器实现认证与授权
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()));
}
}
}
总结
总体思路大致如上,细节上可根据项目信息具体进行变更。
边栏推荐
- Nodejs (02) - built in module
- Creation and destruction of function stack frames
- kmp思想及模板代码
- Fabric. JS three methods of changing pictures (including changing pictures in the group and caching)
- Operator details
- el form 表单validate成功后没有执行逻辑
- Find the subscript with and as the target from the array
- Gee series: unit 9 generate sampling data in GEE [random sampling]
- Financial portal related information
- LeetCode 1175. Prime number arrangement (prime number judgment + Combinatorial Mathematics)
猜你喜欢
Gee series: unit 6 building various remote sensing indexes in Google Earth engine
Fabric. JS iText sets the color and background color of the specified text
Storage of data
4. Flask cooperates with a tag to link internal routes
The El cascader echo only selects the questions that are not displayed
Fabric.js 右键菜单
Visual Studio导入
Pyechats 1.19 generate a web version of Baidu map
6. Network - Foundation
Fabric. JS compact JSON
随机推荐
Differential identities (help find mean, variance, and other moments)
Global and Chinese market of impact roll 2022-2028: Research Report on technology, participants, trends, market size and share
Gee series: unit 8 time series analysis in Google Earth engine [time series]
摆正元素(带过渡动画)
el-cascader回显只选中不显示的问题
Gee: analyze the change of spatial centroid of remote sensing image [centroid acquisition analysis]
Latest: the list of universities and disciplines for the second round of "double first-class" construction was announced
Paddlepaddle project source code
centos8安装mysql8.0.22教程
Fabric. JS upload local image to canvas background
Nodejs (02) - built in module
LeetCode 241. Design priorities for operational expressions (divide and conquer / mnemonic recursion / dynamic programming)
运维工作的“本手、妙手、俗手”
Gee series: unit 7 remote sensing image classification using GEE [random forest classification]
数据的储存
Visual Studio導入
Gee series: unit 6 building various remote sensing indexes in Google Earth engine
[quick view opencv] familiar with CV matrix operation with image splicing examples (3)
Exercise notes 13 (effective letter ectopic words)
MySQL foundation --- query (learn MySQL foundation in 1 day)