我的NodeJS學習之路7(權限認證)

請關注專題:我的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

  1. 在項目中引用
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
  1. 對策略進行配置
passport.use(new LocalStrategy(callback_function)));

**callback_function: **
三個參數(shù)分別是:username趟济、passworddone蛛淋。

  • username:需要驗證的“用戶名”
  • password:需要驗證的“密碼”
  • done: 對驗證結果的處理方法

usernamepassword默認對應表單的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.' })
  1. 對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():判斷當前請求的用戶是否已授權(已登錄)吝镣,返回truefalse
  • 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學習之路(實踐之路)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末务荆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子穷遂,更是在濱河造成了極大的恐慌函匕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚪黑,死亡現(xiàn)場離奇詭異盅惜,居然都是意外死亡,警方通過查閱死者的電腦和手機忌穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門抒寂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伴网,你說我怎么就攤上這事蓬推。” “怎么了澡腾?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵沸伏,是天一觀的道長。 經(jīng)常有香客問我动分,道長毅糟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任澜公,我火速辦了婚禮姆另,結果婚禮上喇肋,老公的妹妹穿的比我還像新娘。我一直安慰自己迹辐,他們只是感情好蝶防,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著明吩,像睡著了一般间学。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上印荔,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天低葫,我揣著相機與錄音,去河邊找鬼仍律。 笑死嘿悬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的水泉。 我是一名探鬼主播善涨,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茶行!你這毒婦竟也來了躯概?” 一聲冷哼從身側響起登钥,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤畔师,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牧牢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看锉,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年塔鳍,在試婚紗的時候發(fā)現(xiàn)自己被綠了伯铣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轮纫,死狀恐怖腔寡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掌唾,我是刑警寧澤放前,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站糯彬,受9級特大地震影響凭语,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撩扒,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一似扔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦炒辉、人聲如沸豪墅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽但校。三九已至,卻和暖如春啡氢,著一層夾襖步出監(jiān)牢的瞬間状囱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工倘是, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亭枷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓搀崭,卻偏偏與公主長得像叨粘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘤睹,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 經(jīng)過對django的初步學習升敲,我們已經(jīng)對后臺的基本流程以及django的運作有了一定的了解,但是這還不足夠轰传,dja...
    coder_ben閱讀 3,830評論 8 34
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理驴党,服務發(fā)現(xiàn),斷路器获茬,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 關于權限認證 權限認證是幾乎任何系統(tǒng)都會存在的一個重要模塊港庄,但是往往權限認證又會是比較麻煩且復雜的模塊。所以很多的...
    無聊數(shù)藏家閱讀 8,115評論 0 8
  • 此段內(nèi)容簡要來自自強學堂的教程詳情請查詢自強學堂 一恕曲、 后臺的運作流程 接收request請求 處理數(shù)據(jù) 獲取請求...
    coder_ben閱讀 5,246評論 6 56
  • 1. 綜述 GENERAL Simple, unobtrusive authentication for Node...
    wlszouc閱讀 4,757評論 1 7