connect-roles:在Login和User.is函数中定义用户angular色

我尝试使用connect-roles( https://github.com/ForbesLindesay/connect-roles ),但我正在努力定义用户angular色并检查它们。

问题1

如何保存用户angular色,以便连接angular色可以访问它?

问题2

为什么console.log返回一个函数而不是true或false?

我在我的server.coffee中设置护照和连接angular色

... 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) 

当用户login时,应该将用户权限级别附加到会话中

  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" }) ) 

日志在user.is上显示不正确或错误

 permission { [Function] here: [Function] } 

代码更改用户对象

我想通过connect.roles来定义用户标识符是行不通的。 Passport使用通过req.user检索的用户对象。 ID保存在会话中,护照在每个路由上通过ID获取完整的用户对象。 为了方便appUser ,我将我的应用程序中的所有用户重命名为不同的名称,并使用现在的user而不是appUser作为我的授权。

2检查angular色

而不是试图读出我的权限( permissionLevel ,它保存在我的用户数据库中),而是直接检查我的用户模型中的permissionLevel。

在路线中,您必须使用req.user.is而不是user.is

  appUser.use 'superAdmin', (req) -> if req.user.permissionLevel == 'superAdmin' return true return 

我对这个中间件不是很熟悉,但是我想我会演示如何使用express-stormpath库来做到这一点,因为它可能是具有类似function的最近的库。

这是你如何初始化库,并要求pipe理员访问路线。

 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创build组。 您可以通过实用的方式或通过他们的用户界面来完成。 这是一个代码示例:

 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 });