绕过dolphinscheduler 框架的登录,进行免密登录

首先需要知道,dolphinscheduler的拦截有哪些

前台的url拦截;后台的ur拦截

拦截的英文(Interceptor),就全局搜这单词肯定会有收获
很多时候去看一个项目,有点摸不着头脑,那就去搜吧,搜关键词,就比如url的拦截,我们就搜Interceptor这个英文单词

前台的拦截器

index.js

在这里插入图片描述

在这里插入图片描述
走的是一个get方法,什么方法呢,这个方法藏在config里面

/datastudio/users/get-user-info

在这里插入图片描述

那么 /datastudio/users/get-user-info 这个方法会经过几层呢,答案是:两层

1、拦截器一层,拦截器就是LoginHandlerInterceptor(这个,在后台的拦截器部分有提到),所以需要走到免密那边,把用户塞到session_user
2、get-user-info 获取user信息一层,userController的getUserInfo方法

我们会发现,getUserInfo这个方法需要用到session_user这个参数数据,所以①先走拦截器②再走getUserInfo这个顺序是ok的,不然会就会报用户找不到的错误
在这里插入图片描述

后台的拦截器

1、拦截的英文(Interceptor),就全局搜这单词肯定会有收获

很多时候去看一个项目,有点摸不着头脑,那就去搜吧,搜关键词,就比如url的拦截,我们就搜Interceptor这个英文单词
在这里插入图片描述
这个文件夹里不就是么

2、LoginHandlerInterceptor,一看这个名字就是登录拦截

登录有二种形式
1、token(这个咱不用)
2.、用户名密码,咱就直接校验用户名或者id(所以userid是必须要有的)就让user的基础信息,塞入到session里面,我这里是直接写死的,你们可以,做一个时间戳,和加密


  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

    // get token
    String token = request.getHeader("token");
    String userid = request.getParameter("userid");
    User user = null;
    if(!StringUtils.isEmpty(userid)){
      //BI免密登陆
      //userid,time,token,
      String time = request.getParameter("timeString");
      String tk = request.getParameter("tk");
      //TODO
      //再次加密校验 userid+time 加密后 跟tk 验证 一致
      //登陆
      String  tkMD5 = getMD5Str(userid + time);
      QueryWrapper<User> wrapper = new QueryWrapper<>();
      wrapper.eq("user_name", userid);
      user = userMapper.selectOne(wrapper);

      /* session 的内容*/
      String ip = BaseController.getClientIpAddress(request);
      String sessionId = sessionService.createSession(user, ip);
      response.setStatus(HttpStatus.SC_OK);
      Map<String, String> cookieMap = Collections.singletonMap(Constants.SESSION_ID, sessionId);
      for (Map.Entry<String, String> cookieEntry : cookieMap.entrySet()) {
        Cookie cookie = new Cookie(cookieEntry.getKey(), cookieEntry.getValue());
        cookie.setPath("/");
        cookie.setHttpOnly(false);
        response.addCookie(cookie);
      }
      /* session 的内容 */
      /*if(tk.equals(tkMD5)){

      }*/
    }else{
      if (StringUtils.isEmpty(token)){
        user = authenticator.getAuthUser(request);
        // if user is null
        if (user == null) {
          response.setStatus(HttpStatus.SC_UNAUTHORIZED);
          logger.info("user does not exist");
          return false;
        }
      }else {
        user = userMapper.queryUserByToken(token);
        if (user == null) {
          response.setStatus(HttpStatus.SC_UNAUTHORIZED);
          logger.info("user token has expired");
          return false;
        }
      }
    }
    request.setAttribute(Constants.SESSION_USER, user);
    return true;
  }

3、PasswordAuthenticator,密码校验,在有token的情况下,会走用户校验,因为之前已经

在这里插入图片描述

@Override
public User getAuthUser(HttpServletRequest request) {
    Session session = sessionService.getSession(request);
    if (session == null) {
        logger.info("session info is null ");
        return null;
    }
    //get user object from session
    return userService.queryUser(session.getUserId());
}

特别重要的一个东西!!!!Session的一个返回,保持登录的秘密

代码里面的这个部分特别重要

cookie.setPath("/");
cookie.setHttpOnly(false);

为什么要加这个呢,首先加上 cookie.setPath(“/”); ,表示全局的路径,不然前台js获取不了,其次cookie.setHttpOnly(false); 也是

/* session 的内容*/
      String ip = BaseController.getClientIpAddress(request);
      String sessionId = sessionService.createSession(user, ip);
      response.setStatus(HttpStatus.SC_OK);
      Map<String, String> cookieMap = Collections.singletonMap(Constants.SESSION_ID, sessionId);
      for (Map.Entry<String, String> cookieEntry : cookieMap.entrySet()) {
        Cookie cookie = new Cookie(cookieEntry.getKey(), cookieEntry.getValue());
        cookie.setPath("/");
        cookie.setHttpOnly(false);
        response.addCookie(cookie);
      }
      /* session 的内容 */

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值