From a7d2d03fe177a58c22e960e9c87b32f7b05be74f Mon Sep 17 00:00:00 2001 From: CeDo <cedoo@qq.com> Date: 星期六, 01 五月 2021 22:57:48 +0800 Subject: [PATCH] add:添加小程序实名认证接口过滤(部分) --- springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java | 369 +++++++++++++++++++++++++++------------------------- 1 files changed, 193 insertions(+), 176 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java index 01aa7ee..e8243dd 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java +++ b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java @@ -1,176 +1,193 @@ -package com.panzhihua.zuul.filters; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.panzhihua.common.constants.*; -import com.panzhihua.common.model.vos.LoginUserInfoVO; -import com.panzhihua.common.model.vos.R; -import com.panzhihua.common.service.user.UserService; -import com.panzhihua.common.utlis.AES; -import com.panzhihua.common.utlis.JWTTokenUtil; -import com.panzhihua.common.utlis.ResultUtil; -import io.jsonwebtoken.Claims; -import org.springframework.context.ApplicationContext; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; -import org.springframework.util.ObjectUtils; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * @program: springcloud_k8s_panzhihuazhihuishequ - * @description: token校验 - * @author: huang.hongfa weixin hhf9596 qq 959656820 - * @create: 2020-11-25 16:35 - **/ -@Component -public class JWTAuthenticationTokenFilter implements Filter { - private StringRedisTemplate stringRedisTemplate; - private UserService userService; - - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - /** - * 用户是否登录校验 - * - * @param servletRequest 请求 - * @param servletResponse 返回 - * @param filterChain 过滤器链条 - * @throws IOException io - * @throws ServletException servlet - */ - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - ServletContext context = request.getServletContext(); - ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); - stringRedisTemplate=ctx.getBean(StringRedisTemplate.class); - ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue(); - userService=ctx.getBean(UserService.class); - String requestURI = request.getRequestURI(); - boolean login = requestURI.contains("login"); - boolean doc = requestURI.contains("doc.html"); - boolean css = requestURI.contains(".css"); - boolean js = requestURI.contains(".js"); - boolean ui = requestURI.contains("/ui"); - boolean swagger = requestURI.contains("swagger"); - boolean ico = requestURI.contains(".ico"); - boolean docs = requestURI.contains("-docs"); - boolean error = requestURI.contains("error"); - boolean useragreement = requestURI.contains("useragreement"); - boolean refreshToken = requestURI.contains("refreshToken"); - boolean logout = requestURI.contains("logout"); - boolean wxPay = requestURI.contains("wxNotify"); - boolean wxCgi = requestURI.contains("cgi"); - boolean isShop = requestURI.contains("isShop"); - boolean listadvertisement = requestURI.contains("listadvertisement"); - SafeboxRequestWrapper safeboxRequestWrapper = new SafeboxRequestWrapper(request); - if (login||doc||css||js||ui||swagger||ico||docs||error||refreshToken||useragreement||wxPay||wxCgi||isShop||listadvertisement) { - //什么也不做 - } else { - // 获取请求头中JWT的Token - String tokenHeader = request.getHeader(TokenConstant.TOKEN_HEADER); - if (null != tokenHeader && tokenHeader.startsWith(TokenConstant.TOKEN_PRE)) { - // token过期 - String token = tokenHeader.replace(TokenConstant.TOKEN_PRE, ""); - Boolean hasKey = stringRedisTemplate.hasKey(UserConstants.LOGOUT_TOKEN + token); - if (hasKey) { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "用户已经登出")); - return; - } - Boolean expired = JWTTokenUtil.isTokenExpired(token); - if (expired) { - if (logout) { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "登出成功")); - } else { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token过期")); - } - return; - } - // token解析 - Claims claims = JWTTokenUtil.getClaimsFromToken(token); - if (ObjectUtils.isEmpty(claims)) { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); - return; - } - String username = claims.getSubject(); - int type = (Integer) claims.get("type"); - if (ObjectUtils.isEmpty(username)) { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); - return; - } - List<SimpleGrantedAuthority> authorities = new ArrayList<>(); - List<SimpleGrantedAuthority> authorities1 = new ArrayList<>(); - String key = SecurityConstants.ROLE_USER + username; - Boolean aBoolean = stringRedisTemplate.hasKey(key); - if (1 == type) {//小程序用户统一角色 - authorities.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_APPLETS)); - } else { - if (aBoolean) { - String roles = valueOperations.get(key); - authorities = JSONArray.parseArray(roles, SimpleGrantedAuthority.class); - } else { - R<List<String>> r = userService.getUserRoles(username); - List<String> data =(List<String>)r.getData(); - if (!ObjectUtils.isEmpty(data)) { - data.forEach(s -> { - authorities1.add(new SimpleGrantedAuthority(s)); - }); - authorities = authorities1; - valueOperations.set(key, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS); - } - } - } - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, username, authorities);//主要使用权限 账户 密码 不重要 - SecurityContextHolder.getContext().setAuthentication(authentication); - safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_LOGOUT,tokenHeader); - //登录用户的所有信息 - String userKey = UserConstants.LOGIN_USER_INFO + username; - Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey); - if(hasKeyLoginUserInfo){ - String userInfo = valueOperations.get(userKey); - byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY); - String hexStr = AES.parseByte2HexStr(encrypt); - safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr); - }else{ - R<LoginUserInfoVO> r = userService.getUserInfoByUserId(username); - if (!R.isOk(r)) { - ResultUtil.responseJson(response, R.fail(HttpStatus.ERROR, "登录用户信息查询失败")); - return; - } - LoginUserInfoVO data = r.getData(); - String userInfo = JSONObject.toJSONString(data); - valueOperations.set(userKey,userInfo,24,TimeUnit.HOURS); - byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY); - String hexStr = AES.parseByte2HexStr(encrypt); - safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO,hexStr ); - } - } else { - ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); - return; - } - } - filterChain.doFilter(safeboxRequestWrapper,response); - } - - @Override - public void destroy() { - - } -} +package com.panzhihua.zuul.filters; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.panzhihua.common.constants.*; +import com.panzhihua.common.model.vos.LoginUserInfoVO; +import com.panzhihua.common.model.vos.R; +import com.panzhihua.common.service.user.UserService; +import com.panzhihua.common.utlis.AES; +import com.panzhihua.common.utlis.JWTTokenUtil; +import com.panzhihua.common.utlis.ResultUtil; +import io.jsonwebtoken.Claims; +import org.springframework.context.ApplicationContext; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @program: springcloud_k8s_panzhihuazhihuishequ + * @description: token校验 + * @author: huang.hongfa weixin hhf9596 qq 959656820 + * @create: 2020-11-25 16:35 + **/ +@Component +public class JWTAuthenticationTokenFilter implements Filter { + private StringRedisTemplate stringRedisTemplate; + private UserService userService; + + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + /** + * 用户是否登录校验 + * + * @param servletRequest 请求 + * @param servletResponse 返回 + * @param filterChain 过滤器链条 + * @throws IOException io + * @throws ServletException servlet + */ + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + ServletContext context = request.getServletContext(); + ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); + stringRedisTemplate=ctx.getBean(StringRedisTemplate.class); + ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue(); + userService=ctx.getBean(UserService.class); + String requestURI = request.getRequestURI(); + boolean login = requestURI.contains("login"); + boolean doc = requestURI.contains("doc.html"); + boolean css = requestURI.contains(".css"); + boolean js = requestURI.contains(".js"); + boolean ui = requestURI.contains("/ui"); + boolean swagger = requestURI.contains("swagger"); + boolean ico = requestURI.contains(".ico"); + boolean docs = requestURI.contains("-docs"); + boolean error = requestURI.contains("error"); + boolean useragreement = requestURI.contains("useragreement"); + boolean refreshToken = requestURI.contains("refreshToken"); + boolean logout = requestURI.contains("logout"); + boolean wxPay = requestURI.contains("wxNotify"); + boolean wxCgi = requestURI.contains("cgi"); + boolean isShop = requestURI.contains("isShop"); + boolean listadvertisement = requestURI.contains("listadvertisement"); + SafeboxRequestWrapper safeboxRequestWrapper = new SafeboxRequestWrapper(request); + if (login||doc||css||js||ui||swagger||ico||docs||error||refreshToken||useragreement||wxPay||wxCgi||isShop||listadvertisement) { + //什么也不做 + } else { + // 获取请求头中JWT的Token + String tokenHeader = request.getHeader(TokenConstant.TOKEN_HEADER); + if (null != tokenHeader && tokenHeader.startsWith(TokenConstant.TOKEN_PRE)) { + // token过期 + String token = tokenHeader.replace(TokenConstant.TOKEN_PRE, ""); + Boolean hasKey = stringRedisTemplate.hasKey(UserConstants.LOGOUT_TOKEN + token); + if (hasKey) { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "用户已经登出")); + return; + } + Boolean expired = JWTTokenUtil.isTokenExpired(token); + if (expired) { + if (logout) { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "登出成功")); + } else { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token过期")); + } + return; + } + // token解析 + Claims claims = JWTTokenUtil.getClaimsFromToken(token); + if (ObjectUtils.isEmpty(claims)) { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); + return; + } + String username = claims.getSubject(); + int type = (Integer) claims.get("type"); + if (ObjectUtils.isEmpty(username)) { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); + return; + } + List<SimpleGrantedAuthority> authorities = new ArrayList<>(); + List<SimpleGrantedAuthority> authorities1 = new ArrayList<>(); + if (1 == type) {//小程序用户统一角色 + String roleAppletKey = SecurityConstants.ROLE_APPLETS_USER +username; + if(stringRedisTemplate.hasKey(roleAppletKey)){ + String roles = valueOperations.get(roleAppletKey); + authorities = JSONArray.parseArray(roles, SimpleGrantedAuthority.class); + }else { + authorities.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_APPLETS)); + String userKey = UserConstants.LOGIN_USER_INFO + username; + Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey); + if (hasKeyLoginUserInfo) { + String userInfo = valueOperations.get(userKey); + LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(userInfo, LoginUserInfoVO.class); + //判断用户是否已实名制 + if (loginUserInfoVO.getIsRealNamed() != null && loginUserInfoVO.getIsRealNamed()) { + authorities.add(new SimpleGrantedAuthority(SecurityConstants.ROLE_APPLETS_REAL_NAMED)); + } + } + valueOperations.set(roleAppletKey, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS); + } + } else { + String key = SecurityConstants.ROLE_USER + username; + Boolean aBoolean = stringRedisTemplate.hasKey(key); + if (aBoolean) { + String roles = valueOperations.get(key); + authorities = JSONArray.parseArray(roles, SimpleGrantedAuthority.class); + } else { + R<List<String>> r = userService.getUserRoles(username); + List<String> data =(List<String>)r.getData(); + if (!ObjectUtils.isEmpty(data)) { + data.forEach(s -> { + authorities1.add(new SimpleGrantedAuthority(s)); + }); + authorities = authorities1; + valueOperations.set(key, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS); + } + } + } + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, username, authorities);//主要使用权限 账户 密码 不重要 + SecurityContextHolder.getContext().setAuthentication(authentication); + safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_LOGOUT,tokenHeader); + //登录用户的所有信息 + String userKey = UserConstants.LOGIN_USER_INFO + username; + Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey); + if(hasKeyLoginUserInfo){ + String userInfo = valueOperations.get(userKey); + byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY); + String hexStr = AES.parseByte2HexStr(encrypt); + safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr); + }else{ + R<LoginUserInfoVO> r = userService.getUserInfoByUserId(username); + if (!R.isOk(r)) { + ResultUtil.responseJson(response, R.fail(HttpStatus.ERROR, "登录用户信息查询失败")); + return; + } + LoginUserInfoVO data = r.getData(); + String userInfo = JSONObject.toJSONString(data); + valueOperations.set(userKey,userInfo,24,TimeUnit.HOURS); + byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY); + String hexStr = AES.parseByte2HexStr(encrypt); + safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO,hexStr ); + } + } else { + ResultUtil.responseJson(response, R.fail(HttpStatus.UNAUTHORIZED, "token校验失败")); + return; + } + } + filterChain.doFilter(safeboxRequestWrapper,response); + } + + @Override + public void destroy() { + + } +} -- Gitblit v1.7.1