uaa 授权

在上一篇文章中,我介绍了如何使用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

uaa 授权

uaa 授权_使用UAA OAuth2授权服务器–客户端和资源相关推荐

  1. uaa 授权_使用UAA引导OAuth2授权服务器

    uaa 授权 快速获得强大的OAuth2服务器在本地计算机上运行的方法是使用出色的Cloud Foundry UAA项目. UAA用作Cloud Foundry部署中的基础OAUth2授权服务器,可以 ...

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

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

  3. 微信小程序授权_微信小程序授权验证码什么意思

    首先,最先要进行的便是运行微信软件,然后在软件的主界面中,找到"发现"这一功能项目.1.点击"发现"界面之后,会看到一个"游戏中心"的选项, ...

  4. 使用UAA引导OAuth2授权服务器

    快速获得强大的OAuth2服务器在本地计算机上运行的方法是使用出色的Cloud Foundry UAA项目. UAA用作Cloud Foundry部署中的基础OAUth2授权服务器,可以大规模扩展,但 ...

  5. andpods授权码订单号分享_微信OAuth2授权登录

    前言 第三方登录是应用开发中的常用功能,通过第三方登录,我们可以更加容易使用户登录我们的应用或者网站. 很多网站都提供了第三方登录的功能,在他们的官网中,都提供了如何接入第三方登录的文档.但是,假如不 ...

  6. Spring Security OAuth2.0_实现分布式认证授权_搭建注册中心_Spring Security OAuth2.0认证授权---springcloud工作笔记150

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 可以看到上面是咱们整个的分布式的授权服务, 1.客户端分3个,第三方接入的时候,可以看到直接请求咱 ...

  7. 胖哥和几个群友写了个好用的OAuth2授权服务器

    停更这些天,业余时间和粉丝群的几个大佬合作写了一个基于Spring Authorization Server的OAuth2授权服务器的管理控制台项目Id Server,我觉得这个项目能够大大降低OAu ...

  8. spring security oauth2 授权服务器负载均衡解决方案

    研究了好几天的授权服务对资源服务是如何实现负载均衡的 真的是丈二和尚摸不着头脑,研究了几天今天终于找到了一篇文章 真的是翻:烂了 奈何自己太菜 上一下资源服务的yml配置(oauth-server是注 ...

  9. Spring Security OAuth2.0_实现分布式认证授权_集成测试_Spring Security OAuth2.0认证授权---springcloud工作笔记155

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后前面我们已经把分布式微服务的,认证授权全部集成了,然后我们来测试. 启动资源微服务order微 ...

最新文章

  1. 性能测试分析之带宽瓶颈的疑惑
  2. 3.1.5 改善模型的表现
  3. socket.io笔记
  4. php强制cookies,php Cookies操作类(附源码)
  5. Python3文本读写操作
  6. 第5 章持久化类(Persistent Classes)
  7. 将文件复制到FTP服务器时发生错误的解决办法
  8. 中兴JAVA编程题_最新中兴Java语言笔试真题及答案
  9. 安卓手机投射电脑屏幕 手机投屏电脑
  10. IT 程序员、软件工程师值得考的证书有哪些?有什么证书可以考?
  11. Spark实践的阶段性总结
  12. Git Gui 中文乱码
  13. Python OpenSSL基本操作接口
  14. php网站服务器ip地址吗,php 服务器ip地址吗
  15. linux中日志服务器的搭建
  16. 毕业设计时如何搜集相关资料等问题解答
  17. 8.2 什么是事件主题
  18. wep 与 wpa 的区别
  19. USB摄像头转HDMI设备,USB Camera to HDMI
  20. 如何持续推动人工智能技术的前进与落地成为当下关注点

热门文章

  1. P1232-[NOI2013]树的计数【思维】
  2. P3768-简单的数学题【莫比乌斯反演,杜教筛】
  3. jzoj1478-堆排序【堆】
  4. 2021牛客暑期多校训练营8 F-Robots(bitset优化dp)
  5. Educational Codeforces Round 96 (Rated for Div. 2)
  6. 照看小猫(nowcoder 217602)
  7. 38、JAVA_WEB开发基础之下载功能
  8. CDN如何实现,关键技术是什么?
  9. Oracle入门(三)之连接与登录
  10. java提高篇之抽象类与接口