收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


zhang的笔记
状态: 离线
人气:5128807
访问用户量:4233
笔记经验:
总积分:261656
级别:VIP5
搜索本笔记
ta的交流分类
ta的交流主题贴(544)
ta的所有交流贴(1049)
ta的全部笔记
全部笔记(255)
未分类笔记(1)
Java Web(9)
并发实践(1)
课程问题(0)
Java(22)
架构(1)
缓存(5)
JavaEE(0)
JVM(12)
跟我学spring3(68)
Spring Sec……(43)
Spring 3.x……(25)
Spring Sec……(20)
跟开涛学Spring……(17)
深入剖析Spring……(18)
性能调优(10)
前端(2)
Tomcat源码解读(1)
spring sec……(0)
存档
2014-01(7)
2013-12(10)
2012-10(4)
2012-09(2)
2012-08(31)
2012-07(10)
2012-06(5)
2012-05(41)
2012-04(3)
2012-03(41)
2012-02(54)
2011-11(17)
2011-10(30)

2012-03-31 10:19:30
《Spring Security 3》 【第九章】 第九章 LDAP目录服务(3)
浏览(6434)|评论(0)   交流分类:Java|笔记分类: Spring Sec……


明确的LDAP bean配置

在本节中,我们带领你学会明确配置以下两项功能所需要的bean集合,即连接外部的LDAP服务器和支持授权的LdapAuthenticationProvider。正如其它基于bean的配置,你可能不希望这样做,除非你发现security命名空间风格的配置不能支持你的业务或技术需求——在这种情况下,请继续阅读。

 

配置外部的LDAP服务器引用

为了实现这个配置,我们假设在本地的10389端口上运行着LDAP服务器,与前面章节的对应<ldap-server>有相同的配置。需要的bean定义在dogstore-base.xml中提供,如下:

 

java代码:
<bean class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"  
 id="ldapServer">  
  <constructor-arg value="ldap://localhost:10389/dc=jbcppets,dc=com"/>  
  <property name="userDn" value="uid=admin,ou=system"/>  
  <property name="password" value="secret"/>  
</bean>  
 

接下来,我们需要配置稍微复杂一些的LdapAuthenticationProvider。

 

配置LdapAuthenticationProvider

如果你已经读过并理解本章中关于Spring Security LDAP如何工作的讲解,那这个bean配置就很容易理解了,尽管稍有些复杂。我们将会配置一个包含如下特性的LdapAuthenticationProvider:

   用户的凭证进行绑定认证(不是密码对比);

   在UserDetailsContextMapper中使用InetOrgPerson

 

让我们开始吧——首先我们声明LdapAuthenticationProvider: 


java代码:
<bean class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" id="ldapAuthProvider">  
  <constructor-arg ref="ldapBindAuthenticator"/>  
  <constructor-arg ref="ldapAuthoritiesPopulator"/>  
  <property name="userDetailsContextMapper" ref="ldapUserDetailsConte  
xtMapper"/>  
</bean>   

 

接下来是BindAuthenticator以及支持的FilterBasedLdapUserSearch bean(用来在绑定前在LDAP目录中定位用户的DN):

 

java代码:
<bean class="org.springframework.security.ldap.authentication.BindAuthenticator" id="ldapBindAuthenticator">  
  <constructor-arg ref="ldapServer"/>  
  <property name="userSearch" ref="ldapSearchBean"/>  
</bean>  
<bean class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"   
id="ldapSearchBean">  
  <constructor-arg value=""/> <!-- user-search-base -->  
  <constructor-arg value="(uid={0})"/> <!-- user-search-filter -->  
  <constructor-arg ref="ldapServer"/>  
</bean>  

 

最后是LdapAuthoritiesPopulator和UserDetailsContextMapper,它们的角色我们在前文中已经介绍过:

 

java代码:
<bean class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"  
 id="ldapAuthoritiesPopulator">  
  <constructor-arg ref="ldapServer"/>  
  <constructor-arg value="ou=Groups"/>  
  <property name="groupSearchFilter" value="(uniqueMember={0})"/>  
</bean>  
<bean class="org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper"  
 id="ldapUserDetailsContextMapper"/>  

 

最后需要配置的元素是对我们LdapAuthenticationProvider的引用,我们将会在dogstore-security.xml中通过引用进行声明:

 

java代码:
<authentication-manager alias="authenticationManager">  
  <authentication-provider ref="ldapAuthProvider"/>  
</authentication-manager>  

 

到此时为止,我们已经使用明确Spring bean的方法配置了LDAP认证。正如我们在第六章:高级配置和扩展第一次引入明确bean配置那样,在LDAP集成中使用这项技术能够在security命名空间配置没有暴露特定属性时,或者需要自定义的实现类以满足特定业务场景的地方很有用。接下来,我们将会介绍一个这样的场景即怎样通过LDAP连接到Microsoft Active Directory。

 

通过LDAP集成Microsoft Active Directory

Microsoft Active Directory的一个便利功能是它不仅能够很好的与基于Microsoft Windows网络的结构集成,还能够配置成使用LDAP协议保罗Active Directory内容。如果你们是使用Windows的公司,很可能任何的LDAP集成都是基于你的Active Directory实例。

 

取决于你的Microsoft Active Directory配置(以及目录管理员支持Spring Security LDAP的意愿),你可能遇到的困难不在认证和绑定的过程中而是匹配Active Directory中的信息到Spring Security系统中的用户GrantedAuthority上。

 

JBCP Pets公司的Active Directory LDAP树的实例在LDAP浏览器中的截图如下:



在这里你没有看到前面实例LDAP结构中的ou=Groups——这是因为Active Directory在用户条目本身上以属性的方式存储分组信息。内置的Spring Security(本书出版之时)并没有提供支持典型Active Directory LDAP树的LdapAuthoritiesPopulator。

 

让我们使用刚刚了解到的明确配置bean的方式来织入一个简单的LdapAuthoritiesPopulator实现,它只是简单的为每个LDAP认证的用户授予ROLE_USER角色。我们将这个类称为com.packtpub.springsecurity.security.SimpleRoleGrantingLdapAuthoritiesPopulator

 

java代码:
public class SimpleRoleGrantingLdapAuthoritiesPopulator implements  
    LdapAuthoritiesPopulator {  
  protected String role = "ROLE_USER";  
  public Collection<GrantedAuthority> getGrantedAuthorities(  
      DirContextOperations userData, String username) {  
    GrantedAuthority ga = new GrantedAuthorityImpl(role);  
    return Arrays.asList(ga);   
  }  
  public String getRole() {  
    return role;  
  }  
  public void setRole(String role) {  
    this.role = role;  
  }  
} 


 

并不十分令人兴奋,但是要记住如果需要的话你可以使用传入的o.s.ldap.core.DirContextOperations对象进行很多类型的LDAP操作,如查询目录获取用户的信息以及使用这些信息填充返回的角色。

 

假设我们从上一节中的bean配置开始,让我们看一下怎样修改配置以支持Active Directory结构。

 

java代码:
<bean class="org.springframework.security.ldap.  
DefaultSpringSecurityContextSource" id="ldapServer">  
    <constructor-arg value="ldap://corp.jbcppets.com/dc=corp,dc=jbcppets,dc=com"/>  
<property name="userDn"   
value="CN=Administrator,CN=Users,DC=corp,DC=jbcppets,DC=com"/>  
    <property name="password" value="admin123!"/>  
  </bean>  
  <bean class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"  
    id="ldapSearchBean">  
<constructor-arg value="CN=Users"/>  
<constructor-arg value="(sAMAccountName={0})"/>  
<constructor-arg ref="ldapServer"/>  
</bean>  
<bean class="com.packtpub.springsecurity.security.SimpleRoleGrantingLdapAuthoritiesPopulator" id="ldapAuthoritiesPopulator"/>  

 

属性sAMAccountName是在Active Directory中与标准LDAP条目的uid属性对等的——其它的配置修改都是典型的Active Directory配置。

 

尽管大多数的Active Directory LDAP集成都可能比本例复杂,但这会给你一个深入理解和探索Spring Security LDAP内部原理的起点,会使得支持更复杂的集成会简单一点。

 

注意存在另外一种与Active Directory集成的方式——Kerberos认证,它是Spring Security扩展项目的一部分,并会在第十二章:Spring Security扩展中涉及到。你可能会愿意了解两种类型的集成并确定哪种更适合你的需求(我们将会在第十二章中,比较Active Directory的LDAP和Kerberos认证)。

 

委托角色查询给UserDetailsService

最后一项明确配置bean支持的技术就是在UserDetailsService中根据用户名查找用户并在此处获取GrantedAuthority。配置很简单就像声明一个bean,含有一个对UserDetailsService引用(就像基于JDBC的或我们在前面的章节中用到过的):

 

java代码:
<bean class="org.springframework.security.ldap.authentication.UserDetailsServiceLdapAuthoritiesPopulator" id="ldapAuthoritiesPopulator">  
   <constructor-arg ref="jdbcUserServiceCustom"/>  
 </bean>  

 

你可能会预见到的逻辑和管理问题是用户名和角色必须同时在LDAP中和UserDetailsService所有的存储中管理——在大型用户场景下这可能不是一个灵活的模式。

 

这种场景的通常用在需要LDAP认证确保应用中的用户即为公司用户,但是应用本身想存储授权信息。这会导致潜在的应用相关数据在LDAP目录以外,这可能会是出于分开操作的考虑。

小结

我们已经看到在接受请求时,可以依赖LDAP服务器提供认证和授权信息,以及丰富的用户个人信息。在本章中,我们学到了:

   LDAP术语和概念,并理解了LDAP 目录怎样组织以支持Spring Security;

   在Spring Security配置文件中配置单独的(嵌入式的)和外部的LDAP服务器;

   基于LDAP存储认证和授权用户,以及随后的匹配Spring Security角色;

   LDAP中不同的认证模式、密码存储和安全机制——以及在Spring Security中怎样处理;

   匹配LDAP目录中的用户详细信息到UserDetails对象中,实现LDAP和使用Spring应用的属性 交换;

   LDAP的明确bean配置,以及这种方式的优劣。

 


感谢  iteye  lengyun3566 。

 

他的博客地址:http://lengyun3566.iteye.com

他的新浪微博:http://weibo.com/1920428940

本书源代码的地址:http://www.packtpub.com/support?nid=4435

精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

研磨设计模式——跟着cc学设计系列视频教程
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......

ssh+jbpm项目(某集团OA)视频教程
达到能综合使用Struts2+Spring3+Hibernate3+Jbpm4来进行实际项目开发的能力。 包括:ssh和jbpm的整合;数据字典;通用DAO(Spring+Hibernate+泛型+反射+SpEL+模板方法模式);自动生成UUID的加强版;分层开发、SSH联合的基本开发;翻页的taglib;示范真实值和表现值,数据参照的实现;文件上传下载;主子表操;登录验证码;登录控制的拦截器

Ajax+JSON基础实战视频教程
数据校验、Javascript模拟多线程、下拉列表联动、操作XML、AJAX结合JSON的操作、Json-lib的使用

深入浅出学Spring Web MVC视频教程
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识

浏览(6434)|评论(0)   交流分类:Java|笔记分类: Spring Sec……

评论(0)
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网