用户权限控制

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

登录状态检查

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

  1. // routes/about.js
  2. module.exports = {
  3. async index (ctx, next) {
  4. // 判断session.user
  5. if (!ctx.session.user) {
  6. ctx.flash = { warning: '未登录, 请先登录' }
  7. return ctx.redirect('/signin')
  8. }
  9. ctx.body = 'about'
  10. }
  11. }

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

  1. // routes/index.js
  2. const router = require('koa-router')()
  3. // 判断是否登录的中间件
  4. async function isLoginUser (ctx, next) {
  5. if (!ctx.session.user) {
  6. ctx.flash = { warning: '未登录, 请先登录' }
  7. return ctx.redirect('/signin')
  8. }
  9. await next()
  10. }
  11. module.exports = (app) => {
  12. router.get('/', require('./home').index)
  13. ...
  14. router.get('/posts/new', isLoginUser, require('./posts').create)
  15. router.post('/posts/new', isLoginUser, require('./posts').create)
  16. ..
  17. app
  18. .use(router.routes())
  19. .use(router.allowedMethods())
  20. }

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

管理权限控制

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

  1. async function isAdmin (ctx, next) {
  2. console.log(ctx.session)
  3. if (!ctx.session.user) {
  4. ctx.flash = { warning: '未登录, 请先登录' }
  5. return ctx.redirect('/signin')
  6. }
  7. if (!ctx.session.user.isAdmin) {
  8. ctx.flash = { warning: '没有权限' }
  9. return ctx.redirect('back')
  10. }
  11. await next()
  12. }

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