1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /**
- * Created by zhengguorong on 16/11/2.
- * 用户权限认证方法
- *
- * * Q&A
- * 为什么要使用composable-middleware,为了解决什么问题?
- * 他的作用是合并两个中间件,让其不需要在挂在在express实例上,例如expressJwt中间件是在执行后操作req对象,在req对象
- * 上加入user对象,但该中间件未提供回调方法,无法在验证后执行我们的代码,因此需要使用composable插件来完成两个中间件的
- * 合并.
- * 当然,你也可以像官方提供示例一样,router.get('/',jwtvalidate,function(req,res,next){req.user})获取结果,但是
- * 我的路由第三个参数主要执行数据库相关操作,不想引入验证逻辑,所以在第二个参数这里完成权限的认证.
- *
- */
- const jwt = require('jsonwebtoken')
- const expressJwt = require('express-jwt')
- const config = require('../config')
- const compose = require('composable-middleware')
- const User = require('../api/user/user.model')
- const UserController = require('../api/user/user.controller')
- const validateJwt = expressJwt({
- secret: config.secrets.session
- })
- /**
- * 验证用户是否有权限操作
- * @returns {function()}
- */
- module.exports.isAuthenticated = () => {
- return compose()
- .use(function (req, res, next) {
- // allow access_token to be passed through query parameter as well
- if (req.query && req.query.hasOwnProperty('access_token')) {
- req.headers.authorization = `Bearer ${req.query.access_token}`;
- }
- if(req.body && req.body.hasOwnProperty('access_token')) {
- req.headers.authorization = `Bearer ${req.body.access_token}`;
- }
- // IE11 forgets to set Authorization header sometimes. Pull from cookie instead.
- if (req.query && typeof req.headers.authorization === 'undefined') {
- req.headers.authorization = `Bearer ${req.cookies.token}`;
- }
- //验证是否服务端生成的token
- var token = req.headers.authorization.split('Bearer ')[1]
- UserController.findByToken(token).then((user) => {
- if (user) {
- //验证token是否过期
- validateJwt(req, res, next);
- }else{
- return res.status(401).end();
- }
- })
- })
- // Attach user to request
- .use(function (req, res, next) {
- User.findById(req.user._id).exec()
- .then(user => {
- if (!user) {
- return res.status(401).end();
- }
- req.user = user;
- next();
- })
- .catch(err => next(err));
- });
- }
- module.exports.hasRole = (roleRequired) => {
- if (!roleRequired) {
- throw new Error('必须输入身份名称');
- }
- return compose()
- .use(this.isAuthenticated())
- .use(function meetsRequirements(req, res, next) {
- if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
- return next();
- } else {
- return res.status(403).send('没有访问权限');
- }
- });
- }
- /**
- * 返回一个JWT TOKEN
- * @param id 用户ID
- * @param role 用户权限
- * @returns {*} JWT TOKEN
- */
- module.exports.signToken = (id, role) => {
- return jwt.sign({_id: id, role}, config.secrets.session, {
- expiresIn: 60 * 60 * 5
- })
- }
|