이 글은 주로 nodejs acl의 사용자 권한 관리에 대한 자세한 설명을 소개하고 있으니 참고하시기 바랍니다.
지침
Q: 이 도구는 무엇을 위해 사용됩니까?
A: 사용자는 관리자, VIP, 일반 사용자 등 서로 다른 권한을 가지며 각 사용자는 API에 액세스하며 페이지가 다릅니다
nodejs가 있습니다. 두 가지 잘 알려진 권한 관리 모듈 중 하나는 acl이고 다른 하나는 rbac입니다. 종합적인 비교를 거쳐 마침내 프로젝트 작업 시 acl을 선택했습니다.
addUserRoles //사용자에게 역할 추가
removeUserRoles //사용자 역할 제거
역할 역할
이 있습니다. removeRoleusers users
isAllowed
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(); }; }
로그인 권한 할당
결과는 데이터베이스에서 쿼리된 사용자 정보이거나 백그라운드 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는 동기식이기 때문입니다. , 그렇다면 현재 페이지 또는 현재 페이지의 버튼에 사용자가 표시할 수 있는 권한이 있는지 어떻게 제어합니까? 여기서 일반적인 방법은 다음과 같습니다.
사용자가 로그인하면 라우팅 테이블과 구성 요소 테이블이 있습니다. 이 표에 따라 렌더링할 때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; };
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 소스 코드로 시작const hasBtn1Role = hasRole(user.role, '/xxx','get'); res.render('a.pug',{hasBtn1Role})
위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.
관련 기사:
Angular_AngularJS에서 더 나은 스크롤 플러그인을 사용하는 방법
Angularjs가 컨트롤러 간 통신을 구현하는 방법에 대한 예 요약
txt의 업로드 미리 보기 기능을 구현하는 JavaScript 코드 파일
위 내용은 nodejs acl의 사용자 권한 관리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!