`
lengyun3566
  • 浏览: 453729 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:384274
社区版块
存档分类
最新评论

《Spring Security3》第八章第三部分翻译(属性交换)

阅读更多

 

属性交换(Attribute Exchange

         OpenID另外一个有趣的功能就是如果使用OpenID的站点需要,OpenID provider提供(基于用户的许可)典型的用户注册数据,如名字、e-mail、生日。这个功能叫做属性交换(Attribute ExchangeAX)。下图展现了在OpenID请求中要求属性交换是如何添加进去的:



 AX属性值(如果provider提供的话)将会与其它的OpenID响应一起返回,并作为一个o.s.s.openid.OpenIDAttribute列表(list)插入到OpenIDAuthenticationToken中。

         AX属性能够被OpenID提供者随意定义,但是均为唯一定义的URI。有人在努力标准化可用的和常见的属性模式。以下的属性是可用的(完整的列表在http://www.axschema.org/types/):

属性名

描述

http://axschema.org/contact/email

用户的e-mail地址

http://axschema.org/namePerson

用户的全名

         axschema.org站点列出了超过30个不同的属性,带有唯一的URI和描述。在一些特定情况下,你可能需要引用schema.openid.net而不是axschema.org(稍后我们将会解释为什么)。

         让我们看一下在Spring Security中如何配置属性交换。

Spring Security OpenID中启用AX

         一旦你知道了要请求的属性,在Spring Security OpenID中启用AX实际上很容易。我们可以配置AX以请求e-mail

 

<openid-login authentication-failure-handler-ref="openIdAuthFailureHandler">
  <attribute-exchange>
    <openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true"/>
  </attribute-exchange>
</openid-login>

 对这个例子,我们建议你使用myOpenID标识登录。你将会看到,当你重定向到提供者时,提供者会通知你JBCP Pets站点请求额外的信息。在以下的截屏中,我们在请求中实际上包含了更多的AX属性:



 请求的属性一旦被提供者返回,那在OpenIDAuthenticationToken就可用了(在成功认证的请求中),是以键值对的方式存在而名字(即键)就是在<openid-attribute>中声明的。这就取决于我们的站点来检查这些数据并对其进行处理。一般来说这些数据能够要在填充用户简介或用户注册表单上。

         为了进行探索研究,可以增强我们写的OpenIDAuthenticationFailureHandler来打印检索出的属性到控制台上:

 

request.getSession(true).setAttribute("USER_OPENID_CREDENTIAL", ((UsernameNotFoundException)exception).getExtraInformation());
OpenIDAuthenticationToken openIdAuth = (OpenIDAuthenticationToken)exception.getAuthentication();
for(OpenIDAttribute attr : openIdAuth.getAttributes()) {
  System.out.printf("AX Attribute: %s, Type: %s, Count: %d\n", attr.getName(), attr.getType(), attr.getCount());
  for(String value : attr.getValues()) {
    System.out.printf(" Value: %s\n", value);
  }
}
redirectStrategy.sendRedirect(request, response, "/registrationOpenid.
do");

 在我们的例子中将会得到如下的输出:

 

AX Attribute: email, Type: http://schema.openid.net/contact/email, 
Count: 1
 Value: peter@mularien.com
AX Attribute: birthDate, Type: http://schema.openid.net/birthDate, 
Count: 1
 Value: 1968-04-13
AX Attribute: namePerson, Type: http://schema.openid.net/namePerson, 
Count: 1
 Value: Peter Mularien
AX Attribute: nickname, Type: http://schema.openid.net/namePerson/
friendly, Count: 1
 Value: pmularien
AX Attribute: country, Type: http://schema.openid.net/contact/country/
home, Count: 1
 Value: US

 我们可以看到AX数据能够很容易从OpenID提供者那里得到,并且支持通过简单API调用访问。在典型的应用场景下,如前面所讨论,AX信息会用在注册时填入用户基本信息或偏好信息,节省了用户重复键入OpenID简介中已包含的信息。

 

现实世界的AX的支持和限制

         但是,在现实中AX的承诺实现的很不足。市面上的OpenID提供者对AX支持的都很差,只有少数支持(myOpenIDGoogle是最好的)。另外,即使支持标准的提供者在有什么属性对应数据方面也有混乱。比如,要查询用户的e-mail,即使两个支持AX的提供者所请求的属性名都不一样!

提供者

支持的AX属性

myOpenID

http://schema.openid.net/contact/email

Google

http://axschema.org/contact/email

         在写作本书的时候,在OpenID相关的邮件列表中还在讨论怎样更好的标准属性并允许OpenID提供者公开他们所支持的属性。

         AX的替代方式,叫做简单注册(Simple Registration SReg)被openid4java所支持,但是并没有暴露到Spring Security OpenID(由开发人员选择)。这很遗憾,因为SReg实际上很多的提供者支持,超过AXAX曾经想作为更开放和灵活的替代SReg的方案,但是缺乏支持和标准化使得妨碍了它被提供者所采用。

支持Google OpenID

         Google选择一种稍微不同的方式实现OpenID,并没有给用户分配用户友好的OpenID标识符。相反,Google期望提供OpenID的站点使用Google式的提供者URL,并且用户直接向Google提供凭证。为了是这个处理对用户来说更简单,通用的做法是站点提供了“Sign in with Google”按钮,这会触发Google OpenID提供者。我们可以添加这个到登录页:

 

<form action="j_spring_openid_security_check" method="post">
  <input name="openid_identifier" size="50" maxlength="100" 
type="hidden" value="https://www.google.com/accounts/o8/id"/>
  <input type="submit" value="Sign in with Google"/>
</form>

 我们可以看到Google URL不需要暴露给用户。用户会看到这个经典的登录页:



 Google登录过程完成后,用户的OP-Local Identifier会被返回,并且注册/登录能像其它OpenID提供者一样处理。

OpenID安全吗?

         OpenID依赖于OpenID提供者的可靠性以及提供者响应的可验证性,为了应用能够信任基于OpenID的用户登录,安全和可靠性至关重要。

         幸运的是,OpenID规范的设计者注意到了这些关切并实现了一系列的校验步骤来防止响应伪造、重放攻击以及其它类型的篡改,描述如下:

l  响应伪造(Response forgery)通过联合使用公用的密钥(使用OpenID的站点在初始请求之前创建)和对响应信息本身进行单向hash信息加密来阻止。恶意的用户不能访问共享的密钥和加密算法,伪装响应的任何域数据都会生成不合法的响应。

l  重放攻击(Replay attacks)通过包含当前时间(nonce)或一次使用的随机key来阻止,这应该保存在使用OpenID的站点上所以不能重复使用。这样,即使用户试图重新发送响应URL也会失败,因为接受的站点会确定当前时间(nonce)以前已经被使用过了,这个请求就失效了。

最可能的一种攻击方式可能会导致一个用户交互可能是中间攻击(man-in-the-middle attack)——在这里恶意用户拦截了用户电脑和OpenID提供者的交互。假设的攻击者在一个地方记录用户浏览器和OpenID的会话,并记录下请求初始化的密钥。在这种情况下,需要攻击者有很高的水平和相当完整的OpenID签名规则实现——简言之,在正常情况下这不会发生。

注意的是,尽管openid4java库支持使用JDBC持久化当前时间(nonce)跟踪,但是Spring Security OpenID当前没有作为一个配置属性暴露——所以当前时间只能在内存中跟踪。这意味着一个重复攻击可能在服务器重启后或集群环境下发生,在这里内存存储没有在不同服务器的JVM间复制。

小结

         在本章中,我们了解了OpenID——一个相对很新的技术用来进行用户认证的凭证管理。OpenIDweb中应用广泛,在最近一两年中在可用性和接受程度上发展迅速。现代web中大多数面向公众的站点都应该规划一些OpenID支持功能,JBCP Pets也不例外。

         在本章中,我们:

l  学习了OpenID认证机制并探究了它的整体结构和术语;

l  利用JBCP  Pets站点,实现了OpenID的登录和自动用户注册功能;

l  通过使用属性交换(Attribute Exchange AX),了解了OpenID未来的基本信息管理;

l  检查了OpenID登录响应的安全性。

         在本章中,我们涉及到大多数常用基于web的外部认证方法。在下一章中,我们将会介绍一种最常用的基于目录的企业认证方式:LDAP。在我们要转到下一章的时候,请观察外部和内部认证机制的区别以及相似之处。

 

 

 

  • 大小: 47.8 KB
  • 大小: 57.1 KB
  • 大小: 55.4 KB
0
0
分享到:
评论

相关推荐

    spring security 参考手册中文版

    第三部分 测试 97 11.测试方法安全性 97 11.1安全测试设置 98 11.2 @WithMockUser 98 11.3 @WithAnonymousUser 100 11.4 @用户详细信息 101 11.5 @WithSecurityContext 102 11.6测试元注释 104 12. Spring MVC测试...

    spring-security-oauth-1.0.2.RELEASE.zip

    【标题】"spring-security-oauth-1.0.2.RELEASE.zip" 提供的是Spring Security OAuth的一个特定版本,这是Spring框架的一个扩展,专注于提供身份验证和授权服务,特别是在OAuth协议的上下文中。OAuth是一个开放标准...

    本项目包含登录springSecurity,前端vue组件化的一个完整的项目框架.zip

    标题中的“本项目包含登录springSecurity,前端vue组件化的一个完整的项目框架.zip”指的是一个集成Spring Security和Vue.js前端组件化的完整Web应用项目。这个项目主要用于教学或实践,旨在帮助开发者理解如何在...

    Spring in Action(第三版)英文版

    《Spring in Action(第三版)》是一本深入探讨Spring框架的权威指南,主要面向有Java开发背景的读者。Spring框架是Java企业级应用开发的重要工具,它简化了应用程序的构建,提供了诸如依赖注入、AOP(面向切面编程...

    Auth2+spring

    3. **SSO集成**:学习如何配置Spring Security与OAuth2服务器(如Auth0)进行通信,实现用户授权和令牌交换。 4. **JWT(JSON Web Tokens)**:由于OAuth2常用JWT作为访问令牌,你将了解JWT的结构、签名、加密和...

    十分钟上手spring boot

    - 集成第三方库:轻松集成各种第三方库,如数据库、消息队列等。 - 独立的War/Jar应用:可以被打包成独立的War或Jar文件。 **5. 了解Spring Boot特性** - **自动配置:**根据添加的依赖自动配置Bean。 - **...

    尚硅谷spring5视频笔记.zip

    8. **Spring Security**:Spring的安全管理框架,提供了身份验证、授权、会话管理等功能,保障应用安全。 9. **AOP(面向切面编程)**:Spring的AOP模块支持在不修改源代码的情况下进行横切关注点的添加,如日志...

    Apress.Pro.Spring.Integration

    第三章“核心Spring框架介绍”提供了对Spring框架的基础理解,这对于掌握Spring Integration至关重要。Spring框架以其依赖注入(DI)和面向切面编程(AOP)特性而闻名,这两者为创建松耦合、可测试和易于管理的应用...

    Manning.Spring.in.Action.5th.Edition.pdf.7z

    3. **Spring MVC**:Spring MVC是Spring框架中用于构建Web应用的一部分。它提供了模型-视图-控制器架构,使得开发人员可以更方便地处理HTTP请求和响应。 4. **数据访问**:学习如何使用Spring Data访问和操作数据库...

    精通Spring4.x企业应用开发实战

    2017年1月的第1版,这本书反映了当时Spring生态系统的最新发展,是学习和提升Spring技术栈的宝贵资源。 Spring框架是Java开发中的基石,尤其在企业级应用开发中,它的影响力无处不在。Spring4.x版本在保持原有优点...

    springWS.zip

    - **WSDL-first开发**:Spring WS支持基于WSDL的第一步开发方法,即先定义WSDL,然后自动生成服务接口和实现。 - **Schema支持**:Spring WS可以处理XML Schema,用于验证输入和输出消息的结构。 - **Endpoint**...

    springcloude+oauth+zuul

    3. **OAuth2认证**:可能通过Spring Security OAuth2实现,创建一个认证服务器,处理用户的登录、授权,为其他微服务提供令牌验证。 4. **服务调用**:使用Spring Cloud的Feign或Ribbon组件,实现服务之间的安全、...

    Spring in Action(第二版)中文版

    8. **Spring Integration**:为异步通信和企业服务总线(ESB)提供支持,帮助实现系统间的数据交换。 9. **Spring Batch**:用于处理批量处理任务,提供了强大的批处理功能,如分块处理、跳过错误、重试策略等。 ...

    spring4 restful web

    标题中的“Spring4 Restful Web”指的是Spring框架的第四版(Spring 4)与RESTful Web服务的结合。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,使得客户端和...

    springboot实现web端微信扫码登录项目(基于微信开放平台)

    OAuth 2.0是一种授权框架,允许第三方应用在用户授权的情况下访问其存储在另一服务提供商上的特定资源。 4. **微信SDK(Software Development Kit)**:微信提供了Java版的SDK,用于处理与微信服务器的交互,包括...

    Spring_in_Action_4 pdf+源码

    8. **Spring Integration**:用于构建企业集成解决方案,Spring Integration提供了各种适配器,便于系统间的通信和数据交换。 9. **Spring Cloud**:在分布式系统中,Spring Cloud提供了一系列工具,如服务发现、...

    Java实现第三方登录

    Java中实现第三方登录,我们可以使用各种库来简化这个过程,例如Spring Security OAuth2,这是一个强大的安全框架,提供了对OAuth2的支持。以下是一般步骤: 1. **配置OAuth2客户端**:在你的项目中,你需要配置...

    spring boot restful 接口示例项目

    它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者可以快速地创建出稳定且生产级别的应用。RESTful API 设计则是一种遵循 REST(Representational State Transfer)架构约束...

    JAVA WEB开发源码

    3. **第三章:JSP** - JSP(JavaServer Pages)用于动态网页生成,讲解JSP语法、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)。 4. **第四章:MVC模式** - 介绍Model-View-...

Global site tag (gtag.js) - Google Analytics