正文
【重构】Spring Cloud OAuth 无Token调用源码封装
原
荐
字数 829
阅读 49
收藏 0
Spring OAuth Spring Cloud
开发四年只会写业务代码,分布式高并发都不会还做程序员?>>>
重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。
书接上回 Spring Security OAuth 微服务内部Token传递的源码解析 ,本篇主要 无token 调用过程中,代码的不断完善及其重构过程 。
需求很简单如下图,如果资源服务器的提供的接口,客户端不需要身份验证即不需要携带合法令牌也能访问,并且可以实现远程调用的安全性校验。
ignore-urls: - /actuator/** - /v2/api-docs
/**
* @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();
}
}
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;
}
}
ignore-urls: - /info/*
@Inner
@GetMapping("/info/{username}")
public R info(@PathVariable String username) {
}
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))));
});
}
}
@Inner(value=false)
@Inner
欢迎关注我们获得更多的好玩JavaEE 实践
© 著作权归作者所有
上一篇: Spring的事务传播行为
下一篇: Spring Cloud OAuth 实现微服务内部Token传递的源码解析
我们都是从 Hello World 开始的!
领取条件:技能积分大于 200,且被推荐的博客数量大于 3 篇。
粉丝 562
博文 125
码字总数 64261
作品 1
潍坊
UI设计师
提问相关文章 最新文章
Spring 目前有三个层次的项目,Spring Framework层,Spring Boot层和Spring Cloud层。这三个层次的项目里都有Spring Security的东西,在加上安全和权限控制这块是大多数人的一个弱项,导致官...
写bug的攻城狮
2018/10/25
0
0
前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...
明理萝
2018/06/07
0
0
因为项目需要,调研并使用了Spring cloud oauth2.0,网上关于oauth2.0的介绍很多,包括交互的流程等等。这里,我不再介绍这些,直接深入讲解,并附上实践代码。希望能对大家有帮助。 相关链接...
菜鸟很菜
2017/04/14
0
0
前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将...
SpringCloud关注者
2018/09/22
0
0
背景分析 1.客户端携带认证中心发放的token,请求资源服务器A(Spring Security OAuth 发放Token 源码解析) 2.客户端携带令牌直接访问资源服务器,资源服务器通过对token 的校验 (Spring Cl...
gggggwww
04/17
0
0
没有更多内容
加载失败,请刷新页面
加载更多经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...
forespider
30分钟前
1
0
<!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 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...
Jenkins中文社区
42分钟前
3
0
背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...
冷冷gg
48分钟前
49
0
苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...
linuxCool
57分钟前
3
0
没有更多内容
加载失败,请刷新页面
加载更多