- 浏览: 292856 次
- 性别:
- 来自: 唐山
最新评论
-
小灯笼:
JBPM5.4实战流程引擎开发网盘地址:https://pan ...
跟我学工作流——jBPM4视频教程(免费) -
Kai_Ge:
学会做人 写道临远大哥,谢谢你的贡献大名鼎鼎的临远!!膜拜中。 ...
Spring Security-3.0.1中文官方文档(翻译版) -
漂泊一剑客:
博主,你自己电脑上有下载,这些信息吗,能否分享一下给我
跟我学工作流——jBPM4视频教程(免费) -
Rookie_Li:
您好,您的教程很有用,请问例子的源码在哪下载?
spring security权限管理手册升级至spring security-3.1.3 -
nullFFF:
马教授 写道现在还用4有点过时了,最新的都已经是5.4了,目前 ...
跟我学工作流——jBPM4视频教程(免费)
LDAP认证
10.1. 综述
LDAP通常被公司用作用户信息的中心资源库,同时也被当作一种认证服务。 它也可以为应用用户储存角色信息。
这里有很多如何对LDAP服务器进行配置的场景,所以Spring Security的LDAP提供器也是完全可配置的。 它使用为验证和角色检测提供了单独的策略接口,并提供了默认的实现,这些都是可配置成处理绝大多数情况。
你还是应该熟悉一下LDAP,在你在Spring Security使用它之前。 下面的链接提供了很好的概念介绍,也是一个使用免费的LDAP服务器建立一个目录http://www.zytrax.com/books/ldap/的指南。 我们也应该熟悉一下通过JNDI API使用java访问LDAP。 我们没有在LDAP提供器里使用任何第三方LDAP库(Mozilla, JLDAP等等),但是还是用到了Spring LDAP,所以如果你希望自己进行自定义,对这个工程熟悉一下也是有好处的。
10.2. 在Spring Security里使用LDAP
Spring Security的LDAP认证可以粗略分成以下几部分。
1.
从登录名中获得唯一的“辨别名称”或DN。 这就意味着要对目录执行搜索,除非预先知道了用户名和DN之前的明确映射关系。
2.
验证这个用户,进行绑定用户,或调用远程“比较”操作,比对用户的密码和DN在目录入口中的密码属性。
3.
为这个用户读取权限队列。
例外情况是,当LDAP目录只是用来检索用户信息和进行本地验证的时候,这也许不可能的,因为目录的属性,比如对用户密码属性,常常被设置成只读权限。
让我们看看下面的一些配置场景。 要是想得到所有可用的配置选项,请参考安全命名空间结构(使用你的XML编辑器应该就可以看到所有有效信息)。
10.3. 配置LDAP服务器
你需要做的第一件事是配置服务器,它里面应该存放着认证信息。 这可以使用安全命名空间里的<ldap-server>元素实现。 使用url属性指向一个外部LDAP服务器:
<ldap-server url="ldap://springframework.org:389/dc=springframework,dc=org" />
10.3.1. 使用嵌入测试服务器
这个<ldap-server>元素也可以用来创建一个嵌入服务器,这在测试和演示的时候特别有用。 在这种情况,你不需要使用url属性:
<ldap-server root="dc=springframework,dc=org"/>
这里我们指定目录的根DIT应该是“dc=springframework,dc=org”,这是默认的。 使用这种方式,命名空间解析器会建立一个嵌入Apache目录服务器,然后检索classpath下的LDIF文件,尝试从它里边把数据加载到服务器里。 你可以通过ldif属性自定义这些行为,这样可以定义具体要加载哪个LDIF资源:
<ldap-server ldif="classpath:users.ldif" />
这就让启动和运行LDAP变得更轻松了,因为使用一个外部服务器还是不大方便。 它也避免链接到Apache目录服务器的复杂bean配置。 如果使用普通Spring bean配置方法会变的更加混乱。 你必须把必要的Apache目录依赖的jar放到你的程序中。 这些都可以从LDAP示例程序中获得。
10.3.2. 使用绑定认证
这是一个非常常见的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"/>
如果使用了上面的服务器定义,它会在DNou=people,dc=springframework,dc=org下执行搜索,使用user-search-filter里的值作为过滤条件。 然后把用户登录名作为过滤名称的一个参数。 如果没有提供user-search-base,搜索将从根开始。
10.3.3. 读取授权
如果从LDAP目录的组里读取权限信息呢,这是通过下面的属性控制的。
*
group-search-base。定义目录树部分,哪个组应该执行搜索。
*
group-role-attribute。这个属性包含了组入口中定义的权限名称。默认是 cn
*
group-search-filter。这个过滤器用来搜索组的关系。 默认是uniqueMember={0},对应于groupOfUniqueMembersLDAP类。 在这情况下,取代参数是用户的辨别名称。 如果你想对登录名搜索,可以使用{1}这个参数。
因此,如果我们使用下面进行配置
<ldap-authentication-provider user-dn-pattern="uid={0},ou=people" group-search-base="ou=groups" />
并以用户“ben”的身份通过认证,在读取权限信息的子流程里,要在目录入口ou=groups,dc=springframework,dc=org下执行搜索,查找包含uniqueMember属性值为ou=groups,dc=springframework,dc=org的入口。 默认,权限名都要以ROLE_作为前缀。 你可以使用role-prefix属性修改它。 如果你不想使用任何前缀,可以使用role-prefix="none"。 要想得到更多读取权限的信息,可以查看DefaultLdapAuthoritiesPopulator类的Javadoc。
10.4. 实现类
我们上面使用到的命名空间选项很容易使用,也比使用spring bean更准确。 也有可能你需要知道如何配置在你的application context里配置Spring Security LDAP目录。 比如,你可能想自定义一些类的行为。 如果你想使用命名空间配置,你可以跳过这节,直接进入下一段。
最主要的LDAP提供器类是org.springframework.security.providers.ldap.LdapAuthenticationProvider。 这个bean自己没做什么事情,而是代理了其他两个bean的工作,一个是LdapAuthenticator,一个是LdapAuthoritiesPopulator,用来处理用户认证和检索用户的GrantedAuthority属性集合。
10.4.1. LdapAuthenticator实现
验证者还负责检索所有需要的用户属性。 这是因为对于属性的授权可能依赖于使用的验证类型 比如,如果对某个用户进行绑定,它也许必须通过用户自己的授权才能进行读取。
当前Spring Security提供两种验证策略:
*
直接去LDAP服务器验证(“绑定”验证)。
*
比较密码,将用户提供的密码与资源库中保存的进行比较。 这可以通过检索密码属性的值并在本地检测,或者执行LDAP“比较”操作,提供用来比较的密码是从服务器获得的,绝对不会检索真实密码的值。
10.4.1.1. 常用功能
在认证一个用户之前(使用任何一个策略),辨别名称(DN)必须从系统提供的登录名中获得。 这可以通过,简单的模式匹配(设置setUserDnPatterns数组属性)或者设置userSearch属性。 为了实现DN模式匹配方法,一个标准的java模式格式被用到了,登录名将被参数{0}替代。 这个模式应该和DN有关系,并绑定到配置好的SpringSecurityContextSource(看看链接到LDAP服务器那节,获得更多信息)。 比如,如果你使用了LDAP服务的URL是ldap://monkeymachine.co.uk/dc=springframework,dc=org,并有一个模式uid={0},ou=greatapes,然后登录名"gorilla"会映射到DNuid=gorilla,ou=greatapes,dc=springframework,dc=org。 每个配置好的DN模式将尝试进行定位,直到有一个匹配上。 使用搜索获得信息,看看下面的安全对象那节。 两种方式也可以结合在一起使用 - 模式会先被检测一下,然后如果没有找到匹配的DN,就会使用搜索。
10.4.1.2. BindAuthenticator
这个类 org.springframework.security.providers.ldap.authenticator.BindAuthenticator 实现了绑定认证策略。 它只是尝试对用户进行绑定。
10.4.1.3. PasswordComparisonAuthenticator
这个类 org.springframework.security.providers.ldap.authenticator.PasswordComparisonAuthenticator 实现了密码比较认证策略。
10.4.1.4. 活动目录认证
除了标准LDAP认证以外(绑定到一个DN),活动目录对于用户认证提供了自己的非标准语法。
10.4.2. 链接到LDAP服务器
上面讨论的bean必须连接到服务器。 它们都必须使用SpringSecurityContextSource,这个是Spring LDAP的一个扩展。 除非你有特定的需求,你通常只需要配置一个DefaultSpringSecurityContextSource bean,这个可以使用你的LDAP服务器的URL进行配置,可选项还有管理员用户的用户名和密码,这将默认用在绑定服务器的时候(而不是匿名绑定)。 参考Spring LDAP的AbstractContextSource类的Javadoc获得更多信息。
10.4.3. LDAP搜索对象
通常,比简单DN匹配越来越复杂的策略需要在目录里定位一个用户入口。 这可以使用LdapUserSearch的一个示例,它可以提供认证者实现,比如让他们定位一个用户。 提供的实现是FilterBasedLdapUserSearch。
10.4.3.1. FilterBasedLdapUserSearch
这个bean使用一个LDAP过滤器,来匹配目录里的用户对象。 这个过程在javadoc里进行过解释,在对应的搜索方法,JDK DirContext class。 就如那里解释的,搜索过滤条件可以通过方法指定。 对于这个类,唯一合法的参数是{0},它会代替用户的登录名。
10.4.4. LdapAuthoritiesPopulator
在成功认证用户之后,LdapAuthenticationProvider会调用配置好的LdapAuthoritiesPopulator bean,尝试读取用户的授权集合。 这个DefaultLdapAuthoritiesPopulator是一个实现类,它将通过搜索目录读取授权,查找用户成员所在的组(典型的这会是目录中的groupOfNames或groupOfUniqueNames入口)。 查看这个类的Javadoc获得它如何工作的更多信息。
10.4.5. Spring Bean配置
典型的配置方法,使用到像我们这在里讨论的这些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是 ldap://monkeymachine:389/dc=springframework,dc=org。 认证会被执行,尝试绑定这个DN uid=<user-login-name>,ou=people,dc=springframework,dc=org。 在成功认证之后,会通过查找下面的DN ou=groups,dc=springframework,dc=org 使用默认的过滤条件 (member=<user's-DN>),将角色分配给用户。 角色名会通过每个匹配的“ou”属性获得。
要配置用户的搜索对象,使用过滤条件 (uid=<user-login-name>) 替代DN匹配(或附加到它上面),你需要配置下面的bean
<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。
10.4.6. LDAP属性和自定义UserDetails
使用LdapAuthenticationProvider进行认证的结果,和使用普通Spring Security认证一样,都要使用标准UserDetailsService接口。 它会创建一个UserDetails对象,并保存到返回的Authentication对象里。 在使用UserDetailsService时,常见的需求是可以自定义这个实现,添加额外的属性。 在使用LDAP的时候,这些基本都来自用户入口的属性。 UserDetails对象的创建结果被提供者的UserDetailsContextMapper策略控制,它负责在用户对象和LDAP环境数据之间进行映射:
public interface UserDetailsContextMapper {
UserDetails mapUserFromContext(DirContextOperations ctx, String username, GrantedAuthority[] authority);
void mapUserToContext(UserDetails user, DirContextAdapter ctx);
}
只有第一个方法与认证有关。 如果你提供这个接口的实现,你可以精确控制如何创建UserDetails对象。 第一个参数是Spring LDAP的DirContextOperations实例,他给你访问加载的LDAP属性的通道。 username参数是用来认证的名字,最后一个参数是从用户加载的授权列表。]
环境数据加载的方式不同,视乎你采用的认证方法。 使用BindAuthenticatior,从绑定操作返回的环境会用来读取属性,否则数据会通过标准的环境,从配置好的ContextSource获得(当测试配置好定位用户,这会从搜索对象中获得数据)。
10.1. 综述
LDAP通常被公司用作用户信息的中心资源库,同时也被当作一种认证服务。 它也可以为应用用户储存角色信息。
这里有很多如何对LDAP服务器进行配置的场景,所以Spring Security的LDAP提供器也是完全可配置的。 它使用为验证和角色检测提供了单独的策略接口,并提供了默认的实现,这些都是可配置成处理绝大多数情况。
你还是应该熟悉一下LDAP,在你在Spring Security使用它之前。 下面的链接提供了很好的概念介绍,也是一个使用免费的LDAP服务器建立一个目录http://www.zytrax.com/books/ldap/的指南。 我们也应该熟悉一下通过JNDI API使用java访问LDAP。 我们没有在LDAP提供器里使用任何第三方LDAP库(Mozilla, JLDAP等等),但是还是用到了Spring LDAP,所以如果你希望自己进行自定义,对这个工程熟悉一下也是有好处的。
10.2. 在Spring Security里使用LDAP
Spring Security的LDAP认证可以粗略分成以下几部分。
1.
从登录名中获得唯一的“辨别名称”或DN。 这就意味着要对目录执行搜索,除非预先知道了用户名和DN之前的明确映射关系。
2.
验证这个用户,进行绑定用户,或调用远程“比较”操作,比对用户的密码和DN在目录入口中的密码属性。
3.
为这个用户读取权限队列。
例外情况是,当LDAP目录只是用来检索用户信息和进行本地验证的时候,这也许不可能的,因为目录的属性,比如对用户密码属性,常常被设置成只读权限。
让我们看看下面的一些配置场景。 要是想得到所有可用的配置选项,请参考安全命名空间结构(使用你的XML编辑器应该就可以看到所有有效信息)。
10.3. 配置LDAP服务器
你需要做的第一件事是配置服务器,它里面应该存放着认证信息。 这可以使用安全命名空间里的<ldap-server>元素实现。 使用url属性指向一个外部LDAP服务器:
<ldap-server url="ldap://springframework.org:389/dc=springframework,dc=org" />
10.3.1. 使用嵌入测试服务器
这个<ldap-server>元素也可以用来创建一个嵌入服务器,这在测试和演示的时候特别有用。 在这种情况,你不需要使用url属性:
<ldap-server root="dc=springframework,dc=org"/>
这里我们指定目录的根DIT应该是“dc=springframework,dc=org”,这是默认的。 使用这种方式,命名空间解析器会建立一个嵌入Apache目录服务器,然后检索classpath下的LDIF文件,尝试从它里边把数据加载到服务器里。 你可以通过ldif属性自定义这些行为,这样可以定义具体要加载哪个LDIF资源:
<ldap-server ldif="classpath:users.ldif" />
这就让启动和运行LDAP变得更轻松了,因为使用一个外部服务器还是不大方便。 它也避免链接到Apache目录服务器的复杂bean配置。 如果使用普通Spring bean配置方法会变的更加混乱。 你必须把必要的Apache目录依赖的jar放到你的程序中。 这些都可以从LDAP示例程序中获得。
10.3.2. 使用绑定认证
这是一个非常常见的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"/>
如果使用了上面的服务器定义,它会在DNou=people,dc=springframework,dc=org下执行搜索,使用user-search-filter里的值作为过滤条件。 然后把用户登录名作为过滤名称的一个参数。 如果没有提供user-search-base,搜索将从根开始。
10.3.3. 读取授权
如果从LDAP目录的组里读取权限信息呢,这是通过下面的属性控制的。
*
group-search-base。定义目录树部分,哪个组应该执行搜索。
*
group-role-attribute。这个属性包含了组入口中定义的权限名称。默认是 cn
*
group-search-filter。这个过滤器用来搜索组的关系。 默认是uniqueMember={0},对应于groupOfUniqueMembersLDAP类。 在这情况下,取代参数是用户的辨别名称。 如果你想对登录名搜索,可以使用{1}这个参数。
因此,如果我们使用下面进行配置
<ldap-authentication-provider user-dn-pattern="uid={0},ou=people" group-search-base="ou=groups" />
并以用户“ben”的身份通过认证,在读取权限信息的子流程里,要在目录入口ou=groups,dc=springframework,dc=org下执行搜索,查找包含uniqueMember属性值为ou=groups,dc=springframework,dc=org的入口。 默认,权限名都要以ROLE_作为前缀。 你可以使用role-prefix属性修改它。 如果你不想使用任何前缀,可以使用role-prefix="none"。 要想得到更多读取权限的信息,可以查看DefaultLdapAuthoritiesPopulator类的Javadoc。
10.4. 实现类
我们上面使用到的命名空间选项很容易使用,也比使用spring bean更准确。 也有可能你需要知道如何配置在你的application context里配置Spring Security LDAP目录。 比如,你可能想自定义一些类的行为。 如果你想使用命名空间配置,你可以跳过这节,直接进入下一段。
最主要的LDAP提供器类是org.springframework.security.providers.ldap.LdapAuthenticationProvider。 这个bean自己没做什么事情,而是代理了其他两个bean的工作,一个是LdapAuthenticator,一个是LdapAuthoritiesPopulator,用来处理用户认证和检索用户的GrantedAuthority属性集合。
10.4.1. LdapAuthenticator实现
验证者还负责检索所有需要的用户属性。 这是因为对于属性的授权可能依赖于使用的验证类型 比如,如果对某个用户进行绑定,它也许必须通过用户自己的授权才能进行读取。
当前Spring Security提供两种验证策略:
*
直接去LDAP服务器验证(“绑定”验证)。
*
比较密码,将用户提供的密码与资源库中保存的进行比较。 这可以通过检索密码属性的值并在本地检测,或者执行LDAP“比较”操作,提供用来比较的密码是从服务器获得的,绝对不会检索真实密码的值。
10.4.1.1. 常用功能
在认证一个用户之前(使用任何一个策略),辨别名称(DN)必须从系统提供的登录名中获得。 这可以通过,简单的模式匹配(设置setUserDnPatterns数组属性)或者设置userSearch属性。 为了实现DN模式匹配方法,一个标准的java模式格式被用到了,登录名将被参数{0}替代。 这个模式应该和DN有关系,并绑定到配置好的SpringSecurityContextSource(看看链接到LDAP服务器那节,获得更多信息)。 比如,如果你使用了LDAP服务的URL是ldap://monkeymachine.co.uk/dc=springframework,dc=org,并有一个模式uid={0},ou=greatapes,然后登录名"gorilla"会映射到DNuid=gorilla,ou=greatapes,dc=springframework,dc=org。 每个配置好的DN模式将尝试进行定位,直到有一个匹配上。 使用搜索获得信息,看看下面的安全对象那节。 两种方式也可以结合在一起使用 - 模式会先被检测一下,然后如果没有找到匹配的DN,就会使用搜索。
10.4.1.2. BindAuthenticator
这个类 org.springframework.security.providers.ldap.authenticator.BindAuthenticator 实现了绑定认证策略。 它只是尝试对用户进行绑定。
10.4.1.3. PasswordComparisonAuthenticator
这个类 org.springframework.security.providers.ldap.authenticator.PasswordComparisonAuthenticator 实现了密码比较认证策略。
10.4.1.4. 活动目录认证
除了标准LDAP认证以外(绑定到一个DN),活动目录对于用户认证提供了自己的非标准语法。
10.4.2. 链接到LDAP服务器
上面讨论的bean必须连接到服务器。 它们都必须使用SpringSecurityContextSource,这个是Spring LDAP的一个扩展。 除非你有特定的需求,你通常只需要配置一个DefaultSpringSecurityContextSource bean,这个可以使用你的LDAP服务器的URL进行配置,可选项还有管理员用户的用户名和密码,这将默认用在绑定服务器的时候(而不是匿名绑定)。 参考Spring LDAP的AbstractContextSource类的Javadoc获得更多信息。
10.4.3. LDAP搜索对象
通常,比简单DN匹配越来越复杂的策略需要在目录里定位一个用户入口。 这可以使用LdapUserSearch的一个示例,它可以提供认证者实现,比如让他们定位一个用户。 提供的实现是FilterBasedLdapUserSearch。
10.4.3.1. FilterBasedLdapUserSearch
这个bean使用一个LDAP过滤器,来匹配目录里的用户对象。 这个过程在javadoc里进行过解释,在对应的搜索方法,JDK DirContext class。 就如那里解释的,搜索过滤条件可以通过方法指定。 对于这个类,唯一合法的参数是{0},它会代替用户的登录名。
10.4.4. LdapAuthoritiesPopulator
在成功认证用户之后,LdapAuthenticationProvider会调用配置好的LdapAuthoritiesPopulator bean,尝试读取用户的授权集合。 这个DefaultLdapAuthoritiesPopulator是一个实现类,它将通过搜索目录读取授权,查找用户成员所在的组(典型的这会是目录中的groupOfNames或groupOfUniqueNames入口)。 查看这个类的Javadoc获得它如何工作的更多信息。
10.4.5. Spring Bean配置
典型的配置方法,使用到像我们这在里讨论的这些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是 ldap://monkeymachine:389/dc=springframework,dc=org。 认证会被执行,尝试绑定这个DN uid=<user-login-name>,ou=people,dc=springframework,dc=org。 在成功认证之后,会通过查找下面的DN ou=groups,dc=springframework,dc=org 使用默认的过滤条件 (member=<user's-DN>),将角色分配给用户。 角色名会通过每个匹配的“ou”属性获得。
要配置用户的搜索对象,使用过滤条件 (uid=<user-login-name>) 替代DN匹配(或附加到它上面),你需要配置下面的bean
<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。
10.4.6. LDAP属性和自定义UserDetails
使用LdapAuthenticationProvider进行认证的结果,和使用普通Spring Security认证一样,都要使用标准UserDetailsService接口。 它会创建一个UserDetails对象,并保存到返回的Authentication对象里。 在使用UserDetailsService时,常见的需求是可以自定义这个实现,添加额外的属性。 在使用LDAP的时候,这些基本都来自用户入口的属性。 UserDetails对象的创建结果被提供者的UserDetailsContextMapper策略控制,它负责在用户对象和LDAP环境数据之间进行映射:
public interface UserDetailsContextMapper {
UserDetails mapUserFromContext(DirContextOperations ctx, String username, GrantedAuthority[] authority);
void mapUserToContext(UserDetails user, DirContextAdapter ctx);
}
只有第一个方法与认证有关。 如果你提供这个接口的实现,你可以精确控制如何创建UserDetails对象。 第一个参数是Spring LDAP的DirContextOperations实例,他给你访问加载的LDAP属性的通道。 username参数是用来认证的名字,最后一个参数是从用户加载的授权列表。]
环境数据加载的方式不同,视乎你采用的认证方法。 使用BindAuthenticatior,从绑定操作返回的环境会用来读取属性,否则数据会通过标准的环境,从配置好的ContextSource获得(当测试配置好定位用户,这会从搜索对象中获得数据)。
发表评论
-
spring security权限管理手册升级至spring security-3.1.3
2012-12-08 01:01 12296费了半天劲,终于把原来基于spring security 2. ... -
请把acegi替换成Spring Security(内附视频)
2010-03-22 09:54 6562在对web项目进行权限管理时,采用的方法无非是写一大堆JSP或 ... -
Spring Security-3.0.1中文官方文档(翻译版)
2010-01-19 09:36 10644这次发布的Spring Security-3.0.1是一个bu ... -
敬献Spring Security-3.x官方文档中文版
2009-12-29 11:43 10879Spring Security-3.x新近发布,整体的项 ... -
【分享】《基于Spring Security的ACL实现与扩展》内附ppt下载
2009-09-21 09:43 3451上次朋友间技术交流整理的ppt文档,因为之前一直在整理Spri ... -
Spring Security 安全权限管理手册(0.1.0更新)
2009-08-05 10:26 5034随着内容的堆叠,文档结构开始渐渐混乱了,到0.1.0为止关于认 ... -
Spring Security 安全权限管理手册(0.0.9更新)
2009-07-27 09:27 3278这次更新中包含了一个在用户输入密码错误三次后锁定账户的示 ... -
Spring Security 安全权限管理手册(0.0.8更新)
2009-07-20 09:58 1890Spring Security-2.0.5发布,这个bug ... -
Spring Security 安全权限管理手册(0.0.7更新)
2009-07-13 00:38 3196这一次迭代,对章节的命名进行了这里,目标是尽快覆盖Spring ... -
Spring Security 安全权限管理手册(0.0.6更新)
2009-07-10 01:54 1669这一次,我们添加了taglib标签库的时候,以及如何使用多种方 ... -
Spring Security手册更新cas, basic, acl
2009-06-29 18:13 2670这次更新的都是重头戏,CAS和ACL。其中ACL只是简述了Sp ... -
Spring Security手册更新——添加“管理会话”和对namespace,database
2009-06-22 10:04 1942新增的部分有,第八章“管理会话”,附录D,E分别整 ... -
图解Spring Security默认使用的过滤器
2009-06-15 10:38 3860第 9 章 图解过滤器 图 9.1. au ... -
Spring Security-2.0导航-基础篇,又添两章
2009-06-10 10:31 1916目前我们在基础篇中已经编写了六章,基本上可 ... -
Spring Security-2.0入门教程(基础篇)
2009-06-04 17:48 4775欢迎阅读咱们写的Spring Security教程,咱们既不想 ... -
springsecurity-2.x官方文档中文翻译初步整理完成,附上几个例子
2008-08-17 11:12 7891预览地址:http://family168.com/tutor ... -
(翻译)Spring Security-2.0.x参考文档“领域对象安全”
2008-08-13 00:18 2199领域对象安全 24.1. 概述 请注意:在2.0.0之前,S ... -
(翻译)Spring Security-2.0.x参考文档“安全对象实现”
2008-08-12 09:50 2027安全对象实现 23.1. AOP联盟 (MethodInvoc ... -
(翻译)Spring Security-2.0.x参考文档“通用授权概念”
2008-08-11 18:22 2820通用授权概念 22.1. 授权 在认证部分简略提过了,所有的 ... -
(翻译)Spring Security-2.0.x参考文档“安全数据库表结构”
2008-08-10 09:52 2035安全数据库表结构 可以为框架采用不同的数据库结构,这个附录为 ...
相关推荐
### Spring Security 2.0.x完全中文参考文档 #### 序言 本文档旨在为用户提供一份详尽且全面的Spring Security 2.0.x版本的中文指南,它不仅覆盖了核心概念、配置方法以及实际应用案例,还深入探讨了安全框架的...
4. **示例应用程序**:文档提供了多个示例应用程序,如教程示例、LDAP示例、OpenID示例、CAS示例、JAAS示例和预认证示例,以帮助开发者了解如何在不同场景下应用Spring Security。 5. **Servlet应用程序**:这部分...
Spring Security是一个功能强大且高度可定制的认证和访问控制框架,它是针对Java应用程序的安全性需求而设计的。...开发者可以通过阅读官方参考文档来掌握如何在项目中应用和配置Spring Security,实现所需的安全功能。
Spring Security 2.0 提供了基础的认证和授权功能,而3.0进一步强化了模块化设计。这使得开发者可以根据项目需求选择合适的组件,如Web安全模块、方法安全模块和密码存储模块等。 2. **表达式式访问控制...
Spring Security是Java平台上一个强大的安全框架,主要...Spring Security是一个功能丰富且不断进化的安全框架,每个版本的更新都会增加新的特性和改进现有功能,因此建议开发者参考官方文档进行深入学习和实际应用。
### Spring Security 参考文档概览 #### 一、引言与基础知识 ##### 1.1 什么是 Spring Security? Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。它为应用程序提供了一种机制来保护自身免...
你可以在spring参考文档得到更多信息。 命名空间元素可以简单的配置单个bean,或使用更强大的,定义一个备用配置语法,这可以更加紧密的匹配问题域,隐藏用户背后的复杂性。 简单元素可能隐藏事实,多种bean和处理...
其次,"Spring+Security+2.0.x+参考文档.pdf" 是针对 Spring Security 2.0.x 版本的官方参考文档。虽然现在最新的版本可能已经超过了2.0.x,但这份文档仍然具有历史价值,可以让你理解早期版本的设计思想和功能。它...
描述中的"Spring安全研究,springSecurity框架学习源码"表明这个压缩包可能包含了一个完整的Spring Security示例项目,其中包含了源代码,可以作为学习和参考的实例。通过分析和运行这些代码,开发者能够看到Spring ...
虽然 Acegi 已经被 Spring Security(自 Spring 2.0 版本起)所取代,但 Spring Acegi 3 在当时依然是许多项目中的首选安全组件。 **身份验证** 在 Spring Acegi 3 中,身份验证过程是核心功能之一。它支持多种...
- **完整文档**:提供了详尽的参考文档、JavaDoc文档以及相关的书籍资源。 #### 六、支持的应用类型 Acegi安全框架可以应用于各种类型的应用程序,包括但不限于: - **自包含部署包**:如WAR、JAR或EAR文件。 - **...
图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT ...
例如,`定制CAS登录验证.pdf`文档可能详细介绍了如何调整CAS的配置,以支持本地数据库认证、LDAP、Active Directory或者其他外部认证源。此外,还可以自定义登录页面,以适应企业品牌和UI标准。 **CAS协议** CAS...