创建用户登录和组织登录 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 个本地策略,在这种情况下你可以使用两个不同的模型
我正在构建一个需要用户和组织注册和登录的应用程序。我正在使用节点 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 个本地策略,在这种情况下你可以使用两个不同的模型