收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


zhang的笔记
状态: 离线
人气:5053381
访问用户量:4225
笔记经验:
总积分: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)
浏览(6260)|评论(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

精品视频课程推荐

透彻理解JavaBean视频教程
深入浅出的讲解JavaBen的写法、JavaBean的用法、JavaBean的实现机制、JavaBean对应翻译的代码理解。

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

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

XML基础视频教程
创建规范的XML文档,DTD的作用,并且可以根据要求创建私用的DTD,通过JavaScript解析XML DOM

高级软件架构师实战培训阶段一
内容概述:本课程专注于构建:高可扩展性、高性能、大数据量、高并发、分布式的系统架构。 从零开始、全面系统、成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能。
技术要点: 1:构建基本的业务功能块,基于Maven+Git+Spring mvc+spring+mybatis+ehcache+mysql+X-gen代码生成
 2:高扩展性的分布式体系架构(基于Nginx+Varnish+Memcache+ActiveMQ)
 3:NoSQL的合理使用和架构优化(基于MongoDB)
 4:分布式文件存储和架构优化(基于MogileFS)

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

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

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

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