繁体   English   中英

使用角色和特定用户 id 来限制可以在 react/node/express/mysql 中查看哪些部分?

[英]Using roles and specific user id to limit what sections can be viewed in react / node / express / mysql?

我正在使用 MySQL、express、react、node 创建一个 Web 应用程序,这是我第一次使用 JavaScript。 我之前使用过会话,当我使用 PHP 完成一个项目时,我无法理解如何添加基于角色的访问或特定用户的访问。

我现在在前端的代码是:

export const login = user => {
    return axios
        .post('users/login', {
            userName: user.userName,
            password: user.password,
        })
        .then(res => {
            localStorage.setItem('usertoken', res.data);
            return res.data
        })
        .catch(err => {
            console.log(err)
        })
}; 

并在后端。

// login
users.post('/login', (req, res) => {
    User.findOne({
            where: {
                userName: req.body.userName
            }
        })
        .then(user => {
            if (bcrypt.compareSync(req.body.password, user.password)) {
                let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
                    expiresIn: 1440
                })
                res.json({
                    token: token
                })
            } else {
                res.send('User doesnt exist')
            }
        })
        .catch(err => {
            res.send('error: ' + err)
        })
});

当 jwt 令牌被发回时,我将如何使用 Express 从 MySQL 数据库请求/返回用户类型/user_id? 用户类型和 user_id 会存储在 JWT 'usertoken' 中并存储在本地存储中吗?

当 jwt 令牌被发回时,我将如何使用 Express 从 MySQL 数据库请求/返回用户类型/user_id?

        if (bcrypt.compareSync(req.body.password, user.password)) {
            // place your query here - use `username` as a key to get user row
            // store results in user object, then:
            let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
                expiresIn: 1440
            })
            res.json({
                token: token
            })

用户类型和 user_id 会存储在 JWT 'usertoken' 中并存储在本地存储中吗?

只要不是敏感数据 - 您就安全了。 请注意,由于加密,即使传递敏感数据,您也是安全的,但是 - 这不是一个好习惯(仅将您必须返回给存储在 JWT 中的用户的内容发送)

我正在使用 MySQL、express、react、node 创建一个 Web 应用程序,这是我第一次使用 JavaScript

伟大的! 欢迎来到现代堆栈开发:)

编辑:

我承认 - 我最初的回答可能令人困惑。 所以:

  • 作为一个经验法则 - 永远(永远永远不会)在你的前端项目中编写 sql 查询(安全方面)
  • 您的后端应该管理与 db 的连接(在大多数情况下,您应该为每个 db 使用一个连接)
  • 使用查询数据库的 Api 条目扩展您的后端。 允许这些条目接受查询参数和/或请求标头
  • 使用特定的查询参数调用您的 api 来查询您的数据库

在您的示例中,我只是使用您的login条目来放置您的查询。 因为您使用的是mysql ,请考虑使用第三方库来帮助您(例如mysql2

最终,它应该看起来像这样:

    if (bcrypt.compareSync(req.body.password, user.password)) {
        connection.query('SELECT * FROM `users` WHERE `name` = ?', ['user name to query' ], function(err, results) {
        if (err) return res.send('error: ' + err)

        let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
            expiresIn: 1440
        })
        res.json({
            token: token
        })

});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM