转载

Spring Cloud OAuth 无Token调用源码封装 原 荐

冷冷沉思录 J2EE

正文

【重构】Spring Cloud OAuth 无Token调用源码封装

Spring Cloud OAuth 无Token调用源码封装 原 荐
  冷冷gg 发布于 48分钟前

字数 829

阅读 49

收藏 0

Spring OAuth Spring Cloud

开发四年只会写业务代码,分布式高并发都不会还做程序员?>>> Spring Cloud OAuth 无Token调用源码封装 原 荐

背景

重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。

书接上回 Spring Security OAuth 微服务内部Token传递的源码解析 ,本篇主要 无token 调用过程中,代码的不断完善及其重构过程

需求很简单如下图,如果资源服务器的提供的接口,客户端不需要身份验证即不需要携带合法令牌也能访问,并且可以实现远程调用的安全性校验。 Spring Cloud OAuth 无Token调用源码封装 原 荐

第一版本

资源服务器设置接口permitall,配置ignore url 即可

ignore-urls:
- /actuator/**
- /v2/api-docs

Spring Cloud OAuth 无Token调用源码封装 原 荐

保证A对外暴露,A --> B 暴露的服务接口安全

  • 自定义@Inner
  • 校验逻辑,判断接口请求中是否含有 XX 请求头
/**
 * @author lengleng
 * <p>
 * 服务间接口不鉴权处理逻辑
 */
@Slf4j
@Aspect
@Component
@AllArgsConstructor
public class PigxSecurityInnerAspect {
	private final HttpServletRequest request;

	@SneakyThrows
	@Around("@annotation(inner)")
	public Object around(ProceedingJoinPoint point, Inner inner) {
		String header = request.getHeader(SecurityConstants.FROM);
		if (inner.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) {
			log.warn("访问接口 {} 没有权限", point.getSignature().getName());
			throw new AccessDeniedException("Access is denied");
		}
		return point.proceed();
	}

}
  • 网关请求含有XX 的请求头,避免伪造
public class PigxRequestGlobalFilter implements GlobalFilter, Ordered {
	private static final String HEADER_NAME = "X-Forwarded-Prefix";

	/**
	 * Process the Web request and (optionally) delegate to the next
	 * {@code WebFilter} through the given {@link GatewayFilterChain}.
	 *
	 * @param exchange the current server exchange
	 * @param chain    provides a way to delegate to the next filter
	 * @return {@code Mono<Void>} to indicate when request processing is complete
	 */
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		// 1. 清洗请求头中from 参数
		ServerHttpRequest request = exchange.getRequest().mutate()
			.headers(httpHeaders -> {httpHeaders.remove(SecurityConstants.FROM);})
			.build();
		return chain.filter(exchange.mutate()
				.request(newRequest.mutate()
						.header(HEADER_NAME, basePath)
						.build()).build());
	}

	@Override
	public int getOrder() {
		return -1000;
	}
}
  • 接口使用,首先声明 B服务的这个接口对外暴露
ignore-urls:
- /info/*
  • 接口使用,然后在 B服务的这个接口 添加@Inner注解
@Inner
@GetMapping("/info/{username}")
public R info(@PathVariable String username) {

}

重构

  • 上边第一版本的问题是,对于A/B 资源服务想对外暴露的接口,需要两步
  1. 声明在ResourceServerConfigurerAdapter 的 permitall
  2. B服务要再次添加@inner 注解

实现@Inner 一步到位到位

  • 在ignoreU日历 获取全部Controller 中,标志@Inner 注解的请求,自动维护到忽略的URL,减少开发配置
public class PermitAllUrlProperties implements InitializingBean {
	private static final Pattern PATTERN = Pattern.compile("//{(.*?)//}");
	@Autowired
	private WebApplicationContext applicationContext;

	@Getter
	@Setter
	private List<String> ignoreUrls = new ArrayList<>();

	@Override
	public void afterPropertiesSet() {
		RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
		Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();

		map.keySet().forEach(info -> {
			HandlerMethod handlerMethod = map.get(info);

			// 获取方法上边的注解 替代path variable 为 *
			Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class);
			Optional.ofNullable(method)
					.ifPresent(inner -> info.getPatternsCondition().getPatterns()
							.forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, StringPool.ASTERISK))));
		});

	}
}
  • 核心是通过RequestMappingHandlerMapping 获取全部的路由配置,然后对 Requestmappint 设置的URL 进行规则替换,然后添加到 ignoreurl中,然后在注入到 ResourceServerConfigurerAdapter 进行permitall
  • 使用时候,如果是外部暴露
@Inner(value=false)
  • 如果仅是服务内部调用暴露
@Inner

总结

  • 以上源码参考个人项目 基于Spring Cloud、OAuth2.0开发基于Vue前后分离的开发平台
  • QQ: 2270033969 一起来聊聊你们是咋用 spring cloud 的吧。

Spring Cloud OAuth 无Token调用源码封装 原 荐

欢迎关注我们获得更多的好玩JavaEE 实践

© 著作权归作者所有

上一篇: Spring的事务传播行为

下一篇: Spring Cloud OAuth 实现微服务内部Token传递的源码解析

Spring Cloud OAuth 无Token调用源码封装 原 荐

冷冷gg

Spring Cloud OAuth 无Token调用源码封装 原 荐
Spring Cloud OAuth 无Token调用源码封装 原 荐

初出茅庐

我们都是从 Hello World 开始的!

领取条件:技能积分大于 200,且被推荐的博客数量大于 3 篇。

粉丝 562

博文 125

码字总数 64261

作品 1

潍坊

UI设计师

提问

相关文章 最新文章

Spring Security 官方文档学习路径

Spring 目前有三个层次的项目,Spring Framework层,Spring Boot层和Spring Cloud层。这三个层次的项目里都有Spring Security的东西,在加上安全和权限控制这块是大多数人的一个弱项,导致官...

写bug的攻城狮

2018/10/25

0

0

Spring Cloud云架构 - commonservice-sso服务搭建(一)

前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...

明理萝

2018/06/07

0

0

Spring cloud oauth2.0学习总结

因为项目需要,调研并使用了Spring cloud oauth2.0,网上关于oauth2.0的介绍很多,包括交互的流程等等。这里,我不再介绍这些,直接深入讲解,并附上实践代码。希望能对大家有帮助。 相关链接...

菜鸟很菜

2017/04/14

0

0

Spring Cloud OAuth 无Token调用源码封装 原 荐
(十五) 整合spring cloud云架构 - commonservice-sso服务搭建(一)

前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...

SpringCloud关注者

2018/09/22

0

0

Spring Cloud OAuth 微服务内部Token传递的源码实现解析

背景分析 1.客户端携带认证中心发放的token,请求资源服务器A(Spring Security OAuth 发放Token 源码解析) 2.客户端携带令牌直接访问资源服务器,资源服务器通过对token 的校验 (Spring Cl...

gggggwww

04/17

0

0

Spring Cloud OAuth 无Token调用源码封装 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider

30分钟前

1

0

Spring Cloud OAuth 无Token调用源码封装 原 荐
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤

34分钟前

2

0

关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区

42分钟前

3

0

Spring Cloud OAuth 无Token调用源码封装 原 荐
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg

48分钟前

49

0

Spring Cloud OAuth 无Token调用源码封装 原 荐
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool

57分钟前

3

0

Spring Cloud OAuth 无Token调用源码封装 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
原文  https://my.oschina.net/giegie/blog/3040796
正文到此结束
Loading...