简介
- 获取当前用户的角色
- 根据角色获取当前角色的权限列表
- 获取当前访问的url对应的权限id
- 判断当前访问的url对应的权限id 是否存在权限列表的id中
- 在中间件中判断,因为每个路由之前都要走中间件
service
service/admin.js
async checkAuth() {
// 1.获取当前用户的角色
// 2.根据角色获取当前角色的权限列表
// 3.获取当前访问的url对应的权限id
// 4.判断当前访问的url对应的权限id 是否存在权限列表的id中
// 1.
var userinfo = this.ctx.session.userinfo;
var role_id = userinfo.role_id;
var pathname = url.parse(this.ctx.request.url).pathname;
//忽略权限判断的地址 is_super=1表示超级管理员
var ignoreUrl = ['/admin/login','/admin/doLogin','/admin/verify','/admin/loginOut']
if(ignoreUrl.indexOf(pathname) !=-1 || userinfo.is_super == 1){
return true; //允许访问
}
// 2.
var accessResult = await this.ctx.model.RoleAccess.find({"role_id":role_id})
var accessArray = [];
accessResult.forEach(function(value){
accessArray.push(value.access_id.toString());
})
// 3.
var accessUrlResult = await this.ctx.model.Access.find({"url":pathname})
// 4.
if(accessUrlResult.length >0){
if(accessArray.indexOf(accessUrlResult[0]._id.toString())!= -1){
return true;
}
return false;
}
return false;
}
middleware
middleware/adminauth.js
增加的代码
var hasAuth = await ctx.service.admin.checkAuth();
if(hasAuth){
await next();
}else{
ctx.body = '你没有权限访问当前地址'
}
全部代码
const url = require('url')
module.exports = options => {
return async function adminauth(ctx, next) {
// 1.用户没有登录跳转到登录页面
// 2.只有登录以后才可以访问后台管理系统
var pathname = url.parse(ctx.request.url).pathname;
console.log(pathname)
//csrf
ctx.state.csrf = ctx.csrf;
ctx.state.prevPage = ctx.request.headers['referer']; //获取上一页的url
if(ctx.session.userinfo){
ctx.state.userinfo = ctx.session.userinfo;
// await next();
//登录权限判断
var hasAuth = await ctx.service.admin.checkAuth();
if(hasAuth){
await next();
}else{
ctx.body = '你没有权限访问当前地址'
}
}else{
// 排除不需要做杼判断的页面 admin/verify?mt=0.7755167188853835
if(pathname == '/admin/login' || pathname == '/admin/doLogin' || pathname == '/admin/verify'){
await next()
}else{
ctx.redirect('/admin/login')
}
}
};
};