first commit
This commit is contained in:
47
src/core/middleware/auth.middleware.ts
Normal file
47
src/core/middleware/auth.middleware.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { Request, Response, NextFunction } from "express";
|
||||
import jwt from "jsonwebtoken";
|
||||
import { User } from "../../models/User";
|
||||
import { Role } from "../../models/Role";
|
||||
import { Permission } from "../../models/Permission";
|
||||
|
||||
/**
|
||||
* Middleware: استخراج اطلاعات کاربر از توکن JWT
|
||||
* توکن باید در Header ارسال شود: Authorization: Bearer <token>
|
||||
*/
|
||||
export async function requireAuth(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) {
|
||||
const authHeader = req.headers.authorization;
|
||||
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
return res.status(401).json({ message: "توکن احراز هویت ارسال نشده است." });
|
||||
}
|
||||
|
||||
const token = authHeader.split(" ")[1];
|
||||
|
||||
try {
|
||||
// بررسی صحت و امضای JWT
|
||||
const decoded: any = jwt.verify(token, process.env.JWT_SECRET!);
|
||||
|
||||
// پیدا کردن یوزر و نقشها از دیتابیس
|
||||
const user = await User.findByPk(decoded.userId, {
|
||||
include: [
|
||||
{
|
||||
model: Role,
|
||||
include: [Permission],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({ message: "کاربر یافت نشد." });
|
||||
}
|
||||
|
||||
// تزریق یوزر در request برای استفادههای بعدی
|
||||
(req as any).user = user;
|
||||
next();
|
||||
} catch (err) {
|
||||
return res.status(401).json({ message: "توکن نامعتبر یا منقضی است." });
|
||||
}
|
||||
}
|
||||
24
src/core/middleware/require-permission.middleware.ts
Normal file
24
src/core/middleware/require-permission.middleware.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { NextFunction } from "express";
|
||||
import { ServerResponse } from "../types";
|
||||
|
||||
export function requirePermission(...permissions: string[]) {
|
||||
return (req: Request, res: ServerResponse, next: NextFunction) => {
|
||||
const user = (req as any).user;
|
||||
if (!user)
|
||||
return res
|
||||
.status(401)
|
||||
.json({ status: 401, data: {}, message: "احراز هویت انجام نشده است." });
|
||||
|
||||
const userPermissions =
|
||||
user.Role?.Permissions?.map((p: any) => p.name) || [];
|
||||
|
||||
const hasPerm = permissions.every((p) => userPermissions.includes(p));
|
||||
if (!hasPerm) {
|
||||
return res
|
||||
.status(403)
|
||||
.json({ status: 403, data: {}, message: "دسترسی شما کافی نیست." });
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
}
|
||||
25
src/core/middleware/require-role.middleware.ts
Normal file
25
src/core/middleware/require-role.middleware.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { NextFunction } from "express";
|
||||
import { ServerResponse } from "../types";
|
||||
|
||||
export function requireRole(...roles: string[]) {
|
||||
return (req: Request, res: ServerResponse, next: NextFunction) => {
|
||||
const user = (req as any).user;
|
||||
if (!user)
|
||||
return res
|
||||
.status(401)
|
||||
.json({ status: 401, data: {}, message: "احراز هویت انجام نشده است." });
|
||||
|
||||
const userRole = user.Role?.name;
|
||||
if (!userRole || !roles.includes(userRole)) {
|
||||
return res
|
||||
.status(403)
|
||||
.json({
|
||||
status: 403,
|
||||
data: {},
|
||||
message: "شما دسترسی لازم برای این عملیات را ندارید.",
|
||||
});
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user