首页 > 解决方案 > 仅选择基于用户“权限”的域的记录

问题描述

大家好,我想获得一些关于如何解决我的问题的提示。

我得到了存储用户详细信息的表格,例如:

ID、FIRST_NAME、LAST_NAME EMAIL、密码、角色、域

我还得到了名为 Aliases 的表

ID、DOMAIN_ID、DOMAIN、DESTINATION

在用户表中,角色表示管理员、版主、用户等,域例如是 aaa.pl、bbb.pl。别名表也有像 aaa.pl、bbb.pl 这样的域

我想仅从表中选择域与分配给用户的域相同的别名。所以用户 X 只能看到别名 Where 是同一个域。

后端

这是我的控制器

public async aliasesListByDomain(req: Request, res: Response): Promise<void> {
        const { domain } = req.params;
        const aliasesListByDomain = await pool.query('SELECT * FROM virtual_aliases WHERE domain= ?', [domain]);
        if (aliasesListByDomain.length > 0) {
            res.json(aliasesListByDomain);
        } else {
            res.status(404).json({ message: "Alias doesn't exists" });
        }
    }

我是如何验证用户的

router.post('/authenticate', (req, res) => {
  User.findOne({
    where: {
      email: req.body.email,
      password: req.body.password
    }
  })
    .then(user => {
      if (user) {
        let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
          expiresIn: 1440
        })
        res.json({ token: token })
      } else {
        res.send('User does not exist')
      }
    })
    .catch(err => {
      res.send('error: ' + err)
    })
})

现在我的前端有问题。

这是我获得所有别名的服务(无论域如何)

getAliases(): Observable<Alias> {
    return this.http.get(`${this.API_URI}/aliases`);
  }

并且有我的组件,我可以在其中获得所有别名

 getAliases() {
    this.aliasesService.getAliases().subscribe(
      res => {
        this.alias = res;
        console.log(this.alias);
      },
      err => console.error(err)
    );
  }

现在如何根据用户权限仅选择别名。

我试过这样的事情:

服务

getAliasesByDomain(domain: string): Observable<Alias> {
    return this.http.get(`${this.API_URI}/aliases/${domain}`);
  }

这是我的身份验证服务

登录

public login(user: TokenPayload): Observable<any> {
    const base = this.http.post(`http://localhost:3000/users/authenticate`, user);
    const request = base.pipe(
      map((data: TokenResponse) => {
        console.log(data);
        if (data.token) {
          this.saveToken(data.token);
        }
        return data;
      })
    )

    return request;
  }

和用户详细信息

 public getUserDetails(): UserDetails {
    const token = this.getToken();
    let payload;
    if (token) {
      payload = token.split('.')[1];
      payload = window.atob(payload);
      return JSON.parse(payload);
    } else {
      return null;
    }
  }

我应该在我的组件中获取usertokenJSON.parse()从登录用户那里获取域详细信息吗?然后发给api?

什么是最好的解决方案?

-编辑我做了这样的事情:

 private getToken(): string {
    if (!this.token) {
      this.token = localStorage.getItem('usertoken');
    }
    return this.token;
  }
  getAliasesByDomain(){
    const token = this.getToken();
    let user;
    if (token) {
      user = token.split('.')[1];
      user = window.atob(user);
      user = JSON.parse(user);
      console.log('user z from getAliasesByDomain: '+user.domain);
      this.aliasesService.getAliasesByDomain(user.domain).subscribe(
        res => {
          console.log(res);
          this.alias = res;
        },
        err => console.error(err)
      );
    }
  }

标签: javascriptangularexpresssequelize.js

解决方案


推荐阅读