This commit is contained in:
parent
e3aa1b0fd0
commit
de5d9ea54c
|
@ -2,6 +2,7 @@ package com.recovery.admin.boot.config;
|
||||||
|
|
||||||
|
|
||||||
import com.recovery.admin.boot.interceptor.JwtInterceptor;
|
import com.recovery.admin.boot.interceptor.JwtInterceptor;
|
||||||
|
import com.recovery.common.base.config.redis.RedisCache;
|
||||||
import com.recovery.common.base.util.RedisUtil;
|
import com.recovery.common.base.util.RedisUtil;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
@ -13,17 +14,16 @@ import javax.annotation.Resource;
|
||||||
@Configuration
|
@Configuration
|
||||||
public class InterceptConfig implements WebMvcConfigurer {
|
public class InterceptConfig implements WebMvcConfigurer {
|
||||||
@Resource
|
@Resource
|
||||||
RedisUtil redisUtil;
|
RedisCache redisCache;
|
||||||
@Override
|
@Override
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
//添加拦截器
|
//添加拦截器
|
||||||
registry.addInterceptor(new JwtInterceptor(redisUtil))
|
registry.addInterceptor(new JwtInterceptor(redisCache))
|
||||||
//拦截的路径 需要进行token验证的路径
|
//拦截的路径 需要进行token验证的路径
|
||||||
.addPathPatterns("/**")
|
.addPathPatterns("/**")
|
||||||
//放行的路径
|
//放行的路径
|
||||||
.excludePathPatterns("/api/rest/users/getUserByUsername")
|
.excludePathPatterns("/api/rest/users/getUserByUsername")
|
||||||
.excludePathPatterns("/api/user/sendMsg")
|
.excludePathPatterns("/api/user/sendMsg")
|
||||||
.excludePathPatterns("/api/user/loginPhone")
|
|
||||||
//放行swagger 测试验证
|
//放行swagger 测试验证
|
||||||
.excludePathPatterns("/api/user/get");
|
.excludePathPatterns("/api/user/get");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package com.recovery.admin.boot.controller;
|
package com.recovery.admin.boot.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.recovery.admin.boot.service.ISysUserService;
|
import com.recovery.admin.boot.service.ISysUserService;
|
||||||
|
import com.recovery.common.base.constant.Constants;
|
||||||
import com.recovery.common.base.dto.UserAuthDTO;
|
import com.recovery.common.base.dto.UserAuthDTO;
|
||||||
import com.recovery.common.base.result.ApiResult;
|
import com.recovery.common.base.result.ApiResult;
|
||||||
import com.recovery.common.base.util.HspHostUtil;
|
import com.recovery.common.base.util.HspHostUtil;
|
||||||
|
@ -33,7 +35,21 @@ public class testController {
|
||||||
public ApiResult<UserAuthDTO> cs(@RequestParam String name, HttpServletRequest request) {
|
public ApiResult<UserAuthDTO> cs(@RequestParam String name, HttpServletRequest request) {
|
||||||
UserAuthDTO authDTO = iSysUserService.getByUsername(name);
|
UserAuthDTO authDTO = iSysUserService.getByUsername(name);
|
||||||
log.info("测试库:"+authDTO.getStatus());
|
log.info("测试库:"+authDTO.getStatus());
|
||||||
log.info(redisUtil.get("123").toString());
|
String user = StpUtil.getLoginIdDefaultNull()+"";
|
||||||
|
StpUtil.kickoutByTokenValue(Constants.LOGIN_USRE_TOKEN);
|
||||||
|
// StpUtil.logout();
|
||||||
return ApiResult.ok(authDTO);
|
return ApiResult.ok(authDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cs
|
||||||
|
*/
|
||||||
|
@GetMapping("/cs1")
|
||||||
|
public ApiResult ccss(HttpServletRequest request) {
|
||||||
|
String user = StpUtil.getLoginIdDefaultNull()+"";
|
||||||
|
StpUtil.kickout(StpUtil.getLoginId());
|
||||||
|
// StpUtil.logout();
|
||||||
|
return ApiResult.ok("踢下线");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.recovery.admin.boot.exception;
|
package com.recovery.admin.boot.exception;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.dev33.satoken.exception.NotLoginException;
|
||||||
|
import cn.dev33.satoken.util.SaResult;
|
||||||
import com.recovery.common.base.result.ApiResult;
|
import com.recovery.common.base.result.ApiResult;
|
||||||
import com.recovery.common.base.result.ResultCode;
|
import com.recovery.common.base.result.ResultCode;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -28,6 +30,45 @@ public class GlobalExceptionHandler {
|
||||||
return ApiResult.failed(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), e.getMessage());
|
return ApiResult.failed(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 全局异常拦截(拦截项目中的NotLoginException异常)
|
||||||
|
@ExceptionHandler(NotLoginException.class)
|
||||||
|
public ApiResult handlerNotLoginException(NotLoginException nle)
|
||||||
|
throws Exception {
|
||||||
|
|
||||||
|
// 打印堆栈,以供调试
|
||||||
|
nle.printStackTrace();
|
||||||
|
|
||||||
|
// 判断场景值,定制化异常信息
|
||||||
|
String message = "";
|
||||||
|
if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
|
||||||
|
message = "未能读取到有效 token";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
|
||||||
|
message = "token 无效";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
|
||||||
|
message = "token 已过期";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
|
||||||
|
message = "token 已被顶下线";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
|
||||||
|
message = "token 已被踢下线";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.TOKEN_FREEZE)) {
|
||||||
|
message = "token 已被冻结";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.NO_PREFIX)) {
|
||||||
|
message = "未按照指定前缀提交 token";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
message = "当前会话未登录";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回给前端
|
||||||
|
return ApiResult.failed(message);
|
||||||
|
}
|
||||||
|
|
||||||
//Security
|
//Security
|
||||||
// @ExceptionHandler(value = AccessDeniedException.class)
|
// @ExceptionHandler(value = AccessDeniedException.class)
|
||||||
// public void accessDeniedException(AccessDeniedException e) {
|
// public void accessDeniedException(AccessDeniedException e) {
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package com.recovery.admin.boot.interceptor;
|
package com.recovery.admin.boot.interceptor;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.auth0.jwt.interfaces.DecodedJWT;
|
import com.auth0.jwt.interfaces.DecodedJWT;
|
||||||
|
|
||||||
import com.recovery.admin.boot.exception.BusinessException;
|
import com.recovery.admin.boot.exception.BusinessException;
|
||||||
import com.recovery.admin.boot.filter.RequestWrapper;
|
import com.recovery.admin.boot.filter.RequestWrapper;
|
||||||
|
import com.recovery.common.base.config.redis.RedisCache;
|
||||||
import com.recovery.common.base.constant.Constants;
|
import com.recovery.common.base.constant.Constants;
|
||||||
import com.recovery.common.base.result.ResultCode;
|
import com.recovery.common.base.result.ResultCode;
|
||||||
import com.recovery.common.base.util.RedisUtil;
|
import com.recovery.common.base.util.RedisUtil;
|
||||||
|
@ -27,10 +29,10 @@ import java.util.HashMap;
|
||||||
public class JwtInterceptor implements HandlerInterceptor {
|
public class JwtInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
RedisUtil redisUtil;
|
RedisCache redisCache;
|
||||||
|
|
||||||
public JwtInterceptor(RedisUtil redisUtil) {
|
public JwtInterceptor(RedisCache redisCache) {
|
||||||
this.redisUtil = redisUtil;
|
this.redisCache = redisCache;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||||
|
@ -45,7 +47,10 @@ public class JwtInterceptor implements HandlerInterceptor {
|
||||||
if (StringUtils.isEmpty(token)) {
|
if (StringUtils.isEmpty(token)) {
|
||||||
throw new BusinessException(ResultCode.LOGIN_ERROR);
|
throw new BusinessException(ResultCode.LOGIN_ERROR);
|
||||||
}
|
}
|
||||||
boolean rest = redisUtil.hasKey("userToken:" +token);
|
if (!StpUtil.isLogin()) {
|
||||||
|
throw new BusinessException(ResultCode.IS_LOGIN_EXPIRE_ERROR);
|
||||||
|
}
|
||||||
|
boolean rest = redisCache.isExists(Constants.REDIS_USRE_TOKEN+token);
|
||||||
if (!rest) {
|
if (!rest) {
|
||||||
throw new BusinessException(ResultCode.LOGIN_EXPIRE_ERROR);
|
throw new BusinessException(ResultCode.LOGIN_EXPIRE_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +58,8 @@ public class JwtInterceptor implements HandlerInterceptor {
|
||||||
request.setAttribute(Constants.LOGIN_USRE_TOKEN,token);
|
request.setAttribute(Constants.LOGIN_USRE_TOKEN,token);
|
||||||
try {
|
try {
|
||||||
//如果验证成功放行请求
|
//如果验证成功放行请求
|
||||||
DecodedJWT verify = JwtUtils.verifyToken(token);
|
// DecodedJWT verify = JwtUtils.verifyToken(token);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
|
|
|
@ -59,7 +59,7 @@ public class WebLogAspect {
|
||||||
//切割获取访问目标模块
|
//切割获取访问目标模块
|
||||||
String[] split = path.split("/");
|
String[] split = path.split("/");
|
||||||
String module = split[0];
|
String module = split[0];
|
||||||
System.out.println(RedisUtils.getDBInfoByHostAndModule(stringRedisTemplate,hospitalHost,"admin"));
|
log.info(RedisUtils.getDBInfoByHostAndModule(stringRedisTemplate,hospitalHost,"admin")+"");
|
||||||
//根据域名和请求的模块名查询目标数据库
|
//根据域名和请求的模块名查询目标数据库
|
||||||
HttpSession session = request.getSession();
|
HttpSession session = request.getSession();
|
||||||
/**
|
/**
|
||||||
|
@ -71,6 +71,8 @@ public class WebLogAspect {
|
||||||
//执行完切面后,将线程共享中的数据源名称清空
|
//执行完切面后,将线程共享中的数据源名称清空
|
||||||
@After("webLog()")
|
@After("webLog()")
|
||||||
public void after(JoinPoint joinPoint){
|
public void after(JoinPoint joinPoint){
|
||||||
|
//清除
|
||||||
|
HspHostUtil.clear();
|
||||||
DataSourceContextHolder.clearDBType();
|
DataSourceContextHolder.clearDBType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,10 @@ package com.recovery.auth.config;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
import cn.dev33.satoken.context.SaHolder;
|
||||||
import cn.dev33.satoken.filter.SaServletFilter;
|
import cn.dev33.satoken.filter.SaServletFilter;
|
||||||
|
import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
|
||||||
|
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
|
||||||
import cn.dev33.satoken.same.SaSameUtil;
|
import cn.dev33.satoken.same.SaSameUtil;
|
||||||
|
import cn.dev33.satoken.stp.StpLogic;
|
||||||
import cn.dev33.satoken.util.SaResult;
|
import cn.dev33.satoken.util.SaResult;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
@ -29,4 +32,10 @@ public class SaTokenConfigure implements WebMvcConfigurer {
|
||||||
})
|
})
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sa-Token 整合 jwt (Simple 简单模式)
|
||||||
|
@Bean
|
||||||
|
public StpLogic getStpLogicJwt() {
|
||||||
|
return new StpLogicJwtForSimple();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -8,10 +8,14 @@ import com.recovery.auth.exception.BusinessException;
|
||||||
import com.recovery.auth.feign.UserFeignClient;
|
import com.recovery.auth.feign.UserFeignClient;
|
||||||
import com.recovery.auth.security.details.user.JwtAuthenticationRequest;
|
import com.recovery.auth.security.details.user.JwtAuthenticationRequest;
|
||||||
import com.recovery.auth.service.AuthService;
|
import com.recovery.auth.service.AuthService;
|
||||||
|
import com.recovery.common.base.config.redis.RedisCache;
|
||||||
|
import com.recovery.common.base.constant.Constants;
|
||||||
import com.recovery.common.base.dto.UserAuthDTO;
|
import com.recovery.common.base.dto.UserAuthDTO;
|
||||||
import com.recovery.common.base.dto.UserAuthorityDto;
|
import com.recovery.common.base.dto.UserAuthorityDto;
|
||||||
import com.recovery.common.base.result.ApiResult;
|
import com.recovery.common.base.result.ApiResult;
|
||||||
import com.recovery.common.base.result.ResultCode;
|
import com.recovery.common.base.result.ResultCode;
|
||||||
|
import com.recovery.common.base.util.EncryptUtil;
|
||||||
|
import com.recovery.common.base.util.RedisUtil;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
@ -34,6 +38,8 @@ public class AuthController {
|
||||||
AuthService authService;
|
AuthService authService;
|
||||||
@Resource
|
@Resource
|
||||||
UserFeignClient userFeignClient;
|
UserFeignClient userFeignClient;
|
||||||
|
@Resource
|
||||||
|
RedisCache redisCache;
|
||||||
|
|
||||||
@PostMapping("/token")
|
@PostMapping("/token")
|
||||||
public ApiResult postAccessToken(@RequestBody JwtAuthenticationRequest authenticationRequest, HttpServletRequest request){
|
public ApiResult postAccessToken(@RequestBody JwtAuthenticationRequest authenticationRequest, HttpServletRequest request){
|
||||||
|
@ -48,8 +54,8 @@ public class AuthController {
|
||||||
return ApiResult.ok(map);
|
return ApiResult.ok(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/doLogin")
|
@PostMapping("/doLogin")
|
||||||
public SaResult doLogin(@RequestBody JwtAuthenticationRequest authenticationRequest) {
|
public ApiResult doLogin(@RequestBody JwtAuthenticationRequest authenticationRequest) {
|
||||||
if(StringUtils.isEmpty(authenticationRequest.getUsername())){
|
if(StringUtils.isEmpty(authenticationRequest.getUsername())){
|
||||||
throw new BusinessException("账户不能为空");
|
throw new BusinessException("账户不能为空");
|
||||||
}
|
}
|
||||||
|
@ -62,16 +68,25 @@ public class AuthController {
|
||||||
if (ResultCode.SUCCESS.getCode().equals(result.getCode())) {
|
if (ResultCode.SUCCESS.getCode().equals(result.getCode())) {
|
||||||
userDetails = result.getData();
|
userDetails = result.getData();
|
||||||
}
|
}
|
||||||
// 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
|
// 数据库中查询数据进行比对
|
||||||
if (userDetails.getUserName().equals(authenticationRequest.getUsername()) && userDetails.getPassword().equals(authenticationRequest.getPassword())) {
|
if (userDetails.getUserName().equals(authenticationRequest.getUsername()) && userDetails.getPassword().equals(EncryptUtil.encrypt(authenticationRequest.getPassword()))) {
|
||||||
log.info("密码校验成功!");
|
log.info("密码校验成功!");
|
||||||
StpUtil.login(userDetails.getUserName());
|
StpUtil.login(userDetails.getUserId(),"PC");
|
||||||
}else {
|
}else {
|
||||||
return SaResult.error("密码错误");
|
return ApiResult.failed("密码错误");
|
||||||
|
}
|
||||||
|
//认证通过 使用userid 储存用户信息
|
||||||
|
try {
|
||||||
|
redisCache.put_obj(Constants.REDIS_USRE_INFO + userDetails.getUserId(),userDetails , Constants.REDIS_TOKEN_TIME);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("redis储存token报错"+e.getMessage(),e);
|
||||||
}
|
}
|
||||||
// 第3步,返回给前端
|
// 第3步,返回给前端
|
||||||
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
|
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
|
||||||
return SaResult.ok("登录成功").setData(tokenInfo);
|
HashMap map= new HashMap();
|
||||||
|
map.put("token",tokenInfo.getTokenValue());
|
||||||
|
map.put("user",userDetails);
|
||||||
|
return ApiResult.ok(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @GetMapping("/public-key")
|
// @GetMapping("/public-key")
|
||||||
|
|
|
@ -9,8 +9,8 @@ spring:
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
# metadata:
|
metadata:
|
||||||
# serviceGroup: ytChen
|
serviceGroup: ytChen
|
||||||
server-addr: localhost:8848
|
server-addr: localhost:8848
|
||||||
namespace: 11bfd099-10d6-4f2c-b969-58b76e435cce
|
namespace: 11bfd099-10d6-4f2c-b969-58b76e435cce
|
||||||
config:
|
config:
|
||||||
|
@ -21,3 +21,15 @@ spring:
|
||||||
namespace: 11bfd099-10d6-4f2c-b969-58b76e435cce
|
namespace: 11bfd099-10d6-4f2c-b969-58b76e435cce
|
||||||
server:
|
server:
|
||||||
port: 9001
|
port: 9001
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sa-token:
|
||||||
|
# jwt秘钥
|
||||||
|
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk123
|
||||||
|
token-name: satoken
|
||||||
|
timeout: -1
|
||||||
|
active-timeout: -1
|
||||||
|
is-concurrent: false
|
||||||
|
is-share: false
|
||||||
|
is-log: true
|
||||||
|
|
|
@ -22,7 +22,17 @@ public class Constants {
|
||||||
public final static String UPLOAD_SIZE_ERR_MSG = "上传大小错误";
|
public final static String UPLOAD_SIZE_ERR_MSG = "上传大小错误";
|
||||||
|
|
||||||
|
|
||||||
public static final String LOGIN_USRE_TOKEN = "x-userToken";
|
public static final String LOGIN_USRE_TOKEN = "satoken";
|
||||||
|
|
||||||
|
//token
|
||||||
|
public static final String REDIS_USRE_TOKEN = "satoken:login:token:";
|
||||||
|
|
||||||
|
//用户信息
|
||||||
|
public static final String REDIS_USRE_INFO = "satoken:login:userInfo:";
|
||||||
|
|
||||||
|
//token过期时间 七天
|
||||||
|
public static final Integer REDIS_TOKEN_TIME = 7*24*60*60;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public final static String WHOLE_DOMAIN_REDIS_KEY = "HOE_WHOLE_DOMAIN_REDIS_KEY";
|
public final static String WHOLE_DOMAIN_REDIS_KEY = "HOE_WHOLE_DOMAIN_REDIS_KEY";
|
||||||
|
|
|
@ -22,6 +22,7 @@ public enum ResultCode implements IResultCode, Serializable {
|
||||||
LOGIN_ERROR("1001", "未登录"),
|
LOGIN_ERROR("1001", "未登录"),
|
||||||
|
|
||||||
LOGIN_EXPIRE_ERROR("1002", "登录过期,请重新登录!"),
|
LOGIN_EXPIRE_ERROR("1002", "登录过期,请重新登录!"),
|
||||||
|
IS_LOGIN_EXPIRE_ERROR("1003", "您已被踢下线,请重新登录!"),
|
||||||
SYSTEM_EXECUTION_ERROR("999999", "系统执行出错"),
|
SYSTEM_EXECUTION_ERROR("999999", "系统执行出错"),
|
||||||
USERNAME_OR_PASSWORD_ERROR("A00100", "用户名或密码错误"),
|
USERNAME_OR_PASSWORD_ERROR("A00100", "用户名或密码错误"),
|
||||||
USER_NOT_EXIST("A00101", "用户不存在"),
|
USER_NOT_EXIST("A00101", "用户不存在"),
|
||||||
|
|
|
@ -28,6 +28,9 @@ public class HspHostUtil {
|
||||||
public static void setHspHost(String hspHost) {
|
public static void setHspHost(String hspHost) {
|
||||||
HSP_HSOT.set(hspHost);
|
HSP_HSOT.set(hspHost);
|
||||||
}
|
}
|
||||||
|
public static void clear() {
|
||||||
|
HSP_HSOT.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -54,13 +54,11 @@
|
||||||
<artifactId>httpclient</artifactId>
|
<artifactId>httpclient</artifactId>
|
||||||
<version>4.5.13</version>
|
<version>4.5.13</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc -->
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
<artifactId>sa-token-reactor-spring-boot-starter</artifactId>
|
<artifactId>sa-token-reactor-spring-boot-starter</artifactId>
|
||||||
<version>1.34.0</version>
|
<version>1.37.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import cn.dev33.satoken.reactor.filter.SaReactorFilter;
|
||||||
import cn.dev33.satoken.router.SaRouter;
|
import cn.dev33.satoken.router.SaRouter;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.dev33.satoken.util.SaResult;
|
import cn.dev33.satoken.util.SaResult;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@ -12,31 +13,55 @@ import org.springframework.context.annotation.Configuration;
|
||||||
* [Sa-Token 权限认证] 配置类
|
* [Sa-Token 权限认证] 配置类
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
|
@Slf4j
|
||||||
public class SaTokenConfigure {
|
public class SaTokenConfigure {
|
||||||
// 注册 Sa-Token全局过滤器
|
|
||||||
|
/**
|
||||||
|
* 注册 [Sa-Token全局过滤器]
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public SaReactorFilter getSaReactorFilter() {
|
public SaReactorFilter getSaReactorFilter() {
|
||||||
return new SaReactorFilter()
|
return new SaReactorFilter()
|
||||||
// 拦截地址
|
// 指定 [拦截路由]
|
||||||
.addInclude("/**") /* 拦截全部path */
|
.addInclude("/**") /* 拦截所有path */
|
||||||
// 开放地址
|
// 指定 [放行路由]
|
||||||
.addExclude("/favicon.ico")
|
.addExclude("/favicon.ico")
|
||||||
// 鉴权方法:每次访问进入
|
// 指定[认证函数]: 每次请求执行
|
||||||
.setAuth(obj -> {
|
.setAuth(obj -> {
|
||||||
// 登录校验 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
|
log.info("---------- sa全局认证");
|
||||||
SaRouter.match("/**", "/auth/oauth/doLogin", r -> StpUtil.checkLogin());
|
// SaRouter.match("/test/test", () -> StpUtil.checkLogin());
|
||||||
|
|
||||||
// 权限认证 -- 不同模块, 校验不同权限
|
|
||||||
SaRouter.match("/api/test1", r -> StpUtil.checkPermission("api.test1"));
|
|
||||||
SaRouter.match("/api/test2", r -> StpUtil.checkPermission("api.test2"));
|
|
||||||
SaRouter.match("/api/test3", r -> StpUtil.checkRoleOr("admin", "super"));
|
|
||||||
|
|
||||||
// 更多匹配 ... */
|
|
||||||
})
|
})
|
||||||
// 异常处理方法:每次setAuth函数出现异常时进入
|
// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数
|
||||||
.setError(e -> {
|
.setError(e -> {
|
||||||
|
log.info("---------- sa全局异常 ");
|
||||||
return SaResult.error(e.getMessage());
|
return SaResult.error(e.getMessage());
|
||||||
})
|
})
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
// 注册 Sa-Token全局过滤器
|
||||||
|
// @Bean
|
||||||
|
// public SaReactorFilter getSaReactorFilter() {
|
||||||
|
// return new SaReactorFilter()
|
||||||
|
// // 拦截地址
|
||||||
|
// .addInclude("/**") /* 拦截全部path */
|
||||||
|
// // 开放地址
|
||||||
|
// .addExclude("/favicon.ico")
|
||||||
|
// // 鉴权方法:每次访问进入
|
||||||
|
// .setAuth(obj -> {
|
||||||
|
// // 登录校验 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
|
||||||
|
// SaRouter.match("/**", "/auth/oauth/doLogin", r -> StpUtil.checkLogin());
|
||||||
|
//
|
||||||
|
// // 权限认证 -- 不同模块, 校验不同权限
|
||||||
|
// SaRouter.match("/api/test1", r -> StpUtil.checkPermission("api.test1"));
|
||||||
|
// SaRouter.match("/api/test2", r -> StpUtil.checkPermission("api.test2"));
|
||||||
|
// SaRouter.match("/api/test3", r -> StpUtil.checkRoleOr("admin", "super"));
|
||||||
|
//
|
||||||
|
// // 更多匹配 ... */
|
||||||
|
// })
|
||||||
|
// // 异常处理方法:每次setAuth函数出现异常时进入
|
||||||
|
// .setError(e -> {
|
||||||
|
// return SaResult.error(e.getMessage());
|
||||||
|
// })
|
||||||
|
// ;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,80 +1,80 @@
|
||||||
//package com.recovery.gateway.security;
|
package com.recovery.gateway.security;
|
||||||
//
|
|
||||||
//
|
|
||||||
//import com.recovery.common.base.constant.SecurityConstants;
|
import com.recovery.common.base.constant.SecurityConstants;
|
||||||
//import com.recovery.common.base.result.ResultCode;
|
import com.recovery.common.base.result.ResultCode;
|
||||||
//import com.recovery.gateway.util.ResponseUtils;
|
import com.recovery.gateway.util.ResponseUtils;
|
||||||
//import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
//import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
//import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
//import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
//import org.springframework.security.authentication.AbstractAuthenticationToken;
|
import org.springframework.security.authentication.AbstractAuthenticationToken;
|
||||||
//import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
|
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
|
||||||
//import org.springframework.security.config.web.server.ServerHttpSecurity;
|
import org.springframework.security.config.web.server.ServerHttpSecurity;
|
||||||
//import org.springframework.security.oauth2.jwt.Jwt;
|
import org.springframework.security.oauth2.jwt.Jwt;
|
||||||
//import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
|
||||||
//import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
|
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
|
||||||
//import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter;
|
import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter;
|
||||||
//import org.springframework.security.web.server.SecurityWebFilterChain;
|
import org.springframework.security.web.server.SecurityWebFilterChain;
|
||||||
//import org.springframework.security.web.server.ServerAuthenticationEntryPoint;
|
import org.springframework.security.web.server.ServerAuthenticationEntryPoint;
|
||||||
//import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler;
|
import org.springframework.security.web.server.authorization.ServerAccessDeniedHandler;
|
||||||
//import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
///**
|
/**
|
||||||
// * @author:
|
* @author:
|
||||||
// */
|
*/
|
||||||
//@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
//@Configuration
|
@Configuration
|
||||||
//@EnableWebFluxSecurity
|
@EnableWebFluxSecurity
|
||||||
//public class ResourceServerConfig {
|
public class ResourceServerConfig {
|
||||||
//
|
|
||||||
// private final ResourceServerManager resourceServerManager;
|
private final ResourceServerManager resourceServerManager;
|
||||||
//
|
|
||||||
// @Bean
|
@Bean
|
||||||
// public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
|
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
|
||||||
// http.oauth2ResourceServer().jwt().jwtAuthenticationConverter(jwtAuthenticationConverter());
|
http.oauth2ResourceServer().jwt().jwtAuthenticationConverter(jwtAuthenticationConverter());
|
||||||
// http.oauth2ResourceServer().authenticationEntryPoint(authenticationEntryPoint());
|
http.oauth2ResourceServer().authenticationEntryPoint(authenticationEntryPoint());
|
||||||
// http.authorizeExchange()
|
http.authorizeExchange()
|
||||||
// .anyExchange().access(resourceServerManager)
|
.anyExchange().access(resourceServerManager)
|
||||||
// .and()
|
.and()
|
||||||
// .exceptionHandling()
|
.exceptionHandling()
|
||||||
// .accessDeniedHandler(accessDeniedHandler()) // 处理未授权
|
.accessDeniedHandler(accessDeniedHandler()) // 处理未授权
|
||||||
// .authenticationEntryPoint(authenticationEntryPoint()) //处理未认证
|
.authenticationEntryPoint(authenticationEntryPoint()) //处理未认证
|
||||||
// .and().csrf().disable();
|
.and().csrf().disable();
|
||||||
// return http.build();
|
return http.build();
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * 自定义未授权响应
|
* 自定义未授权响应
|
||||||
// */
|
*/
|
||||||
// @Bean
|
@Bean
|
||||||
// ServerAccessDeniedHandler accessDeniedHandler() {
|
ServerAccessDeniedHandler accessDeniedHandler() {
|
||||||
// return (exchange, denied) -> {
|
return (exchange, denied) -> {
|
||||||
// Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
|
Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
|
||||||
// .flatMap(response -> ResponseUtils.writeErrorInfo(response, ResultCode.ACCESS_UNAUTHORIZED));
|
.flatMap(response -> ResponseUtils.writeErrorInfo(response, ResultCode.ACCESS_UNAUTHORIZED));
|
||||||
// return mono;
|
return mono;
|
||||||
// };
|
};
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// /**
|
/**
|
||||||
// * token无效或者已过期自定义响应
|
* token无效或者已过期自定义响应
|
||||||
// */
|
*/
|
||||||
// @Bean
|
@Bean
|
||||||
// ServerAuthenticationEntryPoint authenticationEntryPoint() {
|
ServerAuthenticationEntryPoint authenticationEntryPoint() {
|
||||||
// return (exchange, e) -> {
|
return (exchange, e) -> {
|
||||||
// Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
|
Mono<Void> mono = Mono.defer(() -> Mono.just(exchange.getResponse()))
|
||||||
// .flatMap(response -> ResponseUtils.writeErrorInfo(response, ResultCode.TOKEN_INVALID_OR_EXPIRED));
|
.flatMap(response -> ResponseUtils.writeErrorInfo(response, ResultCode.TOKEN_INVALID_OR_EXPIRED));
|
||||||
// return mono;
|
return mono;
|
||||||
// };
|
};
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// @Bean
|
@Bean
|
||||||
// public Converter<Jwt, ? extends Mono<? extends AbstractAuthenticationToken>> jwtAuthenticationConverter() {
|
public Converter<Jwt, ? extends Mono<? extends AbstractAuthenticationToken>> jwtAuthenticationConverter() {
|
||||||
// JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
|
JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
|
||||||
// jwtGrantedAuthoritiesConverter.setAuthorityPrefix(SecurityConstants.AUTHORITY_PREFIX);
|
jwtGrantedAuthoritiesConverter.setAuthorityPrefix(SecurityConstants.AUTHORITY_PREFIX);
|
||||||
// jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName(SecurityConstants.JWT_AUTHORITIES_KEY);
|
jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName(SecurityConstants.JWT_AUTHORITIES_KEY);
|
||||||
//
|
|
||||||
// JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
|
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
|
||||||
// jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
|
jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
|
||||||
// return new ReactiveJwtAuthenticationConverterAdapter(jwtAuthenticationConverter);
|
return new ReactiveJwtAuthenticationConverterAdapter(jwtAuthenticationConverter);
|
||||||
// }
|
}
|
||||||
//}
|
}
|
|
@ -1,79 +1,79 @@
|
||||||
//package com.recovery.gateway.security;
|
package com.recovery.gateway.security;
|
||||||
//
|
|
||||||
//import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
//import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
//import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
//
|
|
||||||
//import com.recovery.common.base.constant.GlobalConstants;
|
import com.recovery.common.base.constant.GlobalConstants;
|
||||||
//import com.recovery.common.base.constant.SecurityConstants;
|
import com.recovery.common.base.constant.SecurityConstants;
|
||||||
//import com.recovery.gateway.util.UrlPatternUtils;
|
import com.recovery.gateway.util.UrlPatternUtils;
|
||||||
//import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
//import lombok.Setter;
|
import lombok.Setter;
|
||||||
//import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
//import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
//import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
//import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
//import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
//import org.springframework.security.authorization.AuthorizationDecision;
|
import org.springframework.security.authorization.AuthorizationDecision;
|
||||||
//import org.springframework.security.authorization.ReactiveAuthorizationManager;
|
import org.springframework.security.authorization.ReactiveAuthorizationManager;
|
||||||
//import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
//import org.springframework.security.core.GrantedAuthority;
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
//import org.springframework.security.web.server.authorization.AuthorizationContext;
|
import org.springframework.security.web.server.authorization.AuthorizationContext;
|
||||||
//import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
//import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
//import org.springframework.util.PathMatcher;
|
import org.springframework.util.PathMatcher;
|
||||||
//import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
//
|
|
||||||
//import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
//import java.util.List;
|
import java.util.List;
|
||||||
//import java.util.Map;
|
import java.util.Map;
|
||||||
///**
|
/**
|
||||||
// * Created with IntelliJ IDEA.
|
* Created with IntelliJ IDEA.
|
||||||
// *
|
*
|
||||||
// * @author:
|
* @author:
|
||||||
// * @date: 2021/11/24
|
* @date: 2021/11/24
|
||||||
// * @description:
|
* @description:
|
||||||
// * @modifiedBy:
|
* @modifiedBy:
|
||||||
// * @version: 1.0
|
* @version: 1.0
|
||||||
// */
|
*/
|
||||||
//@Component
|
@Component
|
||||||
//@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
//@Slf4j
|
@Slf4j
|
||||||
//@ConfigurationProperties(prefix = "security")
|
@ConfigurationProperties(prefix = "security")
|
||||||
//public class ResourceServerManager implements ReactiveAuthorizationManager<AuthorizationContext> {
|
public class ResourceServerManager implements ReactiveAuthorizationManager<AuthorizationContext> {
|
||||||
// private final RedisTemplate redisTemplate;
|
private final RedisTemplate redisTemplate;
|
||||||
//
|
|
||||||
// @Setter
|
@Setter
|
||||||
// private List<String> ignoreUrls;
|
private List<String> ignoreUrls;
|
||||||
//
|
|
||||||
// @Override
|
@Override
|
||||||
// public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
|
public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
|
||||||
// ServerHttpRequest request = authorizationContext.getExchange().getRequest();
|
ServerHttpRequest request = authorizationContext.getExchange().getRequest();
|
||||||
// if (request.getMethod() == HttpMethod.OPTIONS) { // 预检请求放行
|
if (request.getMethod() == HttpMethod.OPTIONS) { // 预检请求放行
|
||||||
// return Mono.just(new AuthorizationDecision(true));
|
return Mono.just(new AuthorizationDecision(true));
|
||||||
|
}
|
||||||
|
PathMatcher pathMatcher = new AntPathMatcher();
|
||||||
|
String method = request.getMethodValue();
|
||||||
|
String path = request.getURI().getPath();
|
||||||
|
|
||||||
|
// 跳过token校验,放在这里去做是为了能够动态刷新
|
||||||
|
// if (skipValid(path)) {
|
||||||
|
return Mono.just(new AuthorizationDecision(true));
|
||||||
// }
|
// }
|
||||||
// PathMatcher pathMatcher = new AntPathMatcher();
|
}
|
||||||
// String method = request.getMethodValue();
|
|
||||||
// String path = request.getURI().getPath();
|
/**
|
||||||
//
|
* 跳过校验
|
||||||
// // 跳过token校验,放在这里去做是为了能够动态刷新
|
*
|
||||||
//// if (skipValid(path)) {
|
* @param path
|
||||||
// return Mono.just(new AuthorizationDecision(true));
|
* @return
|
||||||
//// }
|
*/
|
||||||
// }
|
private boolean skipValid(String path) {
|
||||||
//
|
for (String skipPath : ignoreUrls) {
|
||||||
// /**
|
if (UrlPatternUtils.match(skipPath, path)) {
|
||||||
// * 跳过校验
|
return true;
|
||||||
// *
|
}
|
||||||
// * @param path
|
}
|
||||||
// * @return
|
return false;
|
||||||
// */
|
}
|
||||||
// private boolean skipValid(String path) {
|
}
|
||||||
// for (String skipPath : ignoreUrls) {
|
|
||||||
// if (UrlPatternUtils.match(skipPath, path)) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//}
|
|
|
@ -1,69 +1,57 @@
|
||||||
//package com.recovery.gateway.security;
|
package com.recovery.gateway.security;
|
||||||
//
|
|
||||||
//import cn.dev33.satoken.same.SaSameUtil;
|
import cn.dev33.satoken.same.SaSameUtil;
|
||||||
//import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
//
|
|
||||||
//import com.nimbusds.jose.JWSObject;
|
import com.nimbusds.jose.JWSObject;
|
||||||
//import com.recovery.common.base.constant.SecurityConstants;
|
import com.recovery.common.base.constant.SecurityConstants;
|
||||||
//import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
//import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
//import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
//import org.apache.logging.log4j.util.Strings;
|
import org.apache.logging.log4j.util.Strings;
|
||||||
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||||
//import org.springframework.cloud.gateway.filter.GlobalFilter;
|
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||||
//import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
//import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
//import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
//import org.springframework.http.server.reactive.ServerHttpResponse;
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||||
//import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
//import org.springframework.web.server.ServerWebExchange;
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
//import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
//
|
|
||||||
//import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
///**
|
/**
|
||||||
// * Created with IntelliJ IDEA.
|
* Created with IntelliJ IDEA.
|
||||||
// *
|
*
|
||||||
// * @author: AI码师 关注公众号"AI码师"获取完整源码
|
* @author:
|
||||||
// * @date: 2021/11/24
|
* @date: 2021/11/24
|
||||||
// * @description:
|
* @description:
|
||||||
// * @modifiedBy:
|
* @modifiedBy:
|
||||||
// * @version: 1.0
|
* @version: 1.0
|
||||||
// */
|
*/
|
||||||
//@Component
|
@Component
|
||||||
//@Slf4j
|
@Slf4j
|
||||||
//@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
//public class SecurityGlobalFilter implements GlobalFilter, Ordered {
|
public class SecurityGlobalFilter implements GlobalFilter, Ordered {
|
||||||
//
|
|
||||||
// @SneakyThrows
|
@SneakyThrows
|
||||||
// @Override
|
@Override
|
||||||
// public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||||
//
|
|
||||||
// ServerHttpRequest request = exchange.getRequest();
|
ServerHttpRequest request = exchange.getRequest();
|
||||||
// log.info("接受到请求地址:"+request.getURI());
|
log.info("接受到请求地址:"+request.getURI());
|
||||||
// ServerHttpResponse response = exchange.getResponse();
|
ServerHttpResponse response = exchange.getResponse();
|
||||||
// // 不是正确的的JWT不做解析处理
|
// 为请求追加 Same-Token 参数
|
||||||
// String token = request.getHeaders().getFirst(SecurityConstants.AUTHORIZATION_KEY);
|
request.mutate()
|
||||||
// if (StrUtil.isBlank(token) || !StrUtil.startWithIgnoreCase(token, SecurityConstants.JWT_PREFIX)) {
|
// 为请求追加 Same-Token 参数
|
||||||
// return chain.filter(exchange);
|
.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken())
|
||||||
// }
|
.build();
|
||||||
// // 为请求追加 Same-Token 参数
|
exchange = exchange.mutate().request(request).build();
|
||||||
// request.mutate()
|
return chain.filter(exchange);
|
||||||
// // 为请求追加 Same-Token 参数
|
}
|
||||||
// .header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken())
|
|
||||||
// .build();
|
@Override
|
||||||
// //结束
|
public int getOrder() {
|
||||||
// // 解析JWT获取jti,以jti为key判断redis的黑名单列表是否存在,存在则拦截访问
|
return 0;
|
||||||
// token = StrUtil.replaceIgnoreCase(token, SecurityConstants.JWT_PREFIX, Strings.EMPTY);
|
}
|
||||||
// String payload = StrUtil.toString(JWSObject.parse(token).getPayload());
|
}
|
||||||
// request = exchange.getRequest().mutate()
|
|
||||||
// .header(SecurityConstants.JWT_PAYLOAD_KEY, URLEncoder.encode(payload, "UTF-8"))
|
|
||||||
// .build();
|
|
||||||
// exchange = exchange.mutate().request(request).build();
|
|
||||||
// return chain.filter(exchange);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public int getOrder() {
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
//}
|
|
8
pom.xml
8
pom.xml
|
@ -24,7 +24,7 @@
|
||||||
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
|
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
|
||||||
<spring-boot.version>2.5.4</spring-boot.version>
|
<spring-boot.version>2.5.4</spring-boot.version>
|
||||||
<hoe-version>1.0.0</hoe-version>
|
<hoe-version>1.0.0</hoe-version>
|
||||||
<hutool-version>5.5.8</hutool-version>
|
<hutool-version>5.7.14</hutool-version>
|
||||||
<mysql.version>8.0.22</mysql.version>
|
<mysql.version>8.0.22</mysql.version>
|
||||||
<druid.version>1.2.4</druid.version>
|
<druid.version>1.2.4</druid.version>
|
||||||
<mybatis-plus.version>3.4.3</mybatis-plus.version>
|
<mybatis-plus.version>3.4.3</mybatis-plus.version>
|
||||||
|
@ -52,6 +52,12 @@
|
||||||
<artifactId>sa-token-redis-jackson</artifactId>
|
<artifactId>sa-token-redis-jackson</artifactId>
|
||||||
<version>1.37.0</version>
|
<version>1.37.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Sa-Token 整合 jwt -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.dev33</groupId>
|
||||||
|
<artifactId>sa-token-jwt</artifactId>
|
||||||
|
<version>1.37.0</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-pool2</artifactId>
|
<artifactId>commons-pool2</artifactId>
|
||||||
|
|
Loading…
Reference in New Issue