ldap和springboot整合

本文详细介绍如何在SpringBoot项目中整合LDAP,包括Maven依赖导入、配置文件设置、实体类定义及简单增删改查操作。通过实例演示验证用户登录名与密码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ldap和springboot整合(自己项目遇到的坑)
首先导入相关maven依赖:
在这里插入图片描述

2.在application-local.properties配置:
#sn 真实名称 cn-名字 ou-部门 o-公司
#配置ldap服务器的ip和端口(端口一般是389)
spring.ldap.urls=ldap://ip:端口
#base-dn 要查询的唯一标识:
#所有查询的绝对路径 查询users中组织的域名后缀是cn的用户
spring.ldap.embedded.base-dn=ou=users,o=组织,dc=cn
##登录服务器的用户名和密码 最简单的就是下载一个ldap客户端,填了信息登录一下
####!!!!username要填写的信息!!!!
#后面还可以写多个dc 根据自己的公司配置来(有些的username就是有ou=。。但是有些就没有,要自己会判断)了
spring.ldap.username=cn=登录用户名,o=组织,dc=cn
#密码 直接写密码即可
spring.ldap.password=密码

3.实体类Person
@Data
@ToString
//entry(条目 其实就相当于数据库中的一条数据) objectClasses必填 但是这个也是不一样的
@Entry(objectClasses = {“inetOrgPerson”}, base = “ou=users,o=组织,dc=cn”)
public class Person {
@Id
@JsonIgnore
private Name dn; (相当于主键 例:dn=cn=用户名,ou=users,o=组织,dc=cn)
/**
* 人员账号
/
@Attribute(name = “cn”)
private String personName;
/
*
* 用户类型
*/
@Attribute(name = “employeeType”)(attribute是实体类和ldap中字段的映射)
private String userType;
@Attribute(name = “givenName”)
private String userName;
}

4.配置之后就可以做简单的增删改查了 不过客户端调用的话 一般都是查询多
例(我用的是mybatis-plus 正常写即可):
@Service
public class UserService extends ServiceImpl<UserMapper, Users> {
@Resource
private LdapTemplate ldapTemplate;

//用ldapTemplate操作ldap

1.验证登录用户的名和用户密码(ldaptemplate其他操作方式自己查)
public void getUsersMessage(String userName, String userPassword) {
//先验证用户是否存在 若是存在,再验证用户密码是否正确
List list = ldapTemplate.find(query().base(“ou=users,o=组织,dc=cn”).where(“cn”).is(userName), Person.class);
if(ListUtil.isNotEmpty(list)){
Boolean flag=ldapTemplate.authenticate(list.get(0).getDn(), “(objectclass=inetOrgPerson)”, userPassword);
System.out.println(“密码是否正确:”+flag);
//true说明密码正确
}
}

}

LDAP (Lightweight Directory Access Protocol) 是一种基于 TCP/IP 协议的轻量级目录访问协议,通常用于企业级应用程序中的用户身份验证授权。Spring Boot 提供了对 LDAP 认证的支持,可以轻松地将其集成到应用程序中。 下面是一个基本的 LDAP 认证示例: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-ldap</artifactId> </dependency> ``` 2. 配置 application.yml 在 application.yml 文件中添加以下配置: ```yaml spring: ldap: urls: ldap://localhost:389 base: dc=example,dc=com user-search-base: ou=people user-search-filter: (uid={0}) group-search-base: ou=groups group-search-filter: (uniqueMember={0}) group-role-attribute: cn manager-dn: cn=admin,dc=example,dc=com manager-password: admin ``` 这里配置了 LDAP 服务器的 URL、基础 DN、用户搜索基础 DN、用户搜索过滤器、组搜索基础 DN、组搜索过滤器、组角色属性、管理员 DN 管理员密码。 3. 创建 UserDetailsServiceImpl 类 创建一个实现 UserDetailsService 接口的类,用于从 LDAP 中加载用户详细信息。 ```java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private LdapTemplate ldapTemplate; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { List<UserDetails> users = ldapTemplate.search( LdapQueryBuilder.query().where("uid").is(username), (AttributesMapper<UserDetails>) attrs -> { String password = (String) attrs.get("userPassword").get(); List<GrantedAuthority> authorities = new ArrayList<>(); attrs.getAll().stream() .filter(attr -> attr.getID().startsWith("memberOf")) .flatMap(attr -> LdapUtils.convertValueToList(attr).stream()) .forEach(groupDn -> { String groupName = LdapUtils.getRdnValue(new LdapName(groupDn)).toString(); authorities.add(new SimpleGrantedAuthority("ROLE_" + groupName)); }); return new User(username, password, authorities); }); if (users.isEmpty()) { throw new UsernameNotFoundException("User not found"); } return users.get(0); } } ``` 这里使用 LdapTemplate 搜索 LDAP 目录,将查询结果转换为 UserDetails 对象,并返回该对象。 4. 创建 WebSecurityConfig 类 创建一个继承 WebSecurityConfigurerAdapter 的类,用于配置 Spring Security。 ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessURL("/") .permitAll() .and() .logout() .logoutUrl("/logout") .permitAll(); } @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } } ``` 这里配置了 HTTP 访问策略登录、注销页面的 URL,并将 UserDetailsService 注册到 AuthenticationManagerBuilder 中。 5. 创建登录注销页面 创建一个登录页面一个注销页面,用于在浏览器中进行身份验证注销。例如: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/login" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username"><br><br> <label for="password">Password:</label> <input type="password" id="password" name="password"><br><br> <input type="submit" value="Login"> </form> </body> </html> ``` ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Logout</title> </head> <body> <h1>Logout</h1> <form action="/logout" method="post"> <input type="submit" value="Logout"> </form> </body> </html> ``` 6. 运行应用程序 现在可以启动应用程序并在浏览器中访问它。输入正确的用户名密码,应该可以成功登录。登录后,可以访问受保护的资源。注销后,应该不能访问受保护的资源。 以上是一个基本的 LDAP 认证示例,可以根据实际需求进行修改扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值