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

时间:2015-07-20 14:56:47

标签: node.js express

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

问题1

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

问题2

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

我设置护照&我的server.coffee中的连接角色

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

user.is

上的日志显示不为true或false
#==================================================== 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" })
  )

3 个答案:

答案 0 :(得分:2)

代码更改用户对象

我发现仅在connect.roles中定义用户标识符不起作用。 Passport使用用req.user检索的用户对象。 ID保存在会话中,护照在每个路由的id的帮助下检索完整的用户对象。为方便起见,我将应用程序中的所有用户重命名为其他名称,并立即使用user代替appUser进行授权。

2检查角色

我没有尝试读出保存在用户数据库中的权限(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