各个微服务认证授权的处理方法
2023-06-13 09:16:15 时间
1.通过认证授权模块进行登录
在这里我们默认登录都是可以正常获取token令牌的,也就是都是登录成功的
2.微服务网关(SpringGateway)
在该微服务中我们通过拦截器链接请求,通过该请求是排除过滤的 uri 地址(例如:登录请求/auth/login),则放行该请求,否则则进行token认证,在这里我们有2种认证方式: 2.1 网关统一认证授权(本次不介绍该模式) 该模式需要使用redis进行缓存所有的认证路径和所有路径所需要的角色权限信息,最后在网关中统一鉴权,其他微服务不进行鉴权处理。
2.2 网关检验Token是否合法,在其他需要鉴权的微服务中注入【公共拦截器】进行统一的鉴权处理 1.网关中的具体代码操作
@Component
public class AuthFilter implements GlobalFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
// 排除过滤的 uri 地址
@Autowired
private IgnoreWhiteProperties ignoreWhite;
@Autowired
private RedisService redisService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest.Builder mutate = request.mutate();
String url = request.getURI().getPath();
// 跳过不需要验证的路径
if (StringUtils.matches(url, ignoreWhite.getWhites())) {
return chain.filter(exchange);
}
//检验Token是否合法
// 获取token令牌,具体获取方法不做介绍
String token = getToken(request);
// 1.判断token是否为空
if (StringUtils.isEmpty(token)) {
return unauthorizedResponse(exchange, "令牌不能为空");
}
// 解析token令牌,过期或无效则返回null
Claims claims = JwtUtils.parseToken(token);
//判断令牌是否有些
if (claims == null) {
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
}
//TODO 其他处理
//TODO 设置解析的用户信息到请求头中
return chain.filter(exchange.mutate().request(mutate.build()).build());
}
private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
}
}
2.公共模块中的拦截器操作
public class HeaderInterceptor implements AsyncHandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true;
}
//获取网关中传过来的参数
String userKey = ServletUtils.getHeader(request, SecurityConstants.USER_KEY);
SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
//调用方法,获取令牌
String token = SecurityUtils.getToken();
//解析token令牌
if (StringUtils.isNotEmpty(token)) {
//进行令牌获取用户信息
LoginUser loginUser = AuthUtil.getLoginUser(token);
if (StringUtils.isNotNull(loginUser)) {
AuthUtil.verifyLoginUserExpire(loginUser);
//把用户信息注入服务上下文中
SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser);
}
}
return true;
}
到此方法二中的微服务认证授权的处理方法已完成
相关文章
- WiFi 的认证方法
- (译)SPIRE 拓扑、联邦认证和部署规模
- 第三方 API 接口安全加密方法和认证
- 使用Zuul实现安全和认证(二)
- 关于Mongodb 认证鉴权你需要知道的一些事
- mongodb 3.4下远程连接认证失败的解决方法
- 动态添加Redis密码认证的方法
- Oracle认证考试指南:突破考试之路(oracle认证考试指南)
- 以 Oracle 身份认证保障数据安全(oracle身份认证)
- 认证Linux FTP服务器的用户认证方法(linuxftp用户)
- JSP Request.getAuthType()方法:返回保护servlet的认证方案名
- 小米11T获认证:搭载联发科天玑芯片
- 25字中文文章标题:如何高效备考Linux认证考试试题(linux认证考试试题)
- Oracle的认证有哪些?(oracle哪些认证)
- 走上OCP之路:Oracle数据库专家认证体系(Oracle的OCp)
- 本地Redis搭建登录认证方案实践(redis配置本地登录)
- 通过Redis远程实现安全认证链接(redis远程认证链接)
- 安全可靠的Oracle SSL认证方式(oracle ssl验证)
- Redis集群架构实现JWT认证(redis集群jwt)
- 使用Redis集群构建安全的JWT认证系统(redis集群jwt)
- Oracle认证保护数据的有效方法(oracle auth)
- php创建基本身份认证站点的方法详解
- 一个简单的ASP.NETForms身份认证的实例方法