使用UAA OAuth2授权服务器–客户端和资源

在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。

我已经在Digital Ocean网站上找到了这篇文章,在描述OAuth2授权代码流方面做得非常好,因此,与其重新哈希该流中涉及的内容,我不如直接使用Spring Boot / Spring Security来实现该流。

下图受此处的启发,显示了授权码授予类型的高级流程:

我将有两个应用程序-一个资源服务器公开用户的一些资源,以及一个客户端应用程序代表用户访问这些资源。 如前面的博客文章所述,可以启动授权服务器本身。

文章的其余部分可以更轻松地跟随我的github存储库中的代码

授权服务器

可以使用我之前的博客文章中描述的步骤轻松启动Cloud Foundry UAA服务器。 一旦完成,可以使用以下uaac命令来填充运行样本所需的不同凭据。

这些脚本将为客户端应用程序创建客户端证书,并添加一个名为“ user1”的用户,其范围为“ resource.read”和“ resource.write”。

# Login as a canned client
uaac token client get admin -s adminsecret# Add a client credential with client_id of client1 and client_secret of client1
uaac client add client1 \--name client1 \--scope resource.read,resource.write \-s client1 \--authorized_grant_types authorization_code,refresh_token,client_credentials \--authorities uaa.resource# Another client credential resource1/resource1
uaac client add resource1 \--name resource1 \-s resource1 \--authorized_grant_types client_credentials \--authorities uaa.resource# Add a user called user1/user1
uaac user add user1 -p user1 --emails user1@user1.com# Add two scopes resource.read, resource.write
uaac group add resource.read
uaac group add resource.write# Assign user1 both resource.read, resource.write scopes..
uaac member add resource.read user1
uaac member add resource.write user1

资源服务器

资源服务器通过以下方式公开了一些端点,这些端点使用Spring MVC表示并使用Spring Security进行保护:

@RestController
public class GreetingsController {@PreAuthorize("#oauth2.hasScope('resource.read')")@RequestMapping(method = RequestMethod.GET, value = "/secured/read")@ResponseBodypublic String read(Authentication authentication) {return String.format("Read Called: Hello %s", authentication.getCredentials());}@PreAuthorize("#oauth2.hasScope('resource.write')")@RequestMapping(method = RequestMethod.GET, value = "/secured/write")@ResponseBodypublic String write(Authentication authentication) {return String.format("Write Called: Hello %s", authentication.getCredentials());}
}

公开了两个端点uri –授权用于范围“ resource.read”的“ /安全/读取”和授权用于范围“ resource.write”的“ /安全/写入”

保护这些端点并将应用程序标记为资源服务器的配置如下:

@Configuration
@EnableResourceServer
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.resourceId("resource");}@Overridepublic void configure(HttpSecurity http) throws Exception {http.antMatcher("/secured/**").authorizeRequests().anyRequest().authenticated();}
}

该配置以及描述如何验证令牌的属性是使资源服务器运行所需的全部。

客户

使用Spring Security OAuth2的OAuth2的客户端配置也非常简单,@ EnableAuth2SSO批注提取所有必需的配置以为OAuth2流连接Spring安全过滤器:

@EnableOAuth2Sso
@Configuration
public class OAuth2SecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(WebSecurity web) throws Exception {super.configure(web);}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable();//@formatter:offhttp.authorizeRequests().antMatchers("/secured/**").authenticated().antMatchers("/").permitAll().anyRequest().authenticated();//@formatter:on}}

要调用下游系统,客户端必须将OAuth令牌作为标头传递到下游调用中,方法是通过挂接一个称为OAuth2RestTemplate的专用RestTemplate来完成,该模板可以从上下文中获取访问令牌并将其传递到下游连接了一个安全的下游呼叫,如下所示:

public class DownstreamServiceHandler {private final OAuth2RestTemplate oAuth2RestTemplate;private final String resourceUrl;public DownstreamServiceHandler(OAuth2RestTemplate oAuth2RestTemplate, String resourceUrl) {this.oAuth2RestTemplate = oAuth2RestTemplate;this.resourceUrl = resourceUrl;}public String callRead() {return callDownstream(String.format("%s/secured/read", resourceUrl));}public String callWrite() {return callDownstream(String.format("%s/secured/write", resourceUrl));}public String callInvalidScope() {return callDownstream(String.format("%s/secured/invalid", resourceUrl));}private String callDownstream(String uri) {try {ResponseEntity<String> responseEntity = this.oAuth2RestTemplate.getForEntity(uri, String.class);return responseEntity.getBody();} catch(HttpStatusCodeException statusCodeException) {return statusCodeException.getResponseBodyAsString();}}
}

示范

可以使用此处的说明启动客户端和资源服务器。 一旦所有系统启动,访问客户端将向用户显示一个页面,如下所示:


访问安全页面将导致授权服务器显示登录页面:

客户端正在向用户请求“ resource.read”和“ resource.write”范围,提示用户授权这些范围:

假设用户已授权“ resource.read”但未授权“ resource.write”,则令牌将呈现给用户:


在这一点上,如果请求的下游资源要求范围为“ resource.read”,则应检索它:

并且,如果请求的下游资源具有用户未授权的范围,在这种情况下为“ resource.write”:

参考

  • 大多数代码基于此处提供的Cloud Foundry UAA应用程序示例– https://github.com/pivotal-cf/identity-sample-apps
  • 帖子中的代码在这里 :https://github.com/bijukunjummen/oauth-uaa-sample

翻译自: https://www.javacodegeeks.com/2017/03/using-uaa-oauth2-authorization-server-client-resource.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找思想

二分查找 二分查找思想应用于对有序的数组进行查找操作。 时间复杂度 二分查找也称为折半查找&#xff0c;每次都能将查找区间减半&#xff0c;这种折半特性算法时间复杂度为O(logn)。 mid计算 有两种计算中值mid的方式&#xff1a; m(lh)/2ml(h-l)/2lh可能出现加法溢出&#x…

ad20如何导入库_脱水防锈油如何使用才正确?

导Lead语根据调查了解&#xff0c;很多厂家在使用脱水防锈油的办法不正确而导致防锈效果失效或不明显。那么脱水防锈油应该如何使用才正确呢&#xff1f;中阳润滑油为大家简单讲述如下。脱水防锈油脱水防锈油是由矿物油及脱水、防锈抗氧化等多种添加剂配制而成&#xff0c;既可…

matplotlib  plt.lengend

参考文档 https://www.cnblogs.com/lfri/p/12248629.html 官方文档 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html matplotlib plt.lengend 作用&#xff1a;用于给图像加图例。 1、语法参数如下: matplotlib.pyplot.legend(*args, **kwargs) 2、…

Python进阶(上下文管理器与with语句)

/*上下文管理器必须有__enter__和__exit__方法*/ class MyResource:def __enter__(self):print(链接资源)return self/*__exit__返回True表示异常只会在__exit__中被捕获&#xff0c;不会继续传递到with语句的之外的except中&#xff0c;如果返回false&#xff0c;则会把异常也…

matplotlib  plt.scatter

https://www.cnblogs.com/lfri/p/12248629.html matplotlib plt.scatter 作用&#xff1a;画散点图 plt.scatter() 参数如下&#xff1a; x,y X和Y是长度相同的数组 s size,点的大小&#xff0c;标量或与数据长度相同的数组 c color,点的颜色&#xff0c;标量或与数据长…

Git 备忘录

整理了一下工作中常用的 Git 操作&#xff0c;持续更新中...merge单个文件例如 B分支想要合并A分支的某个文件首先&#xff0c;我们切换到B分支 git checkout branch B之后&#xff0c;我们checkout A 分支的a文件&#xff0c;git checkout --patch A a路径 最后&#xff0c…

spark任务shell运行_大数据系列:Spark的工作原理及架构

介绍本Apache Spark教程将说明Apache Spark的运行时架构以及主要的Spark术语&#xff0c;例如Apache SparkContext&#xff0c;Spark shell&#xff0c;Apache Spark应用程序&#xff0c;Spark中的任务(Task)&#xff0c;作业(job)和阶段(stage)。此外&#xff0c;我们还将学习…

使用RESTful Client API进行GET / POST

互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是&#xff0c;尽管该主题看起来微不足道&#xff0c;但仍然存在一些障碍&#xff0c;尤其是对于初学者而言。 在这篇文章中&#xff0c;我将尝试总结我的专业知识&#xff0c;以及我如何在实际项目中做到这…

matplotlib plt.lengend图例放在图像的外侧

参考&#xff1a;https://www.jb51.net/article/186659.htm matplotlib plt.lengend图例放在图像的外侧 1、图例在图中实例 import numpy as np import matplotlib.pyplot as plt# 定义x,y X np.linspace(0, 2*np.pi, 32, endpointTrue) C np.cos(X)# figure的名称 plt.figur…

和搜狗输入法快捷键冲突_这款输入法被调教多年不输搜狗,爱了奥里给!

自从搜狗输入法被曝“推广门”之后&#xff0c;许多小伙伴开始寻找新的替代品。这期间&#xff0c;我也尝试了很多输入法&#xff0c;比如手心输入法、小狼毫输入法等。我以易用性、候选字质量和辅助输入功能三个方面作为考量标准&#xff0c;最终选定Win10默认的输入法&#x…

预期的异常规则和模拟静态方法– JUnit

今天&#xff0c;我被要求使用RESTful服务&#xff0c;所以我开始遵循Robert Cecil Martin的TDD规则实施该服务&#xff0c;并遇到了一种测试预期异常以及错误消息的新方法&#xff08;对我来说至少是这样&#xff09;&#xff0c;因此考虑共享我的实现方式作为这篇文章的一部分…

Linux安装部署FTP服务器

Linux安装部署FTP服务器 本文章会将安装FTP服务器的步骤以及一些遇到的问题来记录下 因为项目中要与第三方对接数据&#xff0c;需要用到FTP服务器以提供他们每天上传数据&#xff0c;因为之前在本地的VMware虚拟机上部署过一次&#xff0c;这次则在天翼云上部署。 首先&#x…

广度优先搜索

转载 https://www.cnblogs.com/skywang12345/p/3711483.html 1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search)&#xff0c;又称为"宽度优先搜索"或"横向优先搜索"&#xff0c;简称BFS。 它的思想是&#xff1a;从图中某顶点v出发&#xff…

转https_免费!这个PPT转PDF的方法不学可惜!

职场人士对PPT演示文档都不陌生&#xff0c;尤其是商务、营销团队利用PPT向客户推荐产品、推广计划更是家常便饭。但是作为一个合格的商务营销人员&#xff0c;汇报、方案只保存PPT一种格式是远远不够的&#xff0c;因为经常在不同产地演示&#xff0c;而不同的设备可能对不同版…

深度优先搜索

转载&#xff1a;https://www.cnblogs.com/skywang12345/p/3711483.html 深度优先搜索 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历比较类似。 它的思想&#xff1a;假设初始状态是图中所有顶点均未被访问&#xff0c;则从某个顶点…

jvm类加载机制和类加载器_在JVM之下–类加载器

jvm类加载机制和类加载器在许多开发人员中&#xff0c;类加载器是Java语言的底层&#xff0c;并且经常被忽略。 在ZeroTurnaround上 &#xff0c;我们的开发人员必须生活&#xff0c;呼吸&#xff0c;饮食&#xff0c;喝酒&#xff0c;并且几乎与类加载器保持亲密关系&#xff…

光源时间_您的国美备战时间已不足一个月!绝密国美考点、考场、光源分析送上!...

中国美术学院2020年本科招生考试报名公告&#xff0c;终于在前几天公布了&#xff01;今年国美一共设置了三个考点&#xff0c;报名也已经正式开启啦&#xff01;考点设置杭州考点&#xff1a;不设报考人数上限&#xff0c;接受全国所有省份考生报考(含广东省、河南省)深圳考点…

ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题

ltp-ddt eth_iperf_tcp server端&#xff1a;iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来&#xff1a; iperf -c 1921.68.40.41 -m -M 1500 -f M -d -t 60 -w 8K 手动运行三次后&#xff0c;server端挂了&#xff0c;client端报错&#xff1a;connect failed: Connecti…

beam search算法

转载 https://blog.csdn.net/xyz1584172808/article/details/89220906 https://blog.csdn.net/batuwuhanpei/article/details/64162331 https://www.zhihu.com/question/54356960 beam search算法 在看论文Sequence to Sequence Learning with neural networks时看到了beam …

微信支付遇到的坑--签名错误

遇到签名错误&#xff0c;因为微信没有给出具体错误信息&#xff0c;所以我们只能自己排查。 下面是我整理出可能导致签名错误的情况&#xff1a; 1.可以先去微信公众平台用支付接口调试工具验证签名方法是否有问题 https://pay.weixin.qq.com/wiki/tools/signverify/2.如果签名…