我能够成功为普通用户生成登录名。现在,我想为普通用户和管理员的登录屏幕使用相同的端点/login
。我想用固定的电子邮件创建 user-admin ,并使用生成的令牌将灵活的密码固定。
我是Node.JS后端路由的新手。
这是我的登录路线:-
router.post('/login' , (req, res, next) => {
User.find({email: req.body.email})
.exec()
.then(user => {
if(user.length < 1) {
return res.status(401).json({
message: "Auth failed. User not found."
})
}
bcrypt.compare(req.body.password, user[0].password, (err, result) =>{
if (err) {
return res.status(401).json({
message: "Auth failed. Check email and password"
});
}
if (result){
const token = jwt.sign(
{
email: user[0].email,
userId: user[0]._id
},
process.env.JWT_KEY,
{
expiresIn : "1h"
});
return res.status(200).json({
message: "Auth Successful",
token : token
});
}
});
})
.catch(err =>{
if (err.code == 500)
res.status(500).send(["Something went wrong in login"]);
else
return next(err);
});
});
我需要为我的管理部分添加哪些内容?
编辑:-
user.model
var userSchema = new mongoose.Schema({
fullName : {
type: String,
required: "Full name can't be empty"
},
email : {
type: String,
required: "Email can't be empty",
unique: true
},
password : {
type: String,
required: "Password can't be empty",
minlength: [6 ,"Password must be atleast 6 character long"]
},
phoneNumber : {
type: String,
required: "Reqired for further contact.Can't be empty"
},
saltSecret: String
});
mongoose.model('User', userSchema);
user.controller
const mongoose = require ('mongoose');
const User = mongoose.model('User');
module.exports.register = (req, res, next) =>{
var user = new User();
user.fullName = req.body.fullName;
user.email = req.body.email;
user.password = req.body.password;
user.phoneNumber = req.body.phoneNumber;
user.save((err, doc) =>{
if(!err)
res.send(doc);
else{
if (err.code == 11000)
res.status(422).send(["Entered duplicate email address. Please check"]);
else
return next(err);
}
});
}
答案 0 :(得分:0)
您可以在role
集合中添加一个附加字段Users
,其中可以包含值user
或admin
(如果有更多角色,则为值数组)。 / p>
然后,当您创建JWT令牌时,可以向其中添加role
字段。
const token = jwt.sign(
{
email: user[0].email,
userId: user[0]._id,
role: user[0].role
},
process.env.JWT_KEY,
{
expiresIn : "1h"
});
现在,您可以使用此值来识别登录用户是否为admin。
您可能需要创建新的API,以将用户转换为管理员(更改角色字段),或者根据需要直接在数据库中执行。
如果您想完全通过代码处理admin逻辑(不对db进行任何修改),并且已经知道要分配为admin的用户的电子邮件ID,则可以使用以下逻辑。
const adminEmail = "admin@example.com";
const role = user[0].email===adminEmail? "admin" : "user";
const token = jwt.sign(
{
email: user[0].email,
userId: user[0]._id,
role
},
process.env.JWT_KEY,
{
expiresIn : "1h"
});