Я хотел бы защитить некоторые конечные точки в своем экспресс-приложении, я хочу создать что-то простое в управлении, если бы мое приложение стало большим приложением ... теперь я делаю что-то вроде этого:
setProtected(router) {
const self = this;
router.use(this.auth);
...
}
setPublic(router) {
const self = this;
...
}
getRouter() {
const router = express.Router();
this.setPublic(router);
this.setProtected(router);
return router;
}
с участием:
auth(req, res, next) {
if (req.isAuthenticated()) {
console.info('req.isAuthenticated()', req.isAuthenticated());
return next();
}
return res.send(401);
}
проблема в этом случае заключается в том, что его сложно поддерживать, и он не работает так, как если бы у меня был /: id в моем publicRoute и, например, / my-items в моем защищенном маршруте, когда я не вошел в систему, и я пытаюсь достичь / my-items Я получаю код /: id.
Другая идея заключалась в том, чтобы создать json со списком всех моих URL-адресов с такой же информацией, как защищенные / незащищенные и возможные роли, а затем изменить аутентификацию примерно так:
import urls from './urls';
auth(req, res, next) {
if (urls[req.url] == 'public') {
return next()
}
else if (urls[req.url] == 'protected' && req.isAuthenticated()) {
return next();
}
return res.send(401);
}
какой способ лучше всего подходит для вас?





Вы можете связать промежуточное ПО: например.
const authenticate = (req, res, next) {
.. some auth logic
next();
}
app.use('/', main...
app.use('/profile', authenticate, otherMiddleware,
app.use('/admin', authenticate, isAdmin, otherMiddleware...
app.use (аутентифицировать); или router.use (аутентифицировать)
пробовал, но я не могу получить req.router.path, так как он еще не установлен :(
в вашем основном файле (server.js) импортируйте маршруты и используйте там промежуточное ПО :)
server.js
const express = require('express')
const cors = require('cors')
const app = express()
// import admin routes
const adminRoute = require('./app/routes/admin.route.js')
// Add middleware for parsing URL encoded bodies (which are usually sent by browser)
app.use(cors())
// Add middleware for parsing JSON and urlencoded data and populating `req.body`
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
// homepage route
app.get("/", (req, res) => {
res.json({ message: "Hello World" })
})
// restricted by middleware "isAdmin"
app.use('/api/v1', isAdmin, adminRoute)
app.listen(8008).on('listening', () => {
console.info('Server is running on 8008')
})
admin.route.js
const express = require('express')
const admin = require('../controllers/admin.controller.js')
const router = express.Router()
// get all admin users
router.get('/users', (req, res, next) => {
admin.getAdminUsers(req, res, next)
})
module.exports = router
Я знаю это, но возможно, я хотел бы иметь что-то, что я определяю перед всеми маршрутами, вместо того, чтобы вводить промежуточное ПО во все маршруты ...