node权限控制模块node_acl的应用

2024-06-10 04:48

本文主要是介绍node权限控制模块node_acl的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • 一个应用必不可少的部分:登录认证(jaredhanson/passport)、权限控制(OptimalBits/node_acl)
  • 由于node_acl中文资料较少,本文给出一个完整的简单示例,便于初学者理解和学习
  • 最后有动态的效果图给出,更直观的展示node_acl的使用效果

知识点

  • 示例中的路由并未采用如:app.put('/blogs/:id', function(req, res, next){//…}的restful风格架构
  • 使用mongoose连接数据库
  • 初始化所有角色的权限
  • 建立父级角色(父级角色拥有子级角色所有权限)
  • 为用户添加角色(添加后,用户拥有该角色的所有权限)
  • es6模板字符串
  • 创建数据库schema模型
  • 为schema添加静态方法
  • 使用session保持会话
  • 自定义node_acl的认证失败后的错误信息
  • 使用错误中间件

示例

Promise = require('bluebird')
var express = require('express')
var mongoose = require('mongoose')
var session = require('express-session')
var MongoStore = require('connect-mongo')(session)
var acl = require('acl')var app = express()/** ------------------------------------------------* 数据库*/
mongoose.Promise = Promise
mongoose.connect('127.0.0.1:30001/blog')// 连接你自己的数据库
.then(() => {// 这里要注意,一定要在连接数据库之后进行权限的操作,否则不生效roles()// 权限routes()// 路由
})app.use(session({secret: 'sign',resave: true,saveUninitialized: true,store: new MongoStore({mongooseConnection: mongoose.connection}),
}))/** --------------------------------------------------* 权限*/
function roles() {acl = new acl(new acl.mongodbBackend(mongoose.connection.db, 'acl_'))// 为guestuseradmin角色添加权限acl.allow([{roles: 'guest',allows: [{resources: '/article/get', permissions: '*'},],},{roles: 'user',allows: [{resources: '/article/edit', permissions: '*'},],},{roles: 'admin',allows: [{resources: '/article/del', permissions: '*'},],}])acl.addRoleParents('user', 'guest')// user角色拥有guest角色所有的权限acl.addRoleParents('admin', 'user')// admin角色拥有user角色所有的权限
}/** --------------------------------------------------* 路由*/
function routes() {// 渲染主页面app.all('/', (req, res, next) => {var html = `<div><input class="name" type="text" placeholder="输入用户名" value="${Date.now()}" autocomplete="off"><button class="add">创建用户</button><p>guest角色可以访问/article/get,user角色可以访问/article/edit,admin角色可以访问/article/del</p><p>默认情况下,访问1、2、3都会被拒绝</p><p>创建用户后,会自动给新创建的用户添加guest和 user角色,所以允许访问1、2</p><p>点击4后,删除了用户的user角色,只能访问1了</p><p><span>1.</span><a href="/article/get" target="_blank">访问/article/get</a></p><p><span>2.</span><a href="/article/edit" target="_blank">访问/article/edit</a></p><p><span>3.</span><a href="/article/del" target="_blank">访问/article/del</a></p><p><span>4.</span><a href="/user/del" target="_blank">删除用户的user角色</a></p></div><script> window.onload = function() { document.querySelector('.add').onclick = function() { window.open('/user/add?name='+ document.querySelector('.name').value) } } </script>`res.send(html)})var User = schema()// 获取用户模型实例// 添加角色app.all('/user/add', (req, res, next) => {User.add(req.query).then((user) => {var _id = user._id.toString()// 注意_id默认是object类型req.session.userId = _id// 写入session,标识该用户acl.addUserRoles(_id, ['guest', 'user'])// 为用户添加guest和user的角色(那么用户就拥有了guest和user的权限)res.send({message: '添加用户角色成功'})}).catch((e) => {res.send({message: e.message})})})// 删除角色app.all('/user/del', (req, res, next) => {acl.removeUserRoles(req.session.userId, 'user')res.send({message: '删除用户角色成功'})})// 访问articleapp.all('/article/get', authentication, (req, res, next) => {res.send({message: '/article/get'})})// 编辑articleapp.all('/article/edit', authentication, (req, res, next) => {res.send({message: '/article/edit'})})// 删除articleapp.all('/article/del', authentication, (req, res, next) => {res.send({message: '/article/del'})})app.use(errorhandler)
}/** --------------------------------------------------* schema*/
function schema() {var schema = new mongoose.Schema({name: {type: String,},})schema.statics = {add: function(obj) {return this.create(obj)},}return mongoose.model('User', schema);
}/** --------------------------------------------------* 中间件*/
// 认证中间件
var authentication = (req, res, next) => {var userId =req.session.userId || ''if(userId) {acl.isAllowed(userId, req.path, '*').then(allowed => {if(allowed) {next()}else {next('权限不足')}}).catch((e) => {next(e.message)})}else {next('请登录')}}
// 错误中间件
var errorhandler = (e, req, res, next) => {res.send({message: e})
}/** --------------------------------------------------* 开启服务*/
app.listen(3001, () => {console.log('server...')
})

解释

icompuiz/express-mongoose-acl
Running ‘node_acl’ with mongoose on ExpressJS
RBAC角色权限设计思路

这篇关于node权限控制模块node_acl的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047255

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像