精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-06
10.1. 综述LDAP通常被公司用作用户信息的中心资源库,同时也被当作一种认证服务。 它也可以为应用用户储存角色信息。 这里有很多如何对LDAP服务器进行配置的场景,所以Spring Security的LDAP提供器也是完全可配置的。 它使用为验证和角色检测提供了单独的策略接口,并提供了默认的实现,这些都是可配置成处理绝大多数情况。 你还是应该熟悉一下LDAP,在你在Spring Security使用它之前。
下面的链接提供了很好的概念介绍,也是一个使用免费的LDAP服务器建立一个目录 Spring Security的LDAP认证可以粗略分成以下几部分。
例外情况是,当LDAP目录只是用来检索用户信息和进行本地验证的时候,这也许不可能的,因为目录的属性,比如对用户密码属性,常常被设置成只读权限。 让我们看看下面的一些配置场景。 要是想得到所有可用的配置选项,请参考安全命名空间结构(使用你的XML编辑器应该就可以看到所有有效信息)。
你需要做的第一件事是配置服务器,它里面应该存放着认证信息。
这可以使用安全命名空间里的 <ldap-server url="ldap://springframework.org:389/dc=springframework,dc=org" />
这个 <ldap-server root="dc=springframework,dc=org"/>
这里我们指定目录的根DIT应该是“dc=springframework,dc=org
”,这是默认的。
使用这种方式,命名空间解析器会建立一个嵌入Apache目录服务器,然后检索classpath下的LDIF文件,尝试从它里边把数据加载到服务器里。
你可以通过 <ldap-server ldif="classpath:users.ldif" /> 这就让启动和运行LDAP变得更轻松了,因为使用一个外部服务器还是不大方便。 它也避免链接到Apache目录服务器的复杂bean配置。 如果使用普通Spring bean配置方法会变的更加混乱。 你必须把必要的Apache目录依赖的jar放到你的程序中。 这些都可以从LDAP示例程序中获得。 这是一个非常常见的LDAP认证场景。 <ldap-authentication-provider user-dn-pattern="uid={0},ou=people"/> 这个很简单的例子可以根据用户登录名提供的模式为用户获得DN,然后尝试和用户的登录密码进行绑定。 如果所有用户都保存到一个目录的单独节点下就没有问题。 如果你想配置一个LDAP搜索过滤器来定位用户,你可以使用如下配置: <ldap-authentication-provider user-search-filter="(uid={0})" user-search-base="ou=people"/>
如果使用了上面的服务器定义,它会在DN 如果从LDAP目录的组里读取权限信息呢,这是通过下面的属性控制的。
因此,如果我们使用下面进行配置 <ldap-authentication-provider user-dn-pattern="uid={0},ou=people" group-search-base="ou=groups" />
并以用户“ben
”的身份通过认证,在读取权限信息的子流程里,要在目录入口 我们上面使用到的命名空间选项很容易使用,也比使用spring bean更准确。 也有可能你需要知道如何配置在你的application context里配置Spring Security LDAP目录。 比如,你可能想自定义一些类的行为。 如果你想使用命名空间配置,你可以跳过这节,直接进入下一段。
最主要的LDAP提供器类是 验证者还负责检索所有需要的用户属性。 这是因为对于属性的授权可能依赖于使用的验证类型 比如,如果对某个用户进行绑定,它也许必须通过用户自己的授权才能进行读取。 当前Spring Security提供两种验证策略:
在认证一个用户之前(使用任何一个策略),辨别名称(DN)必须从系统提供的登录名中获得。
这可以通过,简单的模式匹配(设置setUserDnPatterns
数组属性)或者设置userSearch
属性。
为了实现DN模式匹配方法,一个标准的java模式格式被用到了,登录名将被参数 这个类
这个类
上面讨论的bean必须连接到服务器。
它们都必须使用 通常,比简单DN匹配越来越复杂的策略需要在目录里定位一个用户入口。
这可以使用 这个bean使用一个LDAP过滤器,来匹配目录里的用户对象。
这个过程在javadoc里进行过解释,在对应的搜索方法,JDK DirContext class
。
就如那里解释的,搜索过滤条件可以通过方法指定。
对于这个类,唯一合法的参数是
在成功认证用户之后, 典型的配置方法,使用到像我们这在里讨论的这些bean,就像这样: <bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> <constructor-arg value="ldap://monkeymachine:389/dc=springframework,dc=org"/> <property name="userDn" value="cn=manager,dc=springframework,dc=org"/> <property name="password" value="password"/> </bean> <bean id="ldapAuthProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider"> <constructor-arg> <bean class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator"> <constructor-arg ref="contextSource"/> <property name="userDnPatterns"> <list><value>uid={0},ou=people</value></list> </property> </bean> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator"> <constructor-arg ref="contextSource"/> <constructor-arg value="ou=groups"/> <property name="groupRoleAttribute" value="ou"/> </bean> </constructor-arg> </bean>
这里建立了一个提供器,访问LDAP服务,URL是
要配置用户的搜索对象,使用过滤条件
<bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> <constructor-arg index="0" value=""/> <constructor-arg index="1" value="(uid={0})"/> <constructor-arg index="2" ref="contextSource" /> </bean> 并使用它,设置认证者的userSearch 属性。 这个认证者会调用搜索对象,在尝试绑定到用户之前获得正确的用户DN。
使用 public interface UserDetailsContextMapper { UserDetails mapUserFromContext(DirContextOperations ctx, String username, GrantedAuthority[] authority); void mapUserToContext(UserDetails user, DirContextAdapter ctx); }
只有第一个方法与认证有关。
如果你提供这个接口的实现,你可以精确控制如何创建UserDetails对象。
第一个参数是Spring LDAP的
环境数据加载的方式不同,视乎你采用的认证方法。
使用 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 15857 次