根据用户身份验证使路由端点响应不同的内容

时间:2015-08-10 21:32:38

标签: node.js express

假设我正在构建一个带有REST后端的简单Web应用程序,用户可以在其中拥有自己的用户信息页面。

我想要实现的是,如果未经身份验证的用户向

发出请求

www.mywebapp.com/api/user/john

他们将获得有限的信息(例如年龄和电子邮件)。但是,如果用户登录并发出相同的请求,服务器也会回复更多信息(如个人偏好等)。

我想也许验证用户令牌的中间件可以传递对请求的权限(req.role = guest或req.role = user)。然后在user /:name端点,它将检查角色并使用不同的内容进行响应。

另一种选择是为经过身份验证的用户创建新的路由端点,然后检查在客户端调用哪一个。

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

这就是我最终做的事情:

let router = express.Router();

router.get('/profile', authenticate, hasRole("Admin", true), controller.showProfileAdmin);
router.get('/profile', hasRole("User", true), controller.showProfileUser);
// will not call next('route') if Guest requirements is not met
router.get('/profile', hasRole("Guest"), controller.showProfile); 

// hasRole() returns a middleware function that checks if user meets role requirement.
// If nextRoute is true, the function calls next('route'). If nextRoute is false
// or undefined, the function responds with a 403
function hasRole(roleRequired, nextRoute) {

    return (req, res, next) => {
        // Just checking so that the user has authority for this role.
        if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
            return next();
        //else client is not authorized
        } else {
            // If nextRoute is true, continue to the next route.
            if(nextRoute){
                return next('route');
            //Else respond with a forbidden status.
            } else {
                res.sendStatus(403);
            }
        }
    }
}