美文网首页
metersphere集成LDAP实现统一身份认证

metersphere集成LDAP实现统一身份认证

作者: 天草二十六_简村人 | 来源:发表于2021-10-29 14:08 被阅读0次

一、配置界面

LDAP设置.png

勾选“启用LDAP认证”,由于我配置的用户名就是uid,使用手机号登录。

配置保存后,测试连接,并且测试登录。


测试连接.png 测试登录.png

比较简单,主要就对LDAP集成完毕。

二、登录界面

LDAP登录.png LDAP和本地模式.png image.png

ldap的用户属性和Metersphere本地用户的属性对应关系:
{"name": "description","email": "mail", "username":"uid"}

image.png

结论: 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);
    }

相关文章

网友评论

      本文标题:metersphere集成LDAP实现统一身份认证

      本文链接:https://www.haomeiwen.com/subject/pqpialtx.html