sails-auth未生成模型、策略等文件求助(sails 0.12.14)
我完全懂你现在的困扰——刚搭好全新的Sails 0.12.14应用,想靠sails-auth快速集成Passport认证,结果不仅没按文档生成预期文件,还收到一堆弃用警告,属实让人头大。咱们来一步步拆解问题和解决方案:
为什么会出现这些问题?
首先得明确:sails-auth已经停止维护很久了,它主要适配的是更早版本的Sails(比如0.10.x),和你用的0.12.14存在兼容性缝隙,这就是弃用警告的来源,也是自动生成文件失效的核心原因——它的生成脚本没法适配Sails 0.12.x的钩子和生成器机制了。
解决方案:两个方向可选
方向一:放弃sails-auth,直接用原生Passport(推荐)
既然sails-auth只是Passport的封装,不如直接上手原生Passport,更可控也能避免依赖弃用包。步骤如下:
安装必要依赖
打开终端运行:npm install passport passport-local bcrypt-nodejs --savepassport:核心认证库passport-local:用户名密码本地认证策略bcrypt-nodejs:加密用户密码(安全必备)
生成User模型
运行生成命令创建用户模型:sails generate model User email:string password:string isActive:boolean然后在
api/models/User.js里添加密码加密的钩子:module.exports = { attributes: { email: { type: 'string', required: true, unique: true }, password: { type: 'string', required: true }, isActive: { type: 'boolean', defaultsTo: true } }, beforeCreate: function(values, cb) { // 加密密码 require('bcrypt-nodejs').hash(values.password, null, null, function(err, hash) { if (err) return cb(err); values.password = hash; cb(); }); } };创建Auth控制器
生成处理登录、注册的控制器:sails generate controller Auth login register logout在
api/controllers/AuthController.js里实现核心逻辑:var passport = require('passport'); module.exports = { login: function(req, res) { passport.authenticate('local', function(err, user, info) { if (err || !user) return res.badRequest(info.message); req.logIn(user, function(err) { if (err) return res.badRequest(err); return res.ok({ message: '登录成功', user: user }); }); })(req, res); }, register: function(req, res) { User.create(req.allParams()).exec(function(err, user) { if (err) return res.badRequest(err); req.logIn(user, function(err) { if (err) return res.badRequest(err); return res.ok({ message: '注册成功', user: user }); }); }); }, logout: function(req, res) { req.logout(); res.ok({ message: '退出登录成功' }); } };配置Passport策略与中间件
在项目根目录创建config/passport.js:var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var bcrypt = require('bcrypt-nodejs'); module.exports = function() { // 序列化用户(存在session中) passport.serializeUser(function(user, done) { done(null, user.id); }); // 反序列化用户(从session取出) passport.deserializeUser(function(id, done) { User.findOne(id).exec(function(err, user) { done(err, user); }); }); // 配置本地认证策略 passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(email, password, done) { User.findOne({ email: email }).exec(function(err, user) { if (err) return done(err); if (!user) return done(null, false, { message: '邮箱不存在' }); // 验证密码 bcrypt.compare(password, user.password, function(err, match) { if (err) return done(err); if (!match) return done(null, false, { message: '密码错误' }); return done(null, user); }); }); })); };然后修改
config/http.js,添加Passport中间件:module.exports.http = { middleware: { passportInit: require('passport').initialize(), passportSession: require('passport').session(), // 把这两个中间件加到中间件顺序里,放在session之后 order: [ 'startRequestTimer', 'cookieParser', 'session', 'passportInit', // 新增 'passportSession', // 新增 'bodyParser', 'handleBodyParserError', 'compress', 'methodOverride', 'poweredBy', '$custom', 'router', 'www', 'favicon', '404', '500' ] } };初始化Passport
在config/bootstrap.js里添加初始化代码:module.exports.bootstrap = function(cb) { // 初始化Passport require('../config/passport')(); cb(); };
方向二:强行使用兼容版sails-auth(不推荐)
如果你坚持要用sails-auth,可以试试安装和Sails 0.12.x兼容的旧版本,比如0.1.7,然后手动触发生成命令:
- 安装指定版本:
npm install sails-auth@0.1.7 --save - 手动运行生成命令:
这个版本大概率能适配Sails 0.12.14,但还是要做好踩坑准备——毕竟这个包已经多年没更新了,后续遇到问题很难找到支持。sails generate auth
最后想说
个人强烈推荐方向一,直接用原生Passport虽然多写几行代码,但完全可控,也能避免依赖弃用包带来的潜在风险,后续扩展其他认证策略(比如OAuth、JWT)也更灵活。
内容的提问来源于stack exchange,提问作者Sejista Carl

