前面的章节我们已经实现了用户登录注册,文章的管理。但是有个重要问题我们还没解决。那就是权限管理。正常情况下,我们没有登录的话只能浏览,登陆后才能发帖或写文章,而且一些功能*(如下一节将实现的分类管理)*只有管理员才能操作。
在用户登录注册那一节,已经说了本项目通过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
一样使用了