我尝试使用连接角色(https://github.com/ForbesLindesay/connect-roles),但我在努力定义用户角色并检查它们。
如何保存用户角色以便连接角色可以访问它?
为什么console.log会返回一个函数而不是true或false?
control-label
...
passport = require('passport')
require('./backend/config/passport')(passport) #pass passport for configuration
ConnectRoles = require('connect-roles')
appUser = new ConnectRoles(
failureHandler: (req, res, action) ->
# optional function to customise code that runs when
# appUser fails authorisation
accept = req.headers.accept or ''
res.status 403
if ~accept.indexOf('html')
res.render 'access-denied', action: action
else
res.send 'Access Denied - You don\'t have permission to: ' + action
return
userProperty: 'appUser'
)
...
app.use(passport.initialize())
app.use(passport.session()) # persistent login sessions
app.use(appUser.middleware())
...
appUser.use 'superAdmin', (req) ->
if req.appUser.role == 'superAdmin'
return true
return
...
require('./backend/routes.js')(app, passport, appUser, db, environment)
passport.use 'local-login', new LocalStrategy({
usernameField: 'email'
passwordField: 'password'
passReqToCallback: true
}, (req, email, password, done) ->
UserModel.findOne { 'email': email, 'active': true }, (err, user) ->
if err
return done(err)
if !user
console.log 'Emailadresse unbekannt'
return done(null, false, {message: 'Emailadresse unbekannt'})
if !user.validPassword(password)
console.log 'Passwort nicht korrekt'
return done(null, false, {message: 'Passwort nicht korrekt'})
console.log "user with id: #{user._id} and permissionLevel: #{user.permissionLevel} has logged in"
req.appUser = {} if !req.appUser?
switch user.permissionLevel
when 'superAmdin'
req.appUser.role = 'superAmdin'
when 'national'
req.appUser.role = 'national'
when 'nationalField'
req.appUser.role = 'nationalField'
when 'institute'
req.appUser.role = 'institute'
when 'employee'
req.appUser.role = 'employee'
when 'patient'
req.appUser.role = 'patient'
done null, user
return
#==================================================== INSTITUTE ====================================================
app.post('/createInstitute', cleanBody, (req, res) ->
console.log "permission"
console.log appUser.is('superAdmin')
if appUser.is('superAdmin')
instituteService.createInstitute(db, req.body.institute, (err, instituteId) ->
if (err)
return res.json({ err: err })
return res.json(instituteId: instituteId)
)
else return res.json({ err: "keine ausreichende Berechtigung" })
)
答案 0 :(得分:2)
我发现仅在connect.roles中定义用户标识符不起作用。 Passport使用用req.user
检索的用户对象。 ID保存在会话中,护照在每个路由的id的帮助下检索完整的用户对象。为方便起见,我将应用程序中的所有用户重命名为其他名称,并立即使用user
代替appUser
进行授权。
我没有尝试读出保存在用户数据库中的权限(permissionLevel
),而是直接检查用户模型中的permissionLevel。
在路线中,您必须使用req.user.is
代替user.is
:
appUser.use 'superAdmin', (req) ->
if req.user.permissionLevel == 'superAdmin'
return true
return
答案 1 :(得分:0)
我对这个中间件并不十分熟悉,但我想我也会使用express-stormpath库来展示如何使用它,因为它可能是最近的库类似的功能。
以下是您如何初始化图书馆,并要求管理员访问路线。
var express = require('express');
var stormpath = require('express-stormpath');
var app = express();
app.use(stormpath.init(app, {
apiKeyId: 'xxx',
apiKeySecret: 'yyy',
application: 'https://api.stormpath.com/v1/applications/xxx'
}));
app.get('/secret', stormpath.groupsRequired(['admins']), function(req, res) {
res.json({ status: 'you are an admin!' });
});
app.listen(3000);
进一步说明,您也可以使用Stormpath创建群组。您可以通过实际操作或通过UI进行操作。这是代码示例:
var adminsGroup;
app.get('stormpathApplication').createGroup({ name: 'admins' }, function(err, group) {
adminsGroup = group;
});
然后,稍后在您的路线代码中,您可以通过以下内容添加用户:
app.get('/createAdmin', stormpath.loginRequired, function(req, res) {
req.user.addGroup(adminsGroup); // this adds the current user to the admins group
});
答案 2 :(得分:0)
我在设置用户角色方面遇到了同样的问题,但我想出来了。
基本上,由于connect-roles是一个中间件,因此每个策略都可以访问req
对象,该对象可能具有由您的身份验证库设置的user
属性以及来自您的数据库(或任何其他位置)的数据存储用户数据的位置)。
现在,由于此对象从数据库中获取属性和值,因此您可以向用户添加角色属性,并将其附加到req
对象。这样,现在您可以在策略中使用属性req.user.role
。