gpt4 book ai didi

javascript - 在使用 Express 的 Node.js 中,如何实现用户登录和管理员登录?我希望具有管理员权限的用户可以访问所有路由

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:14 25 4
gpt4 key购买 nike

我构建了一个带有用户登录的 Node 应用程序,并且所有路由都仅针对用户进行保护。现在我想更进一步,为用户和管理员提供一次登录,但登录后,用户可以访问特定路由,而管理员可以访问所有路由。这是我目前拥有的内容的片段:

const express = require('express');
const app = express();
const session = require('express-session');
const pgSession = require('connect-pg-simple')(session);
const bodyParser = require('body-parser');

app.use(session({
store: new pgSession({
pgPromise: db
}),
secret: 'abc123',
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 30 * 24 * 60 * 60 * 1000
}
}));

app.use(express.static('public'));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

// protected route function for all users
function protectRoute(req, res, next) {
let isLoggedIn = req.session.user ? true : false;
if (isLoggedIn) {
next();
} else {
res.redirect('/search')
}
}

//middleware
app.use((req, res, next) => {
let isLoggedIn = req.session.user ? true : false;
next();
});

//login
app.get('/login', (req, res) => {
res.send(page(loginForm()));
})

app.post('/login', (req, res) => {
const theUsername = req.body.username;
const thePassword = req.body.password;

User.getUserByUsername(theUsername)
.catch(err => {
console.log(err);
res.redirect('/login');
})
.then(theUser => {
if(theUser.password === thePassword){
req.session.user = theUser;
req.session.save(function(err){
res.redirect('/search');
});
} else {
res.redirect('/login');
}
})

})

// search page for all users and admin
app.get('/search', protectRoute, (req, res) => {
res.send(page(companySearchForm(), req.session.user));
});

// inactive list that I WANT FOR ONLY ADMIN but currently for all users
app.get('/inactivelist', protectRoute, (req, res) => {
Company.getCompanyByStatus(false)
.catch(err => {
console.log(err);
})
.then(theCompany => {
const companyInfo = inactiveList(theCompany);
const thePage = page(companyInfo, req.session.user);
res.send(thePage);
})
})

这是检查是否登录的页面 View 函数

const {logoutButton, loginOrRegister} = require('./helper');

function page(content, isLoggedIn=false){
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">

<link rel="stylesheet" href="/stylesheets/index.css">

<title>Document</title>
</head>
<body>
${
isLoggedIn ? logoutButton() : loginOrRegister()
}
<div>
${content}
</div>
</body>
</html>
`
}

module.exports = page;

正如您所看到的,所有用户都可以访问所有 protected 路由。我该如何做到这一点,以便用户可以访问某些路径,而管理员可以访问所有路径?在我的 PostgreSQL 数据库中,有一列有关用户的 admin_access bool 值默认为“FALSE”。这是数据库用户表架构:

create table users (
id serial primary key,
name text,
username text,
password text,
admin_access boolean default 'FALSE'
);

我知道这很多,但我很感激您的帮助。不知道管理员访问权限如何工作。

最佳答案

我会使用另一个中间件函数,如下所示

function isAdmin(req, res, next) {
// Check if the requesting user is marked as admin in database
let isAdmin = // check in database
if (isAdmin) {
next();
} else {
res.redirect('/search')
}
}

然后我会这样使用它

// inactive list that I WANT FOR ONLY ADMIN but currently for all users
app.get('/inactivelist', protectRoute, isAdmin, (req, res) => {
Company.getCompanyByStatus(false)
.catch(err => {
console.log(err);
})
.then(theCompany => {
const companyInfo = inactiveList(theCompany);
const thePage = page(companyInfo, req.session.user);
res.send(thePage);
})
})

对于每条实际上需要您成为管理员才能使用的路线

关于javascript - 在使用 Express 的 Node.js 中,如何实现用户登录和管理员登录?我希望具有管理员权限的用户可以访问所有路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com