创建用户登录和组织登录 mongodb

Create login as user and login as organization mongodb

我正在构建一个需要用户和组织注册和登录的应用程序。我正在使用节点 js 护照 - 相同的本地策略。我已经创建了所有视图并使用户登录正常工作,但是当我复制代码以作为组织登录时,出现意外错误或被重定向到任何其他视图。

这是我的 app.js 文件


// Passport Config
require('./config/Orgpassport')(Orgpassport);
require('./config/passport')(passport);


// Express session
app.use(
  session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true
  })
);

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

// Connect flash
app.use(flash());

这是我的 passport.js 文件


const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
      console.log(passport);
      // Match user
      User.findOne({
        email: email
      }).then(user => {
        if (!user) {
          return done(null, false, { message: 'That email is not registered' });
        }

        // Match password
        bcrypt.compare(password, user.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false, { message: 'Password incorrect' });
          }
        });
      });
    })
  );

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};


这是我的 post 登录表单请求。

router.post('/Orglogin', (req, res, next) => {
  passport.authenticate('local', {
    successRedirect: '/Orgdashboard',
    failureRedirect: '/org/Orglogin',
    failureFlash: true
  })(req, res, next);
});

我可以用用户登录,但不能用组织登录?

这是我的 Orgpassport.js 文件

const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');

const Org = require('../models/Organization');

module.exports = function(Orgpassport) {
  Orgpassport.use(
    new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
      // Match org
      Org.findOne({
        email: email
      }).then(org => {
        if (!org) {
          return done(null, false, { message: 'That email is not registered' });
        }

        // Match password
        bcrypt.compare(password, org.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, org);
          } else {
            return done(null, false, { message: 'Password incorrect' });
          }
        });
      });
    })
  );

  Orgpassport.serializeUser(function(org, done) {
    done(null, org.id);
  });

  Orgpassport.deserializeUser(function(id, done) {
    Org.findById(id, function(err, org) {
      done(err, org);
    });
  });
};

这是 OrgLogin.ejs 文件

<div class="row mt-5">
  <div class="col-md-6 m-auto">
    <div class="card card-body">
      <h1 class="text-center mb-3"><i class="fas fa-sign-in-alt"></i>  Login</h1>
      <% include ./partials/messages %>
      <form action="/org/Orglogin" method="POST">
        <div class="form-group">
          <label for="email">Email</label>
          <input
            type="email"
            id="email"
            name="email"
            class="form-control"
            placeholder="Enter Email"
          />
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input
            type="password"
            id="password"
            name="password"
            class="form-control"
            placeholder="Enter Password"
          />
        </div>
        <button type="submit" class="btn btn-primary btn-block">Login</button>
      </form>
      <p class="lead mt-4">
        No Account? <a href="/org/Orgregister">Register</a>
      </p>
    </div>
  </div>
</div>

从您的前端添加一个 param 例如 "org" 这样在您的后端您将能够识别该请求是针对 organization 的,然后在您的 org 架构中针对添加一个像 "isorganisation=true" 这样的布尔值,这将使您确定尝试登录的用户是否来自组织,接下来在您的护照本地策略的这一行中添加这个新的 LocalStrategy({ usernameField: 'email' ,passReqToCallback:true} 这将允许您获取 request ,然后您可以使用它来实现逻辑,使用您之前设置的参数 req,params.org 并检查它是否存在,如果存在则验证用户是否在数据库中并检查是否 isorganisation 设置为 true 如果是,则正常验证用户,否则如果 req.params 不包含 org 则意味着它不是来自 org 那么你使用普通用户验证这种方式你不不需要使用 2 个本地策略,在这种情况下你可以使用两个不同的模型