You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sails-auth未生成模型、策略等文件求助(sails 0.12.14)

解决Sails 0.12.14中sails-auth无文件生成及弃用警告的问题

我完全懂你现在的困扰——刚搭好全新的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,更可控也能避免依赖弃用包。步骤如下:

  1. 安装必要依赖
    打开终端运行:

    npm install passport passport-local bcrypt-nodejs --save
    
    • passport:核心认证库
    • passport-local:用户名密码本地认证策略
    • bcrypt-nodejs:加密用户密码(安全必备)
  2. 生成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();
        });
      }
    };
    
  3. 创建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: '退出登录成功' });
      }
    };
    
  4. 配置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'
        ]
      }
    };
    
  5. 初始化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,然后手动触发生成命令:

  1. 安装指定版本:
    npm install sails-auth@0.1.7 --save
    
  2. 手动运行生成命令:
    sails generate auth
    
    这个版本大概率能适配Sails 0.12.14,但还是要做好踩坑准备——毕竟这个包已经多年没更新了,后续遇到问题很难找到支持。

最后想说

个人强烈推荐方向一,直接用原生Passport虽然多写几行代码,但完全可控,也能避免依赖弃用包带来的潜在风险,后续扩展其他认证策略(比如OAuth、JWT)也更灵活。

内容的提问来源于stack exchange,提问作者Sejista Carl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:33:53