公司做一个基础的数据平台,有一个功能是整合以前做过的项目。需求:通过基础平台登陆之后点击相应链接可以直接跳转到以前写过项目的首页,并具有一定权限。类似于单点登录。

公司做一个基础的数据平台,有一个功能是整合以前做过的项目。需求:通过基础平台登陆之后点击相应链接可以直接跳转到以前写过项目的首页,并具有一定权限。类似于单点登录。

大致思路

A:基础平台
B:已有的项目

A访问B的首页目录,带一个token参数-------> B拦截地址并获取token------>B带着已接收到的token和A的客户id、客户秘钥主动请求A------>A返回给B一个用户信息------------>B拿着A的用户信息去生成token塞进前端。(具体细节请分析后端代码)

## 前端代码

router.beforeEach((to, from, next) => {
  NProgress.start() // start progress bar

  //如果拦截到地址参数带有access_token  向后端发请求--->后端主动请求--->得到用户信息生成token塞进前端
  if(to.query.access_token!=null){
     jieruPingtai(to.query.access_token).then(response => {
       store.dispatch('LoginByUser', response).then(() => {
           router.push({
             path: '/'
           })
         })
     })
  }else{
  ........
LoginByUser({commit}, token) {
      return new Promise((resolve, reject) => {
        setToken(token);
        commit('SET_TOKEN', token);
        resolve()
      })
    }

后端代码


```java
//Service层
//事物回滚,报异常执行
 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = Exception.class)
    public String getUserToken(String access_token){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String tu = tokenUrl+"?access_token="+access_token+"&client_id="+client_id+"&client_secret="+client_secret;
        String str = HttpUtilsAll.doGet(tu);
        User user = new User();
        Jieshou jieshou = JSONObject.parseObject(str, Jieshou.class);
        user.setId(UUIDUtils.generateUuid());
        user.setSid(jieshou.getData().getUserId());
        user.setUsername(jieshou.getData().getUserName());
        user.setName(jieshou.getData().getNickName());
        user.setCrtUserName(jieshou.getData().getCreateBy());
        user.setTenantId("ac88ceb386aa4231b09bf472cb937c24");
        user.setDepartId("3201d74080bf4ac19a48271ca7751d3a");
        try {
            user.setCrtTime(sdf.parse(jieshou.getData().getCreateTime()));
            user.setUpdTime(sdf.parse(jieshou.getData().getCreateTime()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if(jieshou.getData().isAdmin()){
            //如果是管理员,就直接用原有的admin登陆
            User admin = mapper.selAdmin();
            if(admin!=null){
                //根据用户信息生成token
                Map<String, String> map = new HashMap<>();
                map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(admin.getTenantId()));
                map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(admin.getDepartId()));
                JWTInfo jwtInfo = new JWTInfo(admin.getUsername(), admin.getId(), admin.getName());
                Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
                try {
                    return jwtTokenUtil.generateToken(jwtInfo, map);
                } catch (Exception e) {
                    throw new RuntimeException("token error!");
                }
            }
        }else{
            user.setIsSuperAdmin("0");
        }

        //查询数据库有没有接入平台的用户
        User u = mapper.getUserByJieruuser(user.getSid());
        //若是不存在接入平台的用户,就先添加用户,并赋一定的权限
        if(u==null){
            //判断用户名是否存在同样的
            User user1 = mapper.selUserByUserName(user.getUsername());
            //若存在同样的,就换下用户名再添加
            if(user1!=null){
                user.setUsername(user.getUsername()+user.getSid());
            }
            //不一样就直接添加
            int n,q;
            try {
                n = mapper.addUser(user);
            }catch (Exception e) {
                throw new RuntimeException("用户添加失败");
            }
            //添加过用户,给用户分组,就会具有一定的权限
            if(n>0){
                String id = UUIDUtils.generateUuid();
                String groupID = "80b2a64addeb4f6788f52b8a52d8f0c3";
                try{
                    q = mapper.addUserIntoGroup(id, groupID, user.getId(), user.getTenantId());
                }catch (Exception e) {
                    throw new RuntimeException("分组添加失败");
                }
                //添加分组成功,生成token塞进前端
                if(q>0){
                    Map<String, String> map = new HashMap<>();
                    map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(user.getTenantId()));
                    map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(user.getDepartId()));
                    JWTInfo jwtInfo = new JWTInfo(user.getUsername(), user.getId(), user.getName());
                    Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
                    try {
                        return jwtTokenUtil.generateToken(jwtInfo, map);
                    } catch (Exception e) {
                        throw new RuntimeException("token error!");
                    }
                }else {
                    System.out.println("=====接入用户插入组失败=======");
                }
            }else{
                System.out.println("==========添加接入用户失败=============");
            }
            //存在接入平台用户就直接生成token塞进前端
        }else{
            Map<String, String> map = new HashMap<>();
            map.put(CommonConstants.JWT_KEY_TENANT_ID, String.valueOf(u.getTenantId()));
            map.put(CommonConstants.JWT_KEY_DEPART_ID, String.valueOf(u.getDepartId()));
            JWTInfo jwtInfo = new JWTInfo(u.getUsername(), u.getId(), u.getName());
            Date expireTime = DateTime.now().plusSeconds(jwtTokenUtil.getExpire()).toDate();
            try {
                return jwtTokenUtil.generateToken(jwtInfo, map);
            } catch (Exception e) {
                throw new RuntimeException("token error!");
            }
        }
        return  null;
    }

注:1.数据库user表添加了一个字段sid,用户接收和判断接入用户的信息
   2.this.$store.dispatch   .vue里的使用方式       store.dispatch .js里的使用方式
   3.如果前端router不是设置成 mode: 'history'   请设置一下,否则拦截不到地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值