当前位置: 首页 > Web前端 > CSS

基于阿里egg框架搭建博客(四)——权限控制

时间:2023-03-30 15:15:10 CSS

相关文章基于阿里egg框架搭建博客(一)——开发准备基于阿里egg框架搭建博客(二)——HelloWorld基于阿里egg框架搭建博客(三)——注册登录基于阿里egg框架搭建博客(四)——权限控制基于阿里egg框架搭建博客(五)——置顶导航栏基于阿里egg框架搭建博客(六)——浏览和发布文章基于阿里egg框架搭建博客(七)——编辑文章githttps://github.com/ZzzSimon/e...喜欢就点个赞吧!在上一篇文章中,我们实现了用户注册和登录,接下来我们需要控制用户权限,比如:普通用户只能发表评论,管理员可以发表文章,高层管理员可以修改用户权限等等。由于权限控制是一个通用的功能,我们把这个功能做成中间件。关于中间件:官方文档:https://eggjs.org/zh-cn/basic...功能设计一个用户对应一个角色,可以通过配置文件来配置某个角色没有权限的页面和界面use可以配置为不带Path来验证用户和权限。例如:登录和注册的相关页面和界面,只有登录后才能访问,否则会跳转登录页面。用户表,添加角色(role)字段配置文件我们在config/config.default.js中添加如下内容:auth:{noAuth:['/login.htm','/user/login','/register.htm','/user/register'],noPermission:{admin:[],manager:['/admin.htm'],user:['/admin.htm','/edit.htm']}}其中:noAuth节点配置无需认证即可访问的路径。noPermission节点配置每个角色无权访问的pathauth.js中间件代码。我们创建app/middleware/auth.js文件:module.exports=(options,app)=>{returnasyncfunctionauth(ctx,next){//如果用户session不无效if(typeof(ctx.session.user)!=='undefined'){constusername=ctx.session.user.username;//这里有两个方法。第一种方法每次都检查数据库以验证角色。优点:实时,用户感觉不到角色的变化。缺点:查库效率低,可以考虑使用redis//第二种方法,将角色信息放到session中,优点:不用查库,效率高。缺点:角色变化时需要额外的逻辑处理旧的session,否则无法实时更新客户端的用户角色constrole=awaitctx.service.user.getRoleByUsername(username);constnoPerList=options.noPermission[角色];如果(noPerList&&!noPerList.includes(ctx.path)){awaitnext();}else{ctx.body='没有权限,请联系站长!';}//登录注册页面不需要权限}elseif(options.noAuth.includes(ctx.path)){awaitnext();//如果会话过期重定向到登录页面}else{ctx.redirect('/login.htm')}}};效果我们创建一个用户,并赋予他用户角色。从配置文件可以看出,用户角色没有权限访问/edit.htm路径。如图:正则匹配如果页面越来越多,或者某些带参数的路径是动态的,我们就需要一定的规则来过滤路径。这时候就需要用到正则匹配了。我们修改auth.js文件:module.exports=(options,app)=>{functionisNoPer(noPerList,path){for(leti=0;i