博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring security oauth2授权服务器自定义redirectUri匹配规则
阅读量:2216 次
发布时间:2019-05-07

本文共 4272 字,大约阅读时间需要 14 分钟。

在spring security中授权服务器的默认匹配规则是全路径匹配

详见源码 AuthorizationEndpoint.authorize
redirectResolver.resolveRedirect(redirectUriParameter, client);

@RequestMapping(value = "/oauth/authorize")	public ModelAndView authorize(Map
model, @RequestParam Map
parameters, //...省略 // The resolved redirect URI is either the redirect_uri from the parameters or the one from // clientDetails. Either way we need to store it on the AuthorizationRequest. String redirectUriParameter = authorizationRequest.getRequestParameters().get(OAuth2Utils.REDIRECT_URI); String resolvedRedirect = redirectResolver.resolveRedirect(redirectUriParameter, client); if (!StringUtils.hasText(resolvedRedirect)) {
throw new RedirectMismatchException( "A redirectUri must be either supplied or preconfigured in the ClientDetails"); } authorizationRequest.setRedirectUri(resolvedRedirect);//...省略 }

默认匹配解析器 DefaultRedirectResolver

protected boolean redirectMatches(String requestedRedirect, String redirectUri) {
UriComponents requestedRedirectUri = UriComponentsBuilder.fromUriString(requestedRedirect).build(); String requestedRedirectUriScheme = (requestedRedirectUri.getScheme() != null ? requestedRedirectUri.getScheme() : ""); String requestedRedirectUriHost = (requestedRedirectUri.getHost() != null ? requestedRedirectUri.getHost() : ""); String requestedRedirectUriPath = (requestedRedirectUri.getPath() != null ? requestedRedirectUri.getPath() : ""); UriComponents registeredRedirectUri = UriComponentsBuilder.fromUriString(redirectUri).build(); String registeredRedirectUriScheme = (registeredRedirectUri.getScheme() != null ? registeredRedirectUri.getScheme() : ""); String registeredRedirectUriHost = (registeredRedirectUri.getHost() != null ? registeredRedirectUri.getHost() : ""); String registeredRedirectUriPath = (registeredRedirectUri.getPath() != null ? registeredRedirectUri.getPath() : ""); boolean portsMatch = this.matchPorts ? (registeredRedirectUri.getPort() == requestedRedirectUri.getPort()) : true; return registeredRedirectUriScheme.equals(requestedRedirectUriScheme) && hostMatches(registeredRedirectUriHost, requestedRedirectUriHost) && portsMatch && // Ensure exact path matching registeredRedirectUriPath.equals(StringUtils.cleanPath(requestedRedirectUriPath)); }

从最后registeredRedirectUriPath.equals(StringUtils.cleanPath(requestedRedirectUriPath));这句看出来默认的规则就是全路径匹配。

我们如果需要自定义就直接写个类实现RedirectResolver接口 直接copy这个类 定义一个 antMatcher然后替换这个判断就好了
修改如下:

protected boolean redirectMatches(String requestedRedirect, String redirectUri) {
UriComponents requestedRedirectUri = UriComponentsBuilder.fromUriString(requestedRedirect).build(); String requestedRedirectUriScheme = (requestedRedirectUri.getScheme() != null ? requestedRedirectUri.getScheme() : ""); String requestedRedirectUriHost = (requestedRedirectUri.getHost() != null ? requestedRedirectUri.getHost() : ""); String requestedRedirectUriPath = (requestedRedirectUri.getPath() != null ? requestedRedirectUri.getPath() : ""); UriComponents registeredRedirectUri = UriComponentsBuilder.fromUriString(redirectUri).build(); String registeredRedirectUriScheme = (registeredRedirectUri.getScheme() != null ? registeredRedirectUri.getScheme() : ""); String registeredRedirectUriHost = (registeredRedirectUri.getHost() != null ? registeredRedirectUri.getHost() : ""); String registeredRedirectUriPath = (registeredRedirectUri.getPath() != null ? registeredRedirectUri.getPath() : ""); boolean portsMatch = this.matchPorts ? (registeredRedirectUri.getPort() == requestedRedirectUri.getPort()) : true; return registeredRedirectUriScheme.equals(requestedRedirectUriScheme) && hostMatches(registeredRedirectUriHost, requestedRedirectUriHost) && portsMatch && // Ensure exact path matching pathMatcher(registeredRedirectUriPath,StringUtils.cleanPath(requestedRedirectUriPath)); } private boolean pathMatcher(String requestPath,String registeredPath){
AntPathMatcher antPathMatcher = new AntPathMatcher(); return antPathMatcher.matchStart(registeredPath, requestPath); }

这样即可与github 等站点的匹配规则一致

转载地址:http://hpkfb.baihongyu.com/

你可能感兴趣的文章
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术3:初探分布式协调服务zookeeper
查看>>
搞懂分布式技术4:ZAB协议概述与选主流程详解
查看>>
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>
搞懂分布式技术16:浅谈分布式锁的几种方案
查看>>
搞懂分布式技术17:浅析分布式事务
查看>>
搞懂分布式技术18:分布式事务常用解决方案
查看>>
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
查看>>
搞懂分布式技术20:消息队列因何而生
查看>>
搞懂分布式技术21:浅谈分布式消息技术 Kafka
查看>>
后端技术杂谈1:搜索引擎基础倒排索引
查看>>
后端技术杂谈2:搜索引擎工作原理
查看>>
后端技术杂谈3:Lucene基础原理与实践
查看>>