很多企业内部使用LDAP保存用户信息,这章我们来看一下如何从LDAP中获取Spring Security所需的用户信息。
首先在pom.xml中添加ldap所需的依赖。
<dependency> <groupId>org.apache.directory.server</groupId> <artifactId>apacheds-server-jndi</artifactId> <version>1.5.5</version> </dependency> <dependency> <groupId>org.springframework.ldap</groupId> <artifactId>spring-ldap</artifactId> <version>1.2.1</version> </dependency>
然后修改配置文件,使用内嵌的ldap服务器和ldap-authentication-provider。
<ldap-server ldif="classpath:users.ldif" port="33389" root="dc=family168,dc=com"/> <ldap-authentication-provider group-search-filter="member={0}" group-search-base="ou=groups" user-search-base="ou=people" user-search-filter="uid={0}" />
这里配置内嵌的ldap服务器从users.ldif文件中读取初始化数据,端口使用33389,查询目录的根目录设置为dc=family168,dc=com。
ldap-authentication-provider设置查找组和用户的配置,分别使用ou=groups表示组,使用ou=people表示用户。
用于保存ldap初始信息的文件内容如下:
dn: ou=groups,dc=family168,dc=com objectclass: top objectclass: organizationalUnit ou: groups dn: ou=people,dc=family168,dc=com objectclass: top objectclass: organizationalUnit ou: people dn: uid=user,ou=people,dc=family168,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: FirstName LastName sn: LastName uid: user userPassword: user dn: uid=admin,ou=people,dc=family168,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: FirstName LastName sn: LastName uid: admin userPassword: admin dn: cn=user,ou=groups,dc=family168,dc=com objectclass: top objectclass: groupOfNames cn: ROLE_USER member: uid=user,ou=people,dc=family168,dc=com member: uid=admin,ou=people,dc=family168,dc=com dn: cn=admin,ou=groups,dc=family168,dc=com objectclass: top objectclass: groupOfNames cn: ROLE_ADMIN member: uid=admin,ou=people,dc=family168,dc=com
这里在dc=family168,dc=com目录下创建了groups和people两个目录,然后在people目录下创建了user和admin两个用户。在groups目录下创建了admin和user两个目录,并将user和admin两个用户与groups的user目录关联,又将admin用户与groups的admin目录关联。
在系统初始化后,Spring Security会在people下读取用户信息,而对应的权限信息是对应用户所关联的groups信息,Spring Security会将查询到的权限信息加上ROLE_前缀,如cn=admin最终会转换为ROLE_ADMIN。