>  기사  >  웹 프론트엔드  >  nodejs acl의 사용자 권한 관리에 대한 자세한 설명

nodejs acl의 사용자 권한 관리에 대한 자세한 설명

亚连
亚连원래의
2018-05-30 11:13:362673검색

이 글은 주로 nodejs acl의 사용자 권한 관리에 대한 자세한 설명을 소개하고 있으니 참고하시기 바랍니다.

지침

Q: 이 도구는 무엇을 위해 사용됩니까?

A: 사용자는 관리자, VIP, 일반 사용자 등 서로 다른 권한을 가지며 각 사용자는 API에 액세스하며 페이지가 다릅니다

nodejs가 있습니다. 두 가지 잘 알려진 권한 관리 모듈 중 하나는 acl이고 다른 하나는 rbac입니다. 종합적인 비교를 거쳐 마침내 프로젝트 작업 시 acl을 선택했습니다.

addUserRoles //사용자에게 역할 추가
  1. removeUserRoles //사용자 역할 제거
  2. userRoles //사용자의 모든 역할 가져오기
  3. roleUsers //이 역할을 가진 모든 사용자 가져오기
  4. hasRole // 사용자가 특정 역할인지 여부
  5. addRoleParents //역할에 상위 역할 추가
  6. removeRoleParents //특정 상위 역할 또는 모든 상위 역할 제거
  7. removeRole //역할 제거
  8. removeResource //특정 리소스 제거
  9. allow //특정 리소스에 대한 특정 권한을 특정 역할에 추가
  10. removeAllow //특정 리소스에 대한 특정 권한을 특정 역할에 제거
  11. allowedPermissions //특정 리소스 쿼리 개인의 모든 리소스 및 권한
  12. isAllowed //누군가가 특정 리소스에 대해 특정 권한을 가지고 있는지 쿼리
  13. areAnyRolesAllowed //특정 역할이 특정 리소스에 대해 특정 권한을 가지고 있는지 쿼리
  14. whatResources //특정 사람에게 쿼리 What 리소스에는 역할이
  15. middleware //middleware for express
  16. backend //지정 방법(mongo/redis...)
  17. ACL 명사와 주요 방법

역할 역할

이 있습니다.

removeRole
  1. addRoleParents
  2. allow
  3. removeAllow
  4. resources 리소스

whatResources
  1. removeResource
  2. permissionsPermissions

users users

allowedPermissions
  1. isAllowed
  2. addUserRoles
  3. removeUserRoles
  4. userRoles
  5. roleUsers
  6. hasRole
  7. areAnyRolesAllowed
  8. 사용 방법

구성 파일 만들기
  1. 사용자가 로그인한 후 해당 권한이 할당됩니다
  2. 제어가 필요한 교정에는 acl을 사용하세요
  3. 구성 파일

const Acl = require('acl');
const aclConfig = require('../conf/acl_conf');

module.exports = function (app, express) {
  const acl = new Acl(new Acl.memoryBackend()); // eslint-disable-line

  acl.allow(aclConfig);

  return acl;
};

// acl_conf

module.exports = [
  {
    roles: 'normal', // 一般用户
    allows: [
      { resources: ['/admin/reserve'], permissions: ['get'] },
    ]
  },
  {
    roles: 'member', // 会员
    allows: [
      { resources: ['/admin/reserve', '/admin/sign'], permissions: ['get'] },
      { resources: ['/admin/reserve/add-visitor', '/admin/reserve/add-visitor-excel', '/admin/reserve/audit', '/admin/sign/ban'], permissions: ['post'] },
    ]
  },
  {
    roles: 'admin',  // 管理
    allows: [
      { resources: ['/admin/reserve', '/admin/sign', '/admin/set'], permissions: ['get'] },
      { resources: ['/admin/set/add-user', '/admin/set/modify-user'], permissions: ['post'] },
    ]
  },
  {
    roles: 'root', // 最高权限
    allows: [
      { resources: ['/admin/reserve', '/admin/sign', '/admin/set'], permissions: ['get'] },
    ]
  }
];

proofcheck

여기 결과 Express와 결합된 교정... acl에서 제공하는 미들웨어 자체가 너무 쓸모없다는 것을 발견하여 여기에 다시 작성했습니다.

function auth() {
    return async function (req, res, next) {
      let resource = req.baseUrl;
      if (req.route) { // 正常在control中使用有route属性 但是使用app.use则不会有
        resource = resource + req.route.path;
      }
      console.log('resource', resource);

      // 容错 如果访问的是 /admin/sign/ 后面为 /符号认定也为过
      if (resource[resource.length - 1] === '/') {
        resource = resource.slice(0, -1);
      }

      let role = await acl.hasRole(req.session.userName, 'root');

      if (role) {
        return next();
      }

      let result = await acl.isAllowed(req.session.userName, resource, req.method.toLowerCase());
      // if (!result) {
      //   let err = {
      //     errorCode: 401,
      //     message: '用户未授权访问',
      //   };
      //   return res.status(401).send(err.message);
      // }
      next();
    };
  }

한 가지 주목할 점은 express.Router가 라우터 모듈을 내보낸 다음 app.use에서 사용하는 것을 지원한다는 것입니다. 하지만 app.use('/admin/user',auth(), userRoute를 사용하는 경우) ); 그러면 인증 함수에서 req.route 속성을 얻을 수 없습니다. acl은 액세스 권한에 대해 강력한 일치를 수행하므로 특정 내결함성이 필요합니다

로그인 권한 할당

결과는 데이터베이스에서 쿼리된 사용자 정보이거나 백그라운드 API에서 반환된 사용자 정보입니다. 여기서 스위치는 구성파일의 형태는 이 프로젝트에 권한이 3개밖에 없어서 여기에 간단하게 작성했습니다.

let roleName = 'normal';

  switch (result.result.privilege) {
    case 0:
      roleName = 'admin';
      break;
    case 1:
      roleName = 'normal';
      break;
    case 2:
      roleName = 'member';
      break;
  }

  if (result.result.name === 'Nathan') {
    roleName = 'root';
  }

  req.session['role'] = roleName;
  // req.session['role'] = 'root';  // test
  acl.addUserRoles(result.result.name, roleName);
  // acl.addUserRoles(result.result.name, 'root'); // test

Pug 페이지에서 논리 제어 렌더링

express+pug app.locals.auth= async function(){} 이 작성 방법은 pug 렌더링 시 최종 결과를 얻지 못합니다. 왜냐하면 pug는 동기식이기 때문입니다. , 그렇다면 현재 페이지 또는 현재 페이지의 버튼에 사용자가 표시할 수 있는 권한이 있는지 어떻게 제어합니까? 여기서 일반적인 방법은 다음과 같습니다.

사용자가 로그인하면 라우팅 테이블과 구성 요소 테이블이 있습니다. 이 표에 따라 렌더링할 때
  1. 권한 제어가 필요한 곳에서는 사용자에게 접근 권한이 있는지 확인하는 기능을 사용하세요
  2. 엔딩 플랜을 사용하고 있습니다 2. 더 편리하기 때문에, 그런데 문제는 express+ 퍼그가 비동기식 쓰기를 지원하지 않고, ACL이 우리에게 제공하는 것은 모두 비동기식이라는 점이다. 시간상의 이유로 내부 판단은 자세히 다루지 않고 결합도가 높지만 더 편리한 판단 방식을 채택했다.

app.locals.hasRole = function (userRole, path, method = 'get') {

  if (userRole === 'root') {
    return true;
  }

  const current = aclConf.find((n) => {
    return n['roles'] === userRole;
  });

  let isFind = false;
  for (let i of current.allows) {
    const currentPath = i.resources; // 目前数组第一个为单纯的get路由
    isFind = currentPath.includes(path);

    if (isFind) {
      // 如果找到包含该路径 并且method也对应得上 那么则通过
      if (i.permissions.includes(method)) {
        break;
      }

      // 如果找到该路径 但是method对应不上 则继续找.
      continue;
    }
  }

  return isFind;
};

위의 코드 페이지는 acl_conf를 탐색하여 사용자에게 현재 페이지나 버튼에 대한 권한이 있는지 확인합니다. acl_conf는 로드 시 이미 메모리에 기록되어 있으므로 성능 소모가 특별히 크지 않습니다. 크기가 큰. 다음 예와 같습니다.

if hasRole(user.role, '/admin/reserve/audit', 'post')
          .col.l3.right-align
            a.waves-effect.waves-light.btn.margin-right.blue.font12.js-reviewe-ok 同意
            a.waves-effect.waves-light.btn.pink.accent-3.font12.js-reviewe-no 拒绝

End

acl 구성 요소를 사용하면 사용자 권한 관리 모듈을 빠르게 만들 수 있습니다. 하지만 여전히 문제가 있는데, 바로 app.locals.hasRole 함수입니다. 사용자의 권한 테이블을 동적으로 변경하기 위해 RemoveAllow를 사용한다면 hasRole 함수가 매우 번거로울 것입니다. 따라서 이 경우 다음과 같은 여러 해결 방법이 있습니다

acl 소스 코드로 시작
  1. 렌더링할 때마다 데이터를 준비하세요
  2. const hasBtn1Role = hasRole(user.role, '/xxx','get');
    res.render('a.pug',{hasBtn1Role})

위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

Angular_AngularJS에서 더 나은 스크롤 플러그인을 사용하는 방법

Angularjs가 컨트롤러 간 통신을 구현하는 방법에 대한 예 요약

txt의 업로드 미리 보기 기능을 구현하는 JavaScript 코드 파일

위 내용은 nodejs acl의 사용자 권한 관리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.