使用jap-ldap
提示
jap-ldap 支持使用 ldap 中的用户进行身份认证。适配 ldap 中标准密码加密类型,如:clear, k5key, md5, smd5, sha, ssha, sha512, sha256, ext_des, md5crypt, sha256crypt, sha512crypt 和 crypt。
# 准备 LDAP 服务
# 启动 LDAP 服务以及 GUI
新建 docker-compose.yml
填充如下内容:
version: '3.3'
services:
ldap:
image: osixia/openldap
container_name: ldap
hostname: ldap
ports:
- 389:389
- 636:636
environment:
# 是否启用 TLS
LDAP_TLS: "false"
# LDAP 组织名称
LDAP_ORGANISATION: test
# LDAP 域名
LDAP_DOMAIN: test.com
# LDAP 密码,默认登录用户名:admin
LDAP_ADMIN_PASSWORD: 123456
LDAP_CONFIG_PASSWORD: 123456
volumes:
# 数据库存储目录
- /var/ldap/data:/var/lib/ldap
# 配置文件目录
- /var/ldap/conf:/etc/ldap/slapd.d
restart: always
# Redis
ldap-admin:
image: osixia/phpldapadmin
container_name: ldap-admin
hostname: ldap-admin
environment:
# 禁用HTTPS
PHPLDAPADMIN_HTTPS: "false"
# LDAP 的 IP 或者域名,此处为容器名
PHPLDAPADMIN_LDAP_HOSTS: ldap
ports:
- 19999:80
restart: always
depends_on:
- ldap
links:
- ldap
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
启动 docker 容器:docker-compose -p ldap up -d
提示
- Docker 以及 Docker Compose 需要开发者自己安装。
- 如果有非 Docker 的 LDAP 服务也可以使用。
# 添加测试用户
启动完成后访问:http://localhost:19999/index.php (opens new window)
点击左侧的 “login” 按钮使用管理员(启动 docker 容器时指定的)账号密码登录
本例的账号密码
账号:cn=admin,dc=test,dc=com
密码:123456
创建用户
按照提示填写:
选择 ”commit“ 按钮进行确认
创建好的用户信息如下:
关于密码加密算法
目前 jap-ldap 已经适配了 ldap 的如下密码加密算法:clear、md5、sha、ssha、sha512、k5key、md5crypt、sha256crypt、sha512crypt。如果选择了其他加密算法,可能导致登录失败。
# 集成 jap-ldap
# 引入依赖
<dependency>
<groupId>com.fujieid</groupId>
<artifactId>jap-ldap</artifactId>
<version>{latest-version}</version>
</dependency>
2
3
4
5
# 实现 JapUserService
JapUserService
是 JAP 调用(操作)开发者业务系统中的用户接口。使用 jap-http-api
模块时,如果指定的认证 HTTP 认证方式是 Bearer 认证,则需要实现 saveHttpAuthedJapUser
方法和 getByName
方法。
public class JapLdapUserServiceImpl implements JapUserService {
private static List<JapUser> userDatas = new ArrayList<>();
@Override
public JapUser createAndGetLdapUser(Object userInfo) {
// 转换 object 为 LdapPerson
LdapPerson ldapPerson = (LdapPerson) userInfo;
// 将 ldapPerson 持久化到数据库中或者其他媒介中
JapUser japUser = new JapUser();
japUser.setUserId(ldapPerson.getUid());
japUser.setUsername(ldapPerson.getUid());
// 此处仅作演示,保存的是加密后的密码
japUser.setPassword(ldapPerson.getPassword());
japUser.setAdditional(ldapPerson);
userDatas.add(japUser);
return japUser;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 实现 Controller
import com.fujieid.jap.core.JapUserService;
import com.fujieid.jap.core.config.JapConfig;
import com.fujieid.jap.core.context.JapAuthentication;
import com.fujieid.jap.core.strategy.JapStrategy;
import com.fujieid.jap.demo.ldap.config.JapConfigContext;
import com.fujieid.jap.http.adapter.jakarta.JakartaRequestAdapter;
import com.fujieid.jap.http.adapter.jakarta.JakartaResponseAdapter;
import com.fujieid.jap.ldap.LdapConfig;
import com.fujieid.jap.ldap.LdapStrategy;
import com.fujieid.jap.sso.config.JapSsoConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
* @version 1.0.0
* @since 1.0.0
*/
@RestController
@RequestMapping("/ldap")
public class JapLdapController {
@Autowired
private JapUserService japUserService;
@GetMapping("/login")
public String toLogin(HttpServletRequest request, HttpServletResponse response) {
JapConfigContext.strategy = "ldap";
if (JapAuthentication.checkUser(new JakartaRequestAdapter(request), new JakartaResponseAdapter(response)).isSuccess()) {
return "redirect:/";
}
return "login";
}
@PostMapping("/login")
public Object renderAuth(HttpServletRequest request, HttpServletResponse response) {
JapStrategy ldapStrategy = new LdapStrategy(japUserService, new JapConfig());
return ldapStrategy.authenticate(new LdapConfig()
.setUrl("ldap://localhost:389")
.setBindDn("cn=admin,dc=test,dc=com")
.setCredentials("123456")
.setBaseDn("dc=test,dc=com")
.setTrustStore("")
.setTrustStorePassword(""),
new JakartaRequestAdapter(request),
new JakartaResponseAdapter(response));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 测试登录
测试 /ldap/login
接口:
# 使用邮箱登录
如果使用 email 登录,在配置 LdapConfig
时需要自定义 filter
:
new LdapConfig()
// ...
.setFilters("(&(objectClass=inetOrgPerson)(mail=%s))")
2
3
小贴士
如果需要使用其他属性登录,可以参考【使用邮箱登录】修改 filter
即可。
# LdapConfig
配置项
参数名 | 参数类型 | 必填 | 解释 |
---|---|---|---|
url | String | √ | LDAP 数据源 URL,如:ldap://localhost:389 |
bindDn | String | √ | LDAP 管理员用户名,如:cn=admin,dc=example,dc=org |
credentials | String | √ | LDAP 管理员密码 |
baseDn | String | √ | 基本检索目录,如:dc=example,dc=org |
filters | String | x | 查询条件,默认为 (&(objectClass=organizationalPerson)(uid=%s)) |
trustStore | String | x | 使用 LDAPS 时必须配置该参数,表示可信证书 |
trustStorePassword | String | x | 可信证书的密码 |
usernameField | String | × | 通过 request.getParameter(usernameField ) 从 request 中获取用户名,默认为“username” |
passwordField | String | × | 通过 request.getParameter(passwordField ) 从 request 中获取密码,默认为"password" |
# 示例 Demo 项目
- 01
- 经验总结:关于为 JAP 开发不同语言的 Demo 的总结11-02
- 02
- jap-spring-boot-starter 使用帮助10-28