为了更加方便地实现访问控制,我们可以使用 simple-express-acl 这个 npm 包。这个包可以帮助我们根据用户角色控制 API 的访问权限。下面将讲解该包的使用方法。
安装
npm install simple-express-acl
使用
初始化
首先,我们需要在 Express 应用中注册 simple-express-acl 并进行初始化。假设我们的权限配置文件为 auth.json
,我们可以像下面这样将其加载到 app.locals
中。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------------ ----- ---- - ----------------------- ----- --- - ---------- -- -------- ---------- - -------------- - --------------- -- -------- -- --- -- ---- ---------------- -- -- ------------------- ------- -- ---- ---------
路由配置
我们可以使用 acl.authorize
中间件来保护需要授权才能访问的路由。这个中间件将从应用的 app.locals
中读取权限配置,并根据当前用户的角色判断是否允许访问。
-- -------------------- ---- ------- ------------------ ----- ---- -- - -------------- -- - ------ --------- --- -- ------------ ------------------ ----------------------- ----- ---- -- - -------------- -- - ------ --------- --- -- ------- ----- -- ----------------- ----------------------- ----- ---- -- - -------------- -- -- ----- --------- ---
在上面的代码中,我们使用 acl.authorize('admin')
来保护路由,只有拥有 admin
角色的用户才能访问 /secret
和 /admin
路由。
用户设置
在我们的 Express 应用中,我们需要在用户登陆时设置其角色。在这里我们可以使用 app.locals.acl.addUserRoles(user, roles)
方法来为某个用户添加角色。
-- -------------------- ---- ------- ------------------ ----- ---- -- - -- -------------- ----- ---- - -------------- ------ -------------- --- -- ------ - -- -------------- -------- ------------------------------------ ---------- ---------------- -- ---------------- - ---- - ---------------------------- -- --------- - ---
角色设置
在上述代码中我们使用了 addUserRoles
方法将用户角色设置为 member
。此外,我们还可以使用 app.locals.acl.addRoleParents(role, parents)
将角色组织成一个层次结构,使其继承其他角色的权限。
// 在这个例子中,我们组织了一个角色层次结构 // 'member' 继承了 'guest' // 'admin' 继承了 'member' // 因此,只有 'admin' 可以访问 '/secret' 和 '/admin' 路由 app.locals.acl.addRoleParents('member', 'guest'); app.locals.acl.addRoleParents('admin', 'member');
现在,我们可以将 addUserRoles
方法设置为将用户的角色设置为 admin
,这样其就可以访问 /secret
和 /admin
路由了。
权限控制
除了使用 addUserRoles
和 addRoleParents
来管理角色外,我们还可以使用 allow
和 deny
方法来针对性地为某个角色或某个路由添加或禁止访问权限。
// 在这个例子中,我们禁止 'member' 角色访问 '/admin' 路由 app.locals.acl.deny('member', '/admin'); // 在这个例子中,我们允许 'admin' 角色访问 '/admin' 路由 app.locals.acl.allow('admin', '/admin');
结论
simple-express-acl 帮助我们更加方便地实现访问控制,但是在使用时,需要确保权限配置文件的正确性,以及在不同用户角色判断的情况下,授权信息不会被泄露。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005595081e8991b448d6b61