ldap springboot 整合认证
时间: 2023-10-01 19:02:17 浏览: 110
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 认证示例,可以根据实际需求进行修改和扩展。
阅读全文