gpt4 book ai didi

javascript - 使用 MEAN.JS 用户授权

转载 作者:行者123 更新时间:2023-12-03 09:22:51 24 4
gpt4 key购买 nike

我已开始使用 MEAN.js 全栈解决方案来学习如何创建 Web 应用程序。

我使用生成器创建了多个 CRUD 模型,它生成了所有快速路线等...

它还创建了一个用户模型作为模板,其中包含一些 Angular 色以及一些经过身份验证和授权的中间件。

我想稍微调整一下中间件,但我不知道执行此操作的最佳方法。

对于我的一个模型(称为主题公园),我想确保用户不仅已登录,而且还根据其 Angular 色获得执行后操作的授权。

下面的代码是我当前从生成器获得的代码,您可以看到“/themeparks/:themeparkId”路由具有 themeparks.hasAuthorization 中间件函数调用。但是,这不适用于“/themeparks”路由,users.hasAuthorization 中间件功能也不起作用。

所以我想知道将用户授权添加到“/themeparks”路由的 post 方法的最佳方法是什么?也许一些资源有教程或涵盖 MEAN.js 堆栈中的用户模型?

//路线

'use strict';

module.exports = function(app) {
var users = require('../../app/controllers/users.server.controller');
var themeparks = require('../../app/controllers/themeparks.server.controller');

// Themeparks Routes
app.route('/themeparks')
.get(themeparks.list)
.post(users.requiresLogin, themeparks.create); //<----How do I add authorization based on a role here??

app.route('/themeparks/:themeparkId')
.get(themeparks.read)
.put(users.requiresLogin, themeparks.hasAuthorization, themeparks.update)
.delete(users.requiresLogin, themeparks.hasAuthorization, themeparks.delete);

// Finish by binding the Themepark middleware
app.param('themeparkId', themeparks.themeparkByID);
};

//用户中间件

/**
* Require login routing middleware
*/
exports.requiresLogin = function(req, res, next) {
if (!req.isAuthenticated()) {
return res.status(401).send({
message: 'User is not logged in'
});
}

next();
};

/**
* User authorizations routing middleware
*/
exports.hasAuthorization = function(roles) {
var _this = this;

return function(req, res, next) {
_this.requiresLogin(req, res, function() {
if (_.intersection(req.user.roles, roles).length) {
return next();
} else {
return res.status(403).send({
message: 'User is not authorized'
});
}
});
};
};

//主题公园中间件

/**
* Themepark middleware
*/
exports.themeparkByID = function(req, res, next, id) { //TODO: This is probably what is pulling the user in through the middleware.
Themepark.findById(id).populate('user', 'displayName').exec(function(err, themepark) {
if (err) return next(err);
if (! themepark) return next(new Error('Failed to load Themepark ' + id));
req.themepark = themepark ;
next();
});
};

/**
* Themepark authorization middleware
*/
exports.hasAuthorization = function(req, res, next) {
if (req.themepark.user.id !== req.user.id) {
return res.status(403).send('User is not authorized');
}
next();
};

最佳答案

您以相同的方式添加中间件:

app.route('/themeparks')
.get(themeparks.list)
.post(users.requiresLogin, themeparks.userRoleHasAuthorization, themeparks.create);

在主题公园模块中,您添加此函数,就像 hasAuthorization 函数一样,并且还包括对用户是否处于 Angular 色中的检查。您已从请求中获得了用户 ID。使用它可以从数据库中查询用户有权访问的 Angular 色。

(理想情况下,如果 Angular 色位于数据库中,我会在检索用户对象本身时检索该 Angular 色,以便前端也可以在需要时使用 Angular 色信息,而不必在其中查询授权模块。)

根据用户 ID 和 Angular 色信息确定用户是否属于允许更新此模块的 Angular 色。否则返回 401 未授权。以下是如何构建代码。 canUpdate 函数需要根据您想要如何存储 Angular 色以及有关应该有权访问 Angular 色的模块的信息来实现。

exports.userRoleHasAuthorization = function(req, res, next) {
if (req.themepark.user.id !== req.user.id || !canUpdate(req.user.id, 'themeparks') {
return res.status(403).send('User is not authorized');
}
next();
};

关于javascript - 使用 MEAN.JS 用户授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com