javascript - 如何在nodejs passportjs中实现用户角色
问题描述
如何使用expressjs和passport在nodejs中实现基于角色的授权/访问控制以及如何完美地设计角色中间件?
我有两种类型的登录管理员和用户
哪个最好,以管理员和用户的名义创建两个模型和路由器?
1.检查用户isAdmin
与否
2.
// To authtenticate the User by JWT Startegy
module.exports = (userType, passport) => {
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
if (userType == 'admin') {
Admin.getAdminById(jwt_payload.data._id, (err, user) => {
if (err) return done(err, false);
if (user) return done(null, user);
return done(null, false);
});
}
if (userType == 'users') {
User.getUserById(jwt_payload.data._id, (err, user) => {
if (err) return done(err, false);
if (user) return done(null, user);
return done(null, false);
});
}
}));
}
解决方案
为什么要有 2 个地方来获取用户数据?
拥有用户并为他们分配角色。
最简单的访问控制系统是:访客、登录、管理员。
所以在表中users
添加一个role
包含值的列:用户,管理员。
现在你编写中间件:
const isLogged = function (req, res, next) {
if (req.user)
return next ();
res.send ('unauth')
}
const isAdmin = function (req, res, next) {
if (req.user.role == 'admin')
return next ();
res.send ('only admin')
}
和用法:
app.get('/', (req, res)=>{})
app.get('/profile',isLogged, (req, res)=>{})
app.get('/admin',isLogged, isAdmin, (req, res)=>{})
对于更高级的需求,请尝试查找一些 ACL 模块
推荐阅读
- vba - 努力从 VLOOKUP 创建一个带有 MIN 的函数
- python - “分配前引用的局部变量'e'”这个错误是什么意思?如何修复此错误?
- express - 请求的资源上没有“Access-Control-Allow-Origin”标头(express + react/redux)
- swift - 避免两个不同视图之间的触摸手势冲突
- javascript - 根据属性组合数组中的项目并维护引用
- excel - Excel VBA解析列,提取所有子字符串
- javascript - 用于将图像添加到 WordPress 表单的按钮
- javascript - 在轮播中隐藏单个图像的下一个和上一个按钮
- xamarin - Xamarin Forms InAppBillingPlugin PurchaseAsync exeption
- javascript - HighChart:在网格线之后显示一些数据