Spring Security身份验证详细介绍( 八 )


  • 基于LDAP的身份验证
LDAP经常被企业用作用户信息的中心存储库和身份验证服务 。它还可以用于存储应用程序用户的角色信息 。
当Spring Security被配置为接受用户名/密码进行身份验证时,Spring Security将使用基于LDAP的身份验证 。但是,尽管利用用户名/密码进行身份验证,但它并没有使用UserDetailsService集成,因为在绑定身份验证中,LDAP服务器没有返回密码,因此应用程序不能执行密码验证 。
对于如何配置LDAP服务器,有许多不同的场景,因此Spring Security的LDAP提供者是完全可配置的 。它使用单独的策略接口进行身份验证和角色检索,并提供可以配置为处理各种情况的缺省实现 。
先决条件
在尝试将LDAP与Spring Security一起使用之前,您应该熟悉LDAP 。下面的链接很好地介绍了相关的概念,并提供了使用免费LDAP服务器OpenLDAP设置目录的指南
:https://www.zytrax.com/books/ldap/ 。熟悉一些用于从Java访问LDAP的JNDI api可能也很有用 。我们在LDAP提供程序中没有使用任何第三方LDAP库(Mozilla、JLDAP等),但是Spring LDAP得到了广泛的使用,所以如果您计划添加自己的自定义,对该项目有所了解可能会有所帮助 。
在使用LDAP身份验证时,一定要确保正确配置LDAP连接池 。如果您不熟悉如何做到这一点,可以参考Java LDAP文档(
https://docs.oracle.com/javase/jndi/tutorial/ldap/connect/config.html) 。
设置嵌入式LDAP服务器
您需要做的第一件事是确保有一个LDAP Server来指向您的配置 。为简单起见,最好从嵌入式LDAP Server开始 。Spring Security支持使用以下任意一种:
  • 嵌入式UnboundID服务器
  • 嵌入式ApacheDS服务器
在下面的示例中,我们将下面的users.ldif作为类路径资源来初始化嵌入的LDAP服务器,其中用户user和admin的密码都是password 。
users.ldif的内容
dn: ou=groups,dc=springframework,dc=orgobjectclass: topobjectclass: organizationalUnitou: groupsdn: ou=people,dc=springframework,dc=orgobjectclass: topobjectclass: organizationalUnitou: peopledn: uid=admin,ou=people,dc=springframework,dc=orgobjectclass: topobjectclass: personobjectclass: organizationalPersonobjectclass: .NETOrgPersoncn: Rod Johnsonsn: Johnsonuid: adminuserPassword: passworddn: uid=user,ou=people,dc=springframework,dc=orgobjectclass: topobjectclass: personobjectclass: organizationalPersonobjectclass: inetOrgPersoncn: Dianne Emusn: Emuuid: useruserPassword: passworddn: cn=user,ou=groups,dc=springframework,dc=orgobjectclass: topobjectclass: groupOfNamescn: useruniqueMember: uid=admin,ou=people,dc=springframework,dc=orguniqueMember: uid=user,ou=people,dc=springframework,dc=orgdn: cn=admin,ou=groups,dc=springframework,dc=orgobjectclass: topobjectclass: groupOfNamescn: adminuniqueMember: uid=admin,ou=people,dc=springframework,dc=org嵌入式UnboundID服务器
如果你想使用UnboundID,请指定以下依赖项:
UnboundID依赖项Maven:
<dependency><groupId>com.unboundid</groupId><artifactId>unboundid-ldapsdk</artifactId><version>4.0.14</version><scope>runtime</scope></dependency>然后可以配置嵌入式LDAP服务器
示例:嵌入式LDAP服务器配置
@BeanUnboundIdContainer ldapContainer() {return new UnboundIdContainer("dc=springframework,dc=org","classpath:users.ldif");}嵌入式ApacheDS服务器
Spring Security使用不再维护的ApacheDS 1.x 。不幸的是ApacheDS 2.x只发布了里程碑版本,没有稳定的版本 。一旦ApacheDS 2.x稳定版本发布了,我们会考虑更新 。
如果你想使用Apache DS,那么指定以下依赖项:
ApacheDS的Maven依赖项:
<dependency><groupId>org.apache.directory.server</groupId><artifactId>apacheds-core</artifactId><version>1.5.5</version><scope>runtime</scope></dependency><dependency><groupId>org.apache.directory.server</groupId><artifactId>apacheds-server-jndi</artifactId><version>1.5.5</version><scope>runtime</scope></dependency>然后可以配置嵌入式LDAP服务器:
示例:嵌入式LDAP服务器配置
@BeanApacheDSContainer ldapContainer() {return new ApacheDSContainer("dc=springframework,dc=org","classpath:users.ldif");}LDAP ContextSource
一旦LDAP服务器指向您的配置,您需要将Spring Security配置为指向应该用于对用户进行身份验证的LDAP服务器 。这是通过创建LDAP ContextSource来完成的,它相当于JDBC数据源 。
示例:LDAP Context Source
ContextSource contextSource(UnboundIdContainer container) {return new DefaultSpringSecurityContextSource("ldap://localhost:53389/dc=springframework,dc=org");}


推荐阅读