permission handling

main
alex 2023-06-23 12:10:34 +02:00
parent 4adff4e0d9
commit 3e74b28f73
4 changed files with 102 additions and 21 deletions

View File

@ -1,14 +1,22 @@
import { Route, Routes } from "react-router-dom";
import Dashboard from "../../Pages/Dashboard";
import GroupTasks from "../../Pages/GroupTasks";
import { Constants } from "../../utils";
import {
Constants,
WebSocketContext,
hasOnePermission,
hasPermission,
} from "../../utils";
import UserProfile from "../../Pages/UserProfile";
import Users from "../../Pages/Users";
import Scanners from "../../Pages/Scanners";
import AdminAreaRoles from "../../Pages/AdminArea/Roles";
import AdminAreaLogs from "../../Pages/AdminArea/Logs";
import AllUsers from "../../Pages/AllUsers";
import { useContext } from "react";
export default function AppRoutes() {
const webSocketContext = useContext(WebSocketContext);
return (
<Routes>
<Route path="/" element={<Dashboard />} />
@ -20,11 +28,28 @@ export default function AppRoutes() {
path={Constants.ROUTE_PATHS.GROUP_TASKS_VIEW + ":paramGroupTaskId"}
element={<GroupTasks isGroupTasksViewModalOpen={true} />}
/>
<Route path="/scanners" element={<Scanners />} />
<Route path="/users" element={<Users />} />
{hasPermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.SCANNER.USE_SCANNERS
) && <Route path="/scanners" element={<Scanners />} />}
<Route path="/users" element={<AllUsers />} />
<Route path="/user-profile" element={<UserProfile />} />
<Route path="/admin-area/roles" element={<AdminAreaRoles />} />
<Route path="/admin-area/logs" element={<AdminAreaLogs />} />
{hasOnePermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.ADMIN_AREA.ROLES.ADD_ROLE,
Constants.PERMISSIONS.ADMIN_AREA.ROLES.UPDATE_ROLE,
Constants.PERMISSIONS.ADMIN_AREA.ROLES.DELETE_ROLE,
Constants.PERMISSIONS.ADMIN_AREA.ROLES.ADD_USER_TO_ROLE
) && <Route path="/admin-area/roles" element={<AdminAreaRoles />} />}
{hasPermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.ADMIN_AREA.LOGS
) && <Route path="/admin-area/logs" element={<AdminAreaLogs />} />}
</Routes>
);
}

View File

@ -13,7 +13,13 @@ import Sider from "antd/es/layout/Sider";
import { useContext, useEffect, useState } from "react";
import { useLocation, useNavigate } from "react-router-dom";
import PropTypes from "prop-types";
import { Constants, MyAvatar, WebSocketContext, getUserId } from "../../utils";
import {
Constants,
MyAvatar,
WebSocketContext,
getUserId,
hasPermission,
} from "../../utils";
export default function SideMenu({ userSession, setUserSession }) {
const location = useLocation();
@ -64,8 +70,9 @@ export default function SideMenu({ userSession, setUserSession }) {
];
if (
webSocketContext.User.Permissions.includes(
Constants.PERMISSIONS.ADMIN_AREA.ADD_ROLE
hasPermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.ADMIN_AREA.ROLES.ADD_ROLE
)
) {
items.push({
@ -91,12 +98,22 @@ export default function SideMenu({ userSession, setUserSession }) {
};
const getSecondMenuItems = () => {
let items = [
{
let items = [];
if (
hasPermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.SCANNER.USE_SCANNERS
)
) {
items.push({
icon: <ScanOutlined />,
label: getCurrentUsedScannerName(),
key: "/scanners",
},
});
}
items.push(
{
icon: (
<Badge
@ -136,8 +153,8 @@ export default function SideMenu({ userSession, setUserSession }) {
}).catch(console.error);
},
key: "/",
},
];
}
);
return items;
};

View File

@ -1,22 +1,24 @@
import { Popconfirm, Popover, Select, Space, Table, notification } from "antd";
import {
Constants,
FormatDatetime,
MyAvatar,
SentMessagesCommands,
WebSocketContext,
getConnectionStatusItem,
hasPermission,
} from "../../utils";
import { useContext, useState } from "react";
import { Link } from "react-router-dom";
export default function Users() {
export default function AllUsers() {
const webSocketContext = useContext(WebSocketContext);
const [selectedRoleId, setSelectedRoleId] = useState("");
const [notificationApi, notificationContextHolder] =
notification.useNotification();
const getTableContent = () => {
return [
let items = [
{
title: "Avatar",
dataIndex: "avatar",
@ -42,7 +44,15 @@ export default function Users() {
dataIndex: "lastOnline",
key: "lastOnline",
},
{
];
if (
hasPermission(
webSocketContext.User.Permissions,
Constants.PERMISSIONS.ALL_USERS.ACTION.CHANGE_ROLE
)
) {
items.push({
title: "Action",
key: "action",
render: (_, record) => (
@ -93,8 +103,10 @@ export default function Users() {
</Popconfirm>
</Space>
),
},
];
});
}
return items;
};
const getTableItems = () => {

View File

@ -41,9 +41,22 @@ export const Constants = {
MAX_AVATAR_SIZE: 5 * 1024 * 1024,
ACCEPTED_FILE_TYPES: ["image/png", "image/jpeg", "image/jpg"],
PERMISSIONS: {
ALL_USERS: {
ACTION: {
CHANGE_ROLE: "all_users.action.change_role",
},
},
SCANNER: {
USE_SCANNERS: "scanner.use_scanners",
},
ADMIN_AREA: {
ADD_ROLE: "admin_area.roles.add_role",
UPDATE_ROLE: "admin_area.roles.update_role",
ROLES: {
ADD_ROLE: "admin_area.roles.add_role",
UPDATE_ROLE: "admin_area.roles.update_role",
DELETE_ROLE: "admin_area.roles.delete_role",
ADD_USER_TO_ROLE: "admin_area.roles.add_user_to_role",
},
LOGS: "admin_area.logs",
},
},
};
@ -954,3 +967,17 @@ export function isEmailValid(email) {
export function CapitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
export function hasPermission(userPermissions, permission) {
return userPermissions.includes(permission);
}
export function hasOnePermission(userPermissions, ...permissions) {
for (const permission of permissions) {
if (userPermissions.includes(permission)) {
return true;
}
}
return false;
}