首页 > 数据库 >Redis管理平台Cachecloud使用LDAP进行认证登录

Redis管理平台Cachecloud使用LDAP进行认证登录

时间:2022-11-24 10:25:56浏览次数:39  
标签:userName java ldap Redis Cachecloud LDAP redirectUrl import loginResult

cachecloud版本:https://github.com/sohutv/cachecloud/archive/refs/tags/2.2.tar.gz

 

公司使用ldap的ssl认证,java本人一点都不懂,耗费几天时间没有搞定,只能曲线救国,使用stunnel做代理连接ldaps,cachecloud连接stunnel的代理端口

stunnel配置:

/etc/stunnel/ldap.conf

[ldap]
client = yes
accept = 127.0.0.1:389
connect = ldap-srv.jpushoa.com:636
CAfile = /etc/openldap/cacerts/cacert.pem
cert = /etc/openldap/cacerts/client.crt
key = /etc/openldap/cacerts/client.key
启动命令:stunnel /etc/stunnel/ldap.conf     ldap认证代码: cachecloud-2.2/cachecloud-custom/src/main/java/com/sohu/cache/login/impl/DefaultLoginComponent.java
package com.sohu.cache.login.impl;

import com.sohu.cache.login.LoginComponent;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import java.util.Hashtable;

import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by yijunzhang
 */
public class DefaultLoginComponent implements LoginComponent {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public boolean passportCheck(String userName, String password) {
       //LDAP登陆地址
        String ldapUrl = "ldap://127.0.0.1:389";
        if (StringUtils.isBlank(ldapUrl)) {
            logger.warn("ldap url is empty!!");
            return true;
        }
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
        env.put("java.naming.provider.url", ldapUrl);
        env.put("java.naming.security.authentication", "simple");
        env.put("java.naming.security.principal", "uid=" + userName + ",ou=people,dc=jpushoa,dc=com");
        env.put("java.naming.security.credentials", password);
        DirContext ctx = null;
        try {
            ctx = new InitialDirContext(env);
            if (ctx != null) {
                return true;
            }
        } catch (Exception e) {
            logger.error("username {} passportCheck: " + e.getMessage(), userName, e);
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
            }
        }
        return false;
    }

        @Override
    public String getEmail(String ticket) {
        return null;
    }

    @Override
    public String getRedirectUrl(HttpServletRequest request) {
        StringBuffer redirectUrl = new StringBuffer();
        redirectUrl.append(request.getSession(true).getServletContext().getContextPath());
        redirectUrl.append("/manage/login?");
        // 跳转地址
        redirectUrl.append("redirectUrl");
        redirectUrl.append("=");
        redirectUrl.append(request.getRequestURI());
        // 跳转参数
        String query = request.getQueryString();
        if (StringUtils.isNotBlank(query)) {
            redirectUrl.append("?");
            try {
                redirectUrl.append(URLEncoder.encode(request.getQueryString(), "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                logger.error(e.getMessage(), e);
            }
        }
        return redirectUrl.toString();
    }

    @Override
    public String getLogoutUrl() {
        return null;
    }
}

 

cachecloud 在ldap认证通过后会校验本地是否有该账号,本地没有则报错,这里需要修改下,ldap认证通过后,如果本地没有账号,则自动创建 代码文件: cachecloud-2.2/cachecloud-web/src/main/java/com/sohu/cache/web/controller/LoginController.java
/**
     * 用户登录
     *
     * @param userName 用户名
     * @param password 密码
     * @param isAdmin  是否勾选超级管理员选项,1是0否
     * @return
     */
    @RequestMapping(value = "/loginIn", method = RequestMethod.POST)
    public ModelAndView loginIn(HttpServletRequest request,
                                HttpServletResponse response, Model model, String userName, String password, boolean isAdmin) {
        // 登录结果
        LoginResult loginResult = new LoginResult();
        loginResult.setAdminEnum((isAdmin == true ? AdminEnum.IS_ADMIN : AdminEnum.NOT_ADMIN));
        loginResult.setLoginEnum(LoginEnum.LOGIN_WRONG_USER_OR_PASSWORD);

        AppUser userModel = null;
        if (ConstUtils.SUPER_ADMIN_NAME.equals(userName)) {
            userModel = userService.getByName(userName);
            if (userModel != null && ConstUtils.SUPER_ADMIN_PASS.equals(password)) {
                loginResult.setLoginEnum(LoginEnum.LOGIN_SUCCESS);
            } else {
                loginResult.setLoginEnum(LoginEnum.LOGIN_WRONG_USER_OR_PASSWORD);
            }
        } else {
            if (loginComponent != null && loginComponent.passportCheck(userName, password)) {
                // 同时要验证是否有cachecloud权限
                userModel = userService.getByName(userName);
                if (userModel != null && userModel.getType() != AppUserTypeEnum.NO_USER.value()) {
                    if (isAdmin) {
                        if (AppUserTypeEnum.ADMIN_USER.value().equals(userModel.getType())) {
                            loginResult.setLoginEnum(LoginEnum.LOGIN_SUCCESS);
                        } else {
                            loginResult.setLoginEnum(LoginEnum.LOGIN_NOT_ADMIN);
                        }
                    } else {
                        loginResult.setLoginEnum(LoginEnum.LOGIN_SUCCESS);
                    }
                } else {
                    // 用户不存在
                    // loginResult.setLoginEnum(LoginEnum.LOGIN_USER_NOT_EXIST);
                    // 用户不存在则插入用户
                    AppUser appUser = new AppUser(userName, userName, userName + "@jiguang.cn", "13500000000", "13500000000", '2', '1');
                   // appUser = new AppUser(user.getName(), user.getChName(), user.getEmail(), user.getMobile(), user.getWeChat(), AppUserTypeEnum.REGULAR_USER.value(), AppUserAlertEnum.YES.value());
                    userService.save(appUser);
                }
            }
        }
        // 登录成功写入登录状态
        if (loginResult.getLoginEnum().equals(LoginEnum.LOGIN_SUCCESS)) {
            userLoginStatusService.addLoginStatus(request, response, userModel.getName());
        }
        model.addAttribute("success", loginResult.getLoginEnum().value());
        model.addAttribute("admin", loginResult.getAdminEnum().value());
        return new ModelAndView();
    }

 

标签:userName,java,ldap,Redis,Cachecloud,LDAP,redirectUrl,import,loginResult
From: https://www.cnblogs.com/MacoLee/p/16920990.html

相关文章

  • redis的持久化
    redis是一种基于内存的非关系型数据库,内存虽然快但是数据也更易丢失,所以redis提供了两种持久化方式,分别是RDB和AOF,今天就介绍下这两种持久化方式以及原理一、RDB1、介绍......
  • ldap
    https://www.zhangqiongjie.com/5658.html1.Referencehttps://www.golinuxcloud.com/configure-ldap-client-auth-ldap-server/https://computingforgeeks.com/run-open......
  • Redis知识
     Redis是什么Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis&Memcached......
  • redis 缓存设计之穿透击穿雪崩
    缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常处于容错的考虑,如果从存储层查不到数据则不写入缓冲层缓存穿透将导致不存在的数据每次请求......
  • redis通过lua脚本------实现原子性操作(PHP代码实现)
    背景一直都知道redis里可以执行lua脚本,但是以前一直搞不懂redis为啥要这么搞,今天看了人家一篇博文,说秒杀场景出现商品超卖,解决方案是利用lua脚本来保证操作的原子性自己......
  • Redis后端面试题
    目录简要说一下什么是Redis?为什么要⽤Redis(缓存)?为什么要⽤Redis⽽不⽤map/guava做缓存?Redis与Memcached的区别Redis的应⽤场景redis为什么那么快redis有哪些数......
  • redis启动客户端
    启动Redis启动方式:①前台启动redis-server②后台启动redis-server&最好使用后台启动,不占用命令终端.③根据配置文件启动启动命令配置文件&启动redis服务时,指......
  • 【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
    问题描述在AzureRedis服务中,如何实现只允许AzureAppService访问呢? 问题解答AzureRedis开启防火墙的功能,并在防火墙中添加上AppService的出口IP地址即可。两步......
  • Redis 菜鸟进阶
    Redis菜鸟进阶背景最近产品一直要优化性能,加强高可用.有一个课题是Redis高可用与性能调优.我这边其实获取到的内容很有限.最近济南疫情严重,自己锁骨骨折.然后通......
  • redis的安装及使用
    安装redis操作步骤#解压tar-zxvfredis-5.0.14/.tat.gz-C/urs/local/#重命名,易读mv/urs/local/redis-5.0.14//urs/local/redis/#安装环境依赖包yumin......