Node.js + Express.js 사용자 권한 보안 모델


79

두 가지 유형의 사용자가있는 애플리케이션이 있습니다. 사용자가 로그인하는 방법에 따라 애플리케이션의 다른 부분에 액세스 할 수 있기를 원합니다.

사용자가 액세스 할 수없는 것을 보지 못하도록 보안 모델을 구현하는 방법은 무엇입니까?

각 경로 구현의 보안 부분을 만드나요? 문제는 요청에 대해 중복 논리가 있다는 것입니다. 이것을 도우미 함수로 옮길 수는 있지만 호출하는 것을 기억해야합니다.

글로벌 app.all () 라우트 핸들러의 보안 부분을 만드나요? 문제는 각 경로를 검사하고 여러 규칙에 따라 다른 논리를 수행해야한다는 것입니다. 최소한 모든 코드가 한 곳에 있지만 ... 모든 코드가 한 곳에 있습니다.

답변:


137

경로별로 사용하는 것이 일반적으로 저에게 효과적입니다. 이것은 내가 일반적으로하는 일입니다.

function requireRole (role) {
    return function (req, res, next) {
        if (req.session.user && req.session.user.role === role) {
            next();
        } else {
            res.send(403);
        }
    }
}

app.get("/foo", foo.index);
app.get("/foo/:id", requireRole("user"), foo.show);
app.post("/foo", requireRole("admin"), foo.create);

// All bars are protected
app.all("/foo/bar", requireRole("admin"));

// All paths starting with "/foo/bar/" are protected
app.all("/foo/bar/*", requireRole("user"));

하지만 2 개의 역할 만 라우팅에 액세스 할 수 있다면 어떨까요?
Vladimir Djukic

1
requireRole대신 배열을 만들 수 있습니까? 그리고 indexOf.
Linus Thiel

예를 추가해 주시겠습니까? 이 마지막 경로가 / foo / bar로 시작하는 모든 경로를 보호합니까?
Vladimir Djukic

데이터베이스에서 권한이 변경되면 어떻게됩니까? 세션이 데이터베이스와 일치하는지 어떻게 확인할 수 있습니까?
nomadoda

2
@nomadoda 그것은 나에게 약간 다른 문제처럼 보이지만 어떻게 든 세션을 새로 고쳐야 할 것입니다. 사용하는 세션 백업 저장소에 따라 다르며 가장 쉬운 방법은 해당 유형의 변경 후 사용자가 다시 로그인하도록하는 것입니다.
Linus Thiel



3

이제 이에 대한 노드 모듈 권한 이 있습니다. 사용하기 쉽고 수락 된 답변과 매우 유사하지만 여전히 일부 기능이 추가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.