一、配置界面
LDAP设置.png勾选“启用LDAP认证”,由于我配置的用户名就是uid,使用手机号登录。
配置保存后,测试连接,并且测试登录。
测试连接.png 测试登录.png
比较简单,主要就对LDAP集成完毕。
二、登录界面
LDAP登录.png LDAP和本地模式.png image.pngldap的用户属性和Metersphere本地用户的属性对应关系:
{"name": "description","email": "mail", "username":"uid"}
结论: ldap的用户如果不存在于metersphere本地数据库中,则新增,否则更新用户的name/phone/email。
详见metersphere的LdapController.java
@Resource
private UserService userService;
@Resource
private LdapService ldapService;
@Resource
private SystemParameterService systemParameterService;
@PostMapping(value = "/signin")
@MsAuditLog(module = "system_parameter_setting", type = OperLogConstants.LOGIN, title = "LDAP")
public ResultHolder login(@RequestBody LoginRequest request) {
String isOpen = systemParameterService.getValue(ParamConstants.LDAP.OPEN.getValue());
if (StringUtils.isBlank(isOpen) || StringUtils.equals(Boolean.FALSE.toString(), isOpen)) {
MSException.throwException(Translator.get("ldap_authentication_not_enabled"));
}
DirContextOperations dirContext = ldapService.authenticate(request);
String email = ldapService.getMappingAttr("email", dirContext);
String userId = ldapService.getMappingAttr("username", dirContext);
SecurityUtils.getSubject().getSession().setAttribute("authenticate", UserSource.LDAP.name());
SecurityUtils.getSubject().getSession().setAttribute("email", email);
if (StringUtils.isBlank(email)) {
MSException.throwException(Translator.get("login_fail_email_null"));
}
// userId 或 email 有一个相同即为存在本地用户
User u = userService.selectUser(userId, email);
String name = ldapService.getMappingAttr("name", dirContext);
String phone = ldapService.getNotRequiredMappingAttr("phone", dirContext);
if (u == null) {
// 新建用户 获取LDAP映射属性
// String name = ldapService.getMappingAttr("name", dirContext);
// String phone = ldapService.getNotRequiredMappingAttr("phone", dirContext);
User user = new User();
user.setId(userId);
user.setName(name);
user.setEmail(email);
if (StringUtils.isNotBlank(phone)) {
user.setPhone(phone);
}
user.setSource(UserSource.LDAP.name());
userService.addLdapUser(user);
} else {
// 更新
u.setName(name);
u.setPhone(phone);
u.setEmail(email);
userService.updateUser(u);
}
// 执行 LocalRealm 中 LDAP 登录逻辑
LoginRequest loginRequest = new LoginRequest();
loginRequest.setUsername(userId);
return userService.login(loginRequest);
}
网友评论