Spring Security Oauth2系列(七)
摘要:
今天来给大家分享一下期待已久的oauth2回调地址的设置,相信接触过oauth2的很多coder已经按捺不住激动的心情了吧。因为这个回调地址的配置能够让授权码模式的运用的主动权掌握在自己的手中,可以根据自己的不同项目的实际情况设置不同的回调,例如社区的GitHub的示例:Spring Cloud Security系列教程一:入门
DefaultRedirectResolver
首先分析一下org.springframework.security.oauth2.provider.endpoint.DefaultRedirectResolver源码:
public String resolveRedirect(String requestedRedirect, ClientDetails client) throws OAuth2Exception {Set<String> authorizedGrantTypes = client.getAuthorizedGrantTypes();if (authorizedGrantTypes.isEmpty()) {throw new InvalidGrantException("A client must have at least one authorized grant type.");} else if (!this.containsRedirectGrantType(authorizedGrantTypes)) {throw new InvalidGrantException("A redirect_uri can only be used by implicit or authorization_code grant types.");} else {Set<String> redirectUris = client.getRegisteredRedirectUri();if (redirectUris != null && !redirectUris.isEmpty()) {return this.obtainMatchingRedirect(redirectUris, requestedRedirect);} else if (StringUtils.hasText(requestedRedirect)) {return requestedRedirect;} else {throw new InvalidRequestException("A redirect_uri must be supplied.");}}}
对重定向路径进行解析,如果不进行设置默认就是当前路径,这里指的当前路径是指:比如当你在访问security进行了权限控制的路径http://localhost:8080/client
时候,跳转到oauth2的登陆首页,此时当前页面指的就是http://localhost:8080/client
private String obtainMatchingRedirect(Set<String> redirectUris, String requestedRedirect) {Assert.notEmpty(redirectUris, "Redirect URIs cannot be empty");if (redirectUris.size() == 1 && requestedRedirect == null) {return (String)redirectUris.iterator().next();} else {Iterator var3 = redirectUris.iterator();String redirectUri;do {if (!var3.hasNext()) {throw new RedirectMismatchException("Invalid redirect: " + requestedRedirect + " does not match one of the registered values: " + redirectUris.toString());}redirectUri = (String)var3.next();} while(requestedRedirect == null || !this.redirectMatches(requestedRedirect, redirectUri));return requestedRedirect;}}
这个方法是来判断客户端的设置回调地址是否和服务端的回调地址一致
AbstractRedirectResourceDetails
核心方法解析,AbstractRedirectResourceDetails
是一个抽象类,位于
org.springframework.security.oauth2.client.token.grant.redirect.AbstractRedirectResourceDetails
一起来看源代码吧
package org.springframework.security.oauth2.client.token.grant.redirect;import org.springframework.security.oauth2.client.resource.BaseOAuth2ProtectedResourceDetails;
import org.springframework.security.oauth2.client.token.AccessTokenRequest;public abstract class AbstractRedirectResourceDetails extends BaseOAuth2ProtectedResourceDetails {private String preEstablishedRedirectUri;private String userAuthorizationUri;private boolean useCurrentUri = true;public AbstractRedirectResourceDetails() {}public void setUseCurrentUri(boolean useCurrentUri) {this.useCurrentUri = useCurrentUri;}public boolean isUseCurrentUri() {return this.useCurrentUri;}public String getUserAuthorizationUri() {return this.userAuthorizationUri;}public void setUserAuthorizationUri(String userAuthorizationUri) {this.userAuthorizationUri = userAuthorizationUri;}public String getPreEstablishedRedirectUri() {return this.preEstablishedRedirectUri;}public void setPreEstablishedRedirectUri(String preEstablishedRedirectUri) {//此处可以在客户端进行自定义设置this.preEstablishedRedirectUri = preEstablishedRedirectUri;}public String getRedirectUri(AccessTokenRequest request) {String redirectUri = (String)request.getFirst("redirect_uri");if (redirectUri == null && request.getCurrentUri() != null && this.useCurrentUri) {redirectUri = request.getCurrentUri();}if (redirectUri == null && this.getPreEstablishedRedirectUri() != null) {redirectUri = this.getPreEstablishedRedirectUri();}//返回回调地址return redirectUri;}
}
源码特别简单,这里不做过多的解释,部分关键配置我给大家贴出来
我的网关服务配置如下:
security:oauth2:client:client-id: fbed1d1b4b1449daa4bc49397cbe2350client-secret: fbed1d1b4b1449daa4bc49397cbe2350access-token-uri: http://localhost:8088/oauth/tokenuser-authorization-uri: http://localhost:8088/oauth/authorizescope: read,writepre-established-redirect-uri: http://localhost:8080/sessionuse-current-uri: false//此处特别重要一定要配置,否则不会生效,配置了自定义的回调地址就必须将默认的回调禁止,原因不做过多说明。resource:user-info-uri: http://localhost:8088/userprefer-token-info: false
我的oauth2关键配置如下:
@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("fbed1d1b4b1449daa4bc49397cbe2350").authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit").authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT").scopes("read","write").secret("fbed1d1b4b1449daa4bc49397cbe2350").accessTokenValiditySeconds(120)//Access token is only valid for 2 minutes..refreshTokenValiditySeconds(600)//Refresh token is only valid for 10 minutes..redirectUris("http://localhost:8080/session");}
总结:
该篇文章主要讲了oauth2 的回调地址,相信是大家期待已久的功能点了,由于工作上的原因,完成这个分析的主要功能还是我的一个朋友张顺,有问题的大家继续在评论上提出来,希望能够在今后的项目实践中将oauth2的优势体现得淋漓尽致!
参考本人github地址:https://github.com/dqqzj/spring4all/tree/master/oauth2
Spring Security Oauth2系列(七)相关推荐
- 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...
- Spring Security Oauth2 token 续期
本文参考以下文章.该文章作者有很多优秀文章,需要的小伙伴可以去看看. Spring Security系列(27)- Spring Security Oauth2之令牌过期和续签问题解决方案(1)_云烟 ...
- 从零开始超详细的Spring Security OAuth2.0实现分布式系统授权(注册中心+网关+认证授权服务(JWT令牌验证)+资源调用服务)
文章目录 一.OAuth2.0 1.介绍 2.例子 3.执行流程 二.Spring Cloud Security OAuth2 1.环境介绍 2.认证流程 三.整合分布式项目 1.技术方案 2.项目结 ...
- java oauth sso 源码_基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践
概 述 在前文<基于Spring Security和 JWT的权限系统设计>之中已经讨论过基于 Spring Security和 JWT的权限系统用法和实践,本文则进一步实践一下基于 Sp ...
- Spring Security OAuth2 Demo -- good
1. 添加依赖 授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency><groupId>org.springframework ...
- refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
原标题:「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token 前言:Spring Cloud 分布式中的登录如何可视化的管理目前下发的令牌.使用情况. ...
- Spring Security OAuth2——自定义OAuth2第三方登录(Gitee)并与UsernamePassword登录关联解决方案
前文:Spring Security OAuth2--自定义OAuth2第三方登录(Gitee) Maven 主要 <!--Spring Security--><dependency ...
- nacos oaut服务地址_用户认证的例子:Spring Security oAuth2 + Spring Cloud Gateway + Nacos + Dubbo...
这个例子是商城后台项目的一部分,主要使用了oAuth2的密码模式完成用户名密码认证功能.主要流程是:使用Nacos作为注册中心,操作用户的服务user-mgr-service作为服务提供者,注册到Na ...
- 基于 Spring Security OAuth2和 JWT 构建保护微服务系统
我们希望自己的微服务能够在用户登录之后才可以访问,而单独给每个微服务单独做用户权限模块就显得很弱了,从复用角度来说是需要重构的,从功能角度来说,也是欠缺的.尤其是前后端完全分离之后,我们的用户信息不一 ...
最新文章
- 【SQL学习笔记】一、select语句
- 闪存我自己来——HDS公布闪存路线图
- “新内容 新交互”全球视频云创新挑战赛复赛启幕
- nginx之worker进程个数
- java接收post文件_java – 如何发送POST请求并获取文件响应?
- python传文件_Python实现Windows和Linux之间互相传输文件(文件夹)的方法
- Problem 69:Totient maximum
- java合并并排序_典型合并排序的Java实现
- rip协议中周期性广播路由信息的报文_关于RIP的一点小笔记--华为
- ServletContext的用法
- 状压DP例题(种花小游戏+广场铺砖)
- 【k哥爬虫普法】爬虫第一案,侵犯个人隐私,“入侵”短视频服务器!
- 西门子200smart与电流表Modbus RTU通讯
- ⚓写写5G网速及页面提速中的延迟加载Lazyloading
- 嵌入式硬件基础知识汇总<附带与硬件密切相关的软件介绍>
- 【Robot学习 5 】ROS通信编程 待更新。。。
- 论文开题报告的研究基础怎么写?
- 互联网日报 | 华为云年交易额超10亿元;恒大汽车拟申请科创板上市;李彦宏创立生命科学公司“百图生科”...
- Anaconda 与 Pycharm 间的安装和链接
- 对人工智能未来发展的思考
热门文章
- A.M. Best确认中国再保险(集团)股份有限公司及其子公司信用评级
- 中国人保为深圳市皇驰科技承保产品责任险,为消费者保驾护航
- Windows端 五款 MySQL 客户端工具
- ATM柜员机模拟系统
- 安兰德写作竞赛可以获得多少奖金?
- Springboot apache poi 浏览器下载 excel
- FFmpeg解码内存G711A
- office2003 下载地址 及密码
- GSEA原理的通俗易懂的理解
- 涡轮发动机图测试线2010开关测试机SW辊子输送机用抓手SW双头精雕机IGSFPC折弯设备、FPC软板折弯机SWZ4直流电机_三维图Z4-112-4-1_5.5KW_160-1抛光机三维图