請關注專題:我的NodeJS學習之路(實踐之路)
小弟初涉node領域胆建,不足之處,還請多多指教肘交!
歡迎Star笆载、Fork:https://github.com/gefangshuai/ANodeBlog
本文來介紹系統(tǒng)中用到的權限認證的知識。
首先簡單介紹一下passportjs。
Passport做登錄驗證具有:靈活性凉驻、模塊化腻要、豐富的中間件等特點,更加詳細的介紹請參考:http://idlelife.org/archives/808
如何在項目中使用passport涝登?
注意:關于passport的配置信息要放置在
app.js
所有的路由請求上面雄家,這樣才能對所有的路由進行過濾。
1. 安裝集成
npm install passport --save
我們還用到了本地驗證策略胀滚,所以將passport-local
一起安裝
npm install passport-local --save
2. 配置passport
- 在項目中引用
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
- 對策略進行配置
passport.use(new LocalStrategy(callback_function)));
**callback_function: **
三個參數(shù)分別是:username
趟济、password
、done
蛛淋。
-
username
:需要驗證的“用戶名” -
password
:需要驗證的“密碼” -
done
: 對驗證結果的處理方法
username
和password
默認對應表單的name="username"
和name="password"
咙好,也可以自己定義表單的名字篡腌,比如:
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'passwd'
},
function(username, password, done) {
// ...
}
));
關于done
函數(shù):
- 處理成功褐荷,
return done(null, user)
- 處理失敗
return done(err)
或者return done(null, false)
或者return done(null, false, { message: 'Incorrect password.' })
- 對Session進行序列化和反序列化
序列化:
即:將唯一的值(如登錄用戶的id)序列化到session中,即sessionID嘹悼,同時它將作為憑證存儲在用戶cookie中叛甫。
passport.serializeUser(function (user, done) {
done(null, user.id);
});
反序列化:
即:根據(jù)存在的sessionID,從數(shù)據(jù)庫中查詢user并存儲與req.user中杨伙。
passport.deserializeUser(function (id, done) {
done(null, id);
});
做完以上三步其监,就已經(jīng)簡單地將passport集成在項目中了。
3. 做登錄處理
在處理登陸請求的路由中限匣,加入登錄處理的配置信息抖苦,然后passport會自動幫你處理是否登錄成功(有點類似shiro)。
router.post('/login', passport.authenticate('local', options), success_callback);
options可以定義的參數(shù):
-
session
:Boolean米死。設置是否需要session锌历,默認為true -
successRedirect
:String。設置當驗證成功時的跳轉鏈接 -
failureRedirect
:String峦筒。設置當驗證失敗時的跳轉鏈接 -
failureFlash
:Boolean or String究西。設置為Boolean時,express-flash將調(diào)用use()里設置的message物喷。設置為String時將直接調(diào)用這里的信息卤材。 -
successFlash
:Boolean or String。使用方法同上峦失。
success_callback:驗證成功后做的處理扇丛,可以是登錄成功后的跳轉等等。
4. 在方法中使用校驗
使用其實很簡單尉辑,passport擴展了http request
默認提供了一些內(nèi)置方法:
-
request.logIn(user, options, callback)
: 將登錄用戶存入session帆精。
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
這樣,就可以通過req.user
獲取user
對象了
-
request.logOut()
:退出登錄用戶,刪除session信息实幕。 -
request.isAuthenticated()
:判斷當前請求的用戶是否已授權(已登錄)吝镣,返回true
或false
-
request.isUnauthenticated()
:跟request.isAuthenticated()
相反。
有了上面的知識昆庇,我們就可以統(tǒng)一進行驗證了末贾。
如:對于后臺管理的模塊,必須登錄用戶才能有權限整吆,所以可以對后臺管理的所有路由進行攔截拱撵,為了方便我們可以自定義一個中間件來統(tǒng)一進行處理:驗證通過,繼續(xù)表蝙;驗證不通過拴测,跳回到登錄頁面,并告知需要登陸府蛇。
5. 封裝驗證中間件:(authority.js)
module.exports = {
/**
* 登陸權限驗證
*/
isAuthenticated: function (req, res, next) {
if(req.isAuthenticated()) {
return next();
}else{
req.flash(config.constant.flash.error, '請先登錄!');
res.redirect('/login')
}
}
};
6. 統(tǒng)一對路由進行過濾
app.use('/dashboard', authority.isAuthenticated, require('./routes/dashboard'));
app.use('/dashboard/p', authority.isAuthenticated, require('./routes/dashboard-p'));
app.use('/dashboard/u', authority.isAuthenticated, require('./routes/dashboard-u'));
關于passport-local的實用實例集索,在官方wiki有給出,可以做一下參考汇跨。
請關注專題:我的NodeJS學習之路(實踐之路)