用户权限控制

前面的章节我们已经实现了用户登录注册,文章的管理。但是有个重要问题我们还没解决。那就是权限管理。正常情况下,我们没有登录的话只能浏览,登陆后才能发帖或写文章,而且一些功能(如下一节将实现的分类管理)只有管理员才能操作。

登录状态检查

在用户登录注册那一节,已经说了本项目通过session来记录用户状态。那么现在就来做用户的权限控制。你一定能想到:我们只需要在对应的控制器里面判断session中是否存在user。如:

// routes/about.js
module.exports = {
  async index (ctx, next) {
    // 判断session.user
    if (!ctx.session.user) {
      ctx.flash = { warning: '未登录, 请先登录' }
      return ctx.redirect('/signin')
    }
    ctx.body = 'about'
  }
}

但是每个控制器里都写这么一点判断太麻烦了。我们可以将它写成一个中间件,然后在对应的路由上直接使用即可。

// routes/index.js
const router = require('koa-router')()

// 判断是否登录的中间件
async function isLoginUser (ctx, next) {
  if (!ctx.session.user) {
    ctx.flash = { warning: '未登录, 请先登录' }
    return ctx.redirect('/signin')
  }
  await next()
}

module.exports = (app) => {
  router.get('/', require('./home').index)
  ...
  router.get('/posts/new', isLoginUser, require('./posts').create)
  router.post('/posts/new', isLoginUser, require('./posts').create)
  ..

  app
    .use(router.routes())
    .use(router.allowedMethods())
}

现在就给需要用户登录的功能加上这个登录控制中间件试试。

管理权限控制

前面我们队用户登录状态做了判断,现在我们再来写一个控制管理员权限的方法。

async function isAdmin (ctx, next) {
  console.log(ctx.session)
  if (!ctx.session.user) {
    ctx.flash = { warning: '未登录, 请先登录' }
    return ctx.redirect('/signin')
  }
  if (!ctx.session.user.isAdmin) {
    ctx.flash = { warning: '没有权限' }
    return ctx.redirect('back')
  }
  await next()
}

它先判断用户是否登录,在判断当然用户是不是管理员isAdmin: true。接下来就可以像使用isLoginUser一样使用了