二:实现登录认证
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('/'); });
作者:Joan
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。