设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

OAuth 2开发人员指南(Spring security oauth2)

2014-10-8 15:41| 发布者: joejoe0332| 查看: 7982| 评论: 0|原作者: daxiang, Jast2014, warrior_by, Triangle23|来自: oschina

摘要: 这是支持OAuth2.0的用户指南。对于OAuth1.0,一切都是不同的,所以看它的用户指南。本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部分是OAuth2.0的客户端(OAuth 2.0 Client) ...


配置端点的URL

  AuthorizationServerEndpointsConfigurer有一个pathMapping()方法。该方法有两个参数:

  • defaultPath 默认的端点URL

  • customPath 自定义的URL 


  框架自己提供的URL路径是/oauth/authorize(授权端),/oauth/token (令牌端),/oauth/confirm_access (用户发送确认授权到这里),还有/oauth/error (用户呈现授权服务器授权出错的请求)。


  注意:授权端/oauth/authorize(或者是它的影射)应该是受Spring Security保护的,所以它只能被已授权的用户访问。令牌端默认是通过使用支持使用HTTP基本身份验证客户机的秘密的注解 @Configuration,被Spring Oauth保护的,但不是使用XML文件的(所以在这种情况下它被保护是很明确的)。


  使用XML的<authorization-server/>元素可以使用一些属性来达到改变默认的端点URL。


自定义错误处理

  授权服务器上错误处理使用标准的 Spring MVC 功能,即 @ExceptionHandler 端点本身的方法。用户还可以提供一个 WebResponseExceptionTranslator 端点本身,最好的办法是改变响应的内容而不是他们呈现的方式。异常的呈现代表 HttpMesssageConverters (这个可以添加到MVC的配置中)令牌的端点和OAuth的错误视图(/ OAuth /error)的授权端点。提供一个whitelabel错误端点,但是用户可能需要提供一个自定义的实现(例如,就添加一个 @Controller,它的请求映射是 @RequestMapping(“/ oauth /error”))。


配置资源服务器

  资源服务器(可能和授权服务器或者一个单独的应用程序在同一台主机上)提供被OAuth2 令牌保护的资源。 Spring OAuth提供一个Spring Security授权过滤器,它实现保护资源的功能。在@Configuration类中,你可以使用@EnableResourceServer来开启 /关闭过滤器,使用ResourceServerConfigurer来配置它。 下面是可配置的属性:

  • tokenServices:定义令牌服务的实体(ResourceServerTokenServices类的实例)。

  • resourceId:资源ID(可选的,建议配置,如果不为空,授权服务器会对它进行验证)。


  @EnableResourceServer注解把一个 OAuth2AuthenticationProcessingFilter 类型过滤器添加到Spring Security 过滤链中。


  在 XML中,有一个<resource-server/>元素,它有一个id属性 – 这是servlet过滤器的bean id,它过滤哪些可以被添加到Spring Security链中。


配置OAuth-Aware表达式处理器

  你可能想要使用Spring Security的使用表达式语言配置访问控制的优点。 表达式处理器在 @EnableResourceServer配置中以默认方式进行注册。 表达式包括#oauth2.clientHasRole,#oauth2.clientHasAnyRole, 和 #oath2.denyClient, 这些可以提供基于oauth客户端角色的访问控制(详细列表见OAuth2SecurityExpressionMethods)。 在XML中,你可以在<http/> 安全配置节点内使用expression-handler元素注册一个oauth-aware表达式处 理器。


OAuth 2.0 客户端

  OAuth 2.0 客户端控制着 OAuth 2.0保护的其它服务器的资源的访问权限。 配置包括建立相关受保护资源与有权限访问资源的用户之间的连接。 客户端也需要实现存储用户的授权代码和访问令牌的功能。


受保护资源的配置

  受保护的资源(或称为远程资源)可以使用OAuth2ProtectedResourceDetails类型的实体bean定义。 一个受保护的资源有以下属性:

  • id:资源id。它仅在客户端搜索资源的时候使用;在OAuth协议中它从未被用到。它也被用作bean的id。

  • clientId:OAuth客户端id。OAuth提供端依赖这个id来识别客户端。

  • clientSecret:与资源有关的秘密。默认情况下,该值不为空。

  • accessTokenUri:提供访问口令的OAuth提供者终端的统一资源标识符(URI)。

  • scope:以逗号分隔的字符串列表,标识可访问资源的范围。默认情况下,该值为空。

  • clientAuthenticationScheme: 客户端对访问的令牌终端授权时使用的机制。 建议值: "http_basic" 和 "form"。 默认值: "http_basic"。 见OAuth 2 帮助文档2.1节。


  不同的授权类型有不同的实现OAuth2ProtectedResourceDetails (对于client_credentials授权类型,使用ClientCredentialsResource )的方式。对于需要进行用户身份验证的授权类型,还有一个属性:

  • userAuthorizationUri: 用户访问资源需要身份验证时跳转页面的URI。 注意这个字段不是必填的,它依赖于被支持的OAuth 2的配置文件类型。


  在XML中,可以使用<resource/>元素创建一个OAuth2ProtectedResourceDetails类型的实体bean。 它有上面提到的所有的属性。


  使用@EnableOAuth2Client对OAuth2.0的客户端的配置比较简单。主要要做两件事情:

  • 创建一个过滤bean(用oauth2ClientContextFilter)来存储当前的请求和上下文。在这种情况下需要在请求期间授权,来管理从重定向的位置和OAuth已认证的url

  • 在请求作用域中创建一个AccessTokenRequest类型的bean。这个类型的bean可以在个人用户的冲突中被识别码识别(或隐式的),授权客户端保持授权状态。


  这个过滤器需要能够连接到应用(例如,使用Servlet初始化程序或者web.xml配置文件配置 一个和DelegatingFilterProxy相同名称的代理)。



  在一个OAuth2RestTemplate中AccessTokenRequest可以这样使用:

1
2
3
4
5
6
7
@Autowired
private OAuth2ClientContext oauth2Context;
 
@Bean
public OAuth2RestTemplate sparklrRestTemplate() {
    return new OAuth2RestTemplate(sparklr(), oauth2Context);
}


  OAuth2ClientContext可以在Session的作用域中保持不同用户不同的状态。如果没有这个功能,你需要在你自己的服务强上管理等效的数据结构,映射不用用户进来的请求并且用相互隔离的OAuth2ClientContext实例连接各个用户。


  在XML文件中,有一个带有id属性的<client/>标签用于表示servlet的Filter的bean id,这个必须映射成一个和DelegatingFilterProxy有相同名称的@Configuration注解。


访问受保护的资源

  一旦,你已经提供了所有的资源服务器配置时,现在你可以访问这些资源。建议的访问这些资源是通过使用在Spring3中提到的RestTemplate。Spring Security OAuth已经提供了一个扩展的RestTemplate,只需要提供一个OAuth2ProtectedResourceDetails的实例。使用它与user-tokens(授权代码授予)你应该考虑使用@EnableOAuth2Client配置(或XML等价< oauth:rest-template / >),造成了一些请求和会话作用域上下文对象,要求不同的用户在运行时不发生冲突。


客户端持久化访问令牌

  客户端不需要持久化令牌,但是它可以很好的用户不需要批准一个新的令牌格兰特每次重新启动客户机应用程序。ClientTokenServices接口定义所需的操作持续OAuth 2.0为特定用户令牌。提供一个JDBC实现,但是如果你喜欢的话你可以实现自己的服务以存储的访问令牌持久数据库和相关的验证实例。如果你想使用此功能,你需要提供一个专门配置TokenProvider theOAuth2RestTemplate如

1
2
3
4
5
@Bean@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)public OAuth2RestOperations restTemplate() {
    OAuth2RestTemplate template = new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(accessTokenRequest));
    AccessTokenProviderChain provider = new AccessTokenProviderChain(Arrays.asList(new AuthorizationCodeAccessTokenProvider()));
    provider.setClientTokenServices(clientTokenServices());
    return template;}

为外部 OAuth2 提供者定制客户端

  一些外部OAuth2提供商(如Facebook)不完全实现正确规范,否则他们只是困在一个旧版本比Spring Security OAuth的规范。在您的客户机应用程序使用这些供应商可能需要适应客户端基础设施的各个部分。


  使用Facebook作为一个例子,有一个Facebook功能tonr2应用程序(您需要更改配置添加你自己的,有效的,客户机id和秘密,他们很容易生成在Facebook网站上)。


  Facebook响应令牌也包含一个不一致的、有失效时间的JSON实体(他们使用到期而不是expires_in),所以如果你想在应用程序中使用失效时间你将不得不使用一个自定义OAuth2SerializationService手动解码。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部