express+nodecoffee寫passport登錄驗證實例(二)


二:實現登錄認證

  passport官網文檔:  http://passportjs.org/guide/

  passport驗證使用一種被稱為“策略”的方式來驗證請求,策略支持3種類型的驗證:用戶名密碼驗證;OAuth委派驗證,OpenID等聯合身份驗證(facebook,twitter等)。

  聯合身份認證可參考這里

  常用的是LocalStrategy策略來為用戶名密碼驗證,它通過use()函數來調用。

使用步驟:

1:安裝模塊,passport 和 passport-local

2:添加引用

  passport = require 'passport'
  LocalStrategy = require('passport-local').Strategy

 引用中間件app.use:

  passport.initialize()中間件是初始化passport必須的

  passport.session()如果應用程序使用永久登錄會話,中間件也必須使用。

注:該中間件的引用一定要寫在app.router之前。原因上一節以說明。

3:配置local-strategy,本地策略

passport.use(new LocalStrategy((username,password,done) ->
  User.find {userName:username,password:password},(err, docs) ->
    return done err if err?
    return done null,false,{message:"用戶名或者密碼錯誤"} if docs.length is 0
    done null,docs[0]))
當用戶驗證請求發出后,他會解析請求參數username,password(默認參數),也可以自定義名字,驗證完后出發done函數。
done(err):err參數表示在驗證過程中出現了異常,如數據庫連接問題。
done(null,false):如果憑證無效(例如,如果密碼不正確的)done的第二個參數返回false,表示認證失敗。
done(null,false,{msg:'err info'})  認證失敗后的失敗信息,可通過req.flash訪問到
done(null,user)  認證成功並返回user對象
 
自定義的認證字段,用usernameField,passwordField, 對應頁面上的input,name屬性為email,passwd
new LocalStrategy({ usernameField: 'email', passwordField: 'passwd' },(username,password,done) -> ...)
4:當驗證成功,建立會話,並通過cookie維持。passport需要序列化和反序列化的用戶實例來支持會話。因此,serializeUser和deserializeUser回調也是必需的。
passport.serializeUser (user, done) ->
  done null, user

passport.deserializeUser (user, done) ->
  done null, user

5: 調用

 在用戶發出登錄請求時觸發驗證

app.post('/login',
 passport.authenticate('local', { failureRedirect: '/login', failureFlash:true } ),
  (req,res) ->
    if req.user.role is 'normal' #角色1
      res.redirect '/MB/index'
    else if req.user.role is 'auditor' #角色2
      res.redirect '/audit'
    else if req.user.role is 'admin' #管理員
      res.redirect '/BM/index'
)

若不分角色 可直接

app.post('/login',
  passport.authenticate('local', { successRedirect: '/', 
                                   failureRedirect: '/login' }));

6:頁面錯誤信息參數

app.get '/login',(req, res) ->
  res.render 'login', layout:false, error:req.flash('error')

7:登出

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/');
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM