繁体   English   中英

以用户身份创建登录并以组织身份登录 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);
    });
  });
};


这是我对登录表单的发布请求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM