2013-03-30 3 views
30

passport.js를 사용하여 특정 끝점에 도달했을 때 올바른 암호 만 가질 수는 있지만 특정 그룹의 구성원이거나 특정 액세스 권한이 있는지 확인하고 싶습니다.Passport.js의 액세스/그룹 확인

간편하게하기 위해 USER 및 ADMIN 수준에 액세스 할 수 있습니다.

나는 암호 인증하기 위해 여권을 사용할 수 있습니다

app.get('/api/users', 
    passport.authenticate('local'), 
    function(req, res) { 
    res.json({ ... }); 
    }); 

그러나 당신이 ADMIN의 ACESS이 필요 말할 수 : 내가 만들 수있는 경로로 그런

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

있는지 사용자가 인증 통과 hit/api/users '를 누르십시오. 나 자신의 전략을 써야합니까? IE에는 로컬 사용자 및 로컬 관리자 전략이 있어야하며 각각 적절한 액세스 수준을 확인해야합니까?

나는 이것을 꽤 쉽게 할 수 있다고 생각하지만 다른 인증 방법 (어쩌면 가끔 oauth 사용)이 필요하면 문제가 발생합니다. 사용자마다 * -user, * -admin 전략을 작성해야합니다. . 과잉이라고 생각합니다.

다른 옵션은 사용자가 인증 된 후에 각 경로에서 액세스/그룹을 확인하는 것입니다. 그러나 가능한 경우 미들웨어에서이 작업을 수행하는 것이 좋습니다.

감사

답변

50

당신은 그룹을 확인하는 간단한 미들웨어를 만들 수 있습니다

var needsGroup = function(group) { 
    return function(req, res, next) { 
    if (req.user && req.user.group === group) 
     next(); 
    else 
     res.send(401, 'Unauthorized'); 
    }; 
}; 

app.get('/api/users', 
    passport.authenticate('local'), 
    needsGroup('admin'), 
    function(req, res) { 
    ... 
    }); 

req.user에 저장된 객체 속성 group이 있다고 가정합니다. 이 개체는 전략 구현에서 전달 된 개체이며 deserializeUser입니다.

대안은 connect-roles 일 수 있지만 Passport와 얼마나 잘 통합되어 있는지는 잘 모릅니다.

편집 : 당신은 또한 여권 및 그룹 검사 미들웨어를 결합 할 수 있습니다 :

var needsGroup = function(group) { 
    return [ 
    passport.authenticate('local'), 
    function(req, res, next) { 
     if (req.user && req.user.group === group) 
     next(); 
     else 
     res.send(401, 'Unauthorized'); 
    } 
    ]; 
}; 

app.get('/api/users', needsGroup('admin'), function(req, res) { 
}); 
+0

아, 그렇군요. Express와 함께 순차적으로 호출되는 '미들웨어'배열을 사용할 수있는 것처럼 보입니다. 그것을 깨닫지도 못했을 것입니다. 매뉴얼을 다시 읽을 시간;) 감사합니다. 이것은 완벽합니다! – lostintranslation

+2

네, 'app.VERB (경로, [콜백 ...], 콜백)'입니다. 죄송합니다. 답변을 놓치지 않고 친절하게 답변 해 주셔서 감사합니다. – lostintranslation

+0

그것은 유용한 "트릭"나는 내 자신을 잊고 계속 : – robertklep