zoukankan      html  css  js  c++  java
  • 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('/');
    });
  • 相关阅读:
    【转载】 miniImageNet数据集介绍
    【转载】 聊聊统计学里的置信度和置信区间
    小样本学习(Few shot learning)标准数据集(miniImageNet、tieredImageNet、FewshotCIFAR100)下载地址
    配色素描必备书籍分享
    Jq滚动条插件写法(二)
    获得样式属性和外联样式
    windows7下gvim多标签打开新文件
    JQ插件jkscroll应用到页面中的效果
    《精通javascript》几个简单的函数(一)
    事件冒泡
  • 原文地址:https://www.cnblogs.com/Joans/p/3941842.html
Copyright © 2011-2022 走看看