Две паспортные локальные стратегии, одна из них работает, другая дает плохой запрос - PullRequest
0 голосов
/ 14 июля 2020

Вот мой код. Я сделал две стратегии, пользовательскую и админскую. При регистрации с использованием пользователя он работает нормально, я также могу войти в систему. Но при регистрации в качестве администратора после нажатия кнопки «Регистрация» отображается неверный запрос. Но он сохраняет и регистрирует всю информацию в базе данных. Думаю, проблема связана с аутентификацией. Но опять же, код аутентификации для пользователя и администратора идентичен. Но почему только пользователь может войти в систему, а администратор не может ?? Я искал решение больше дней, помогите пожалуйста.

// importing modules
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");

const app = express();

// using modules
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({
    extended: true
}))
app.use(session({
    secret: "DONHUB",
    resave: false,
    saveUninitialized: false
}))
app.use(passport.initialize());
app.use(passport.session());

// connecting to database (used placeholders here)
mongoose.connect("mongodb+srv://username:userxxxxx@cluster0.bdgfz.mongodb.net/dbname", {useNewUrlParser: true, useUnifiedTopology: true });
mongoose.set("useCreateIndex", true)

// creating db schema
const userSchema = new mongoose.Schema ({
    email: String,
    password: String,
    phone: String,
    address: String,
    city: String,
    username: String,
  });

const adminSchema = new mongoose.Schema({
    email: String,
    password: String,
    phone: String,
    address: String,
    username: String, 
    city: String,
})

// use passport as plugin for schema
userSchema.plugin(passportLocalMongoose);
adminSchema.plugin(passportLocalMongoose);

// creating collection os users
const User = new mongoose.model("User", userSchema);
const Admin = new mongoose.model("Admin", adminSchema);

// using passport for authentication
passport.use('localuser', User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

passport.use('localadmin', Admin.createStrategy());
passport.serializeUser(Admin.serializeUser());
passport.deserializeUser(Admin.deserializeUser());

app.get("/", function(req, res) {
    res.render("home");
})

app.get("/login", function(req, res) {
    res.render("login");
})
app.get("/register", function(req, res) {
    res.render("register");
})
app.get("/adminRegister", function(req, res) {
    res.render("adminRegister");
})
app.get("/admin", function(req, res) {
    if (req.isAuthenticated()) {
            res.render("admin") } else {res.redirect("/login")}
})
app.get("/user", function(req, res) {
    if (req.isAuthenticated()) {
            res.render("user") } else {res.redirect("/login")}
})

// app.posts

app.post("/register", function(req, res) {
    User.register({
        email: req.body.email,
        phone: req.body.phone,
        address: req.body.address,
        username: req.body.username, 
        city: req.body.city
        }, 
        req.body.password, function(err, user) {
        if (err) {
            console.log(err);
            res.redirect("/register");
        } else {
            passport.authenticate("localuser") (req, res, function () {
                res.redirect("/donate");
            })
        }
    })
})

app.post("/adminRegister", function(req, res) {
    
    Admin.register({
        username: req.body.city + "Admin",
        email: req.body.email,
        phone: req.body.phone,
        address: req.body.address, 
        city: req.body.city,
    },
    req.body.password, function(err, admin) {
        if (err) {
            console.log(err)
            res.redirect("/adminRegister");
        } else {
            passport.authenticate("localadmin") (req, res, function () {
                res.redirect("/admin")
            })
        }
    }
    )
})

app.post("/login", function (req, res) {
    if (req.body.username.search("Admin") !== -1) {
        console.log("this is admin")
        const admin = new Admin({
            username: req.body.username,
            password: req.body.password,
            email: req.body.email,
            phone: req.body.phone,
            address: req.body.address, 
            city: req.body.city,
        })

        req.login(admin, function(err) {
            if (err) {
                console.log(err)
            } else {
                passport.authenticate("local", {successRedirect: '/admin', failureRedirect: '/login'}) (req ,res, function() {
                    res.redirect("/admin");
                })
            }
        })
    } else {
        console.log("this is user")
        const user = new User({
            email: req.body.email,
            password: req.body.password,
            phone: req.body.phone,
            address: req.body.address,
            username: req.body.username,
        })
        
        req.login(user, function(err) {
            if(err) {
                console.log(err);
            } else {
                passport.authenticate("localuser", {successRedirect: '/donate', failureRedirect: '/login'}) (req,res, function() {
                    res.redirect("/donate"); 
                })
            }
        })
    }
})
// opening port to listen
let port = process.env.PORT;
if (port == null || port == "") {
    port = 3000
}
app.listen(port, function() {
    console.log("Server started successfully...")
})
...