ForbesLindesay/connect-roles

Cannot read property from mongoDB

Closed this issue · 3 comments

I've got User schema with role parameter. I'm using your example with usage of connect-roles (I changed var user to var role and configured permissions:

role.use('profile.view', function (req) {
    if(req.user.role === 'user') {
       return true;
    }
});
role.use(function (req) {
    if (req.user.role === 'admin') {
        return true;
    }
});

Those are my configured routes:

app.get('/profile', role.can('profile.view'), function(req, res) {
  profile.profile(req, res);
});
app.get('/admin', role.is('admin.'), function(req, res){
    admin.admin(req, res);
});

In view I'm using

if userIs('admin')
    li
    a(href='/admin')
        |  Admin
li
    a(href='/profile')
        |  Profile
li
    a(href='/logout')
        |  Log Out

However I've issue when I've:

role.use(function (req) {
    if (req.user.role === 'admin') {
        return true;
    }
});

That: Cannot read property 'role' of undefined

When I'm deleting this rule it's working correct however I don't have admin menu.

I'm not sure why you would be getting that behaviour. Could you provide the stack trace? Also try doing console.log(req) or console.log(req.user) inside the role handlers and see what values you get.

So I've added as you said:

role.use(function (req) {
    console.log("User role is: " + req.user);
    if (req.user.role === 'admin') {
        return true;
    }
});

And that's my trace:

TypeError: c:\Users\mrmr\WebstormProjects\str\views\layout.jade:32
    30|                         span.icon-bar
    31|                     a.navbar-brand(href='/')= brandName
  > 32|                 .navbar-collapse.collapse
    33|                     ul.nav.navbar-nav
    34|                     ul.nav.navbar-nav.navbar-right
    35|                         if userIs('admin')

Cannot read property 'role' of undefined
    at app.get.passport.authenticate.passReqToCallback (c:\Users\mrmr\WebstormProjects\str\app.js:86:17)
    at ConnectRoles.test (c:\Users\mrmr\WebstormProjects\str\node_modules\connect-roles\index.js:104:18)
    at c:\Users\mrmr\WebstormProjects\str\node_modules\connect-roles\index.js:136:18
    at eval (eval at <anonymous> (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:179:8), <anonymous>:157:6)
    at eval (eval at <anonymous> (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:179:8), <anonymous>:444:22)
    at res (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:180:38)
    at Object.exports.render (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:305:10)
    at Object.exports.renderFile (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:341:18)
    at View.exports.renderFile [as engine] (c:\Users\mrmr\WebstormProjects\str\node_modules\jade\lib\jade.js:326:21)
    at View.render (c:\Users\mrmr\WebstormProjects\str\node_modules\express\lib\view.js:76:8)
User role is: undefined

Sorry for the slow response. It looks like you are probably only getting this with un-authenticated users. Hence req.user being undefined. What you may want to do is add another rule (before all the other rules) that looks like:

role.use(function (req) {
    if (!req.user) {
        return false;
    }
});

i.e. if there is no user, don't let them do anything.