feat(auth): implement Super Admin permission system
- Update AdminUser interface to match new API response structure - Remove permissions/roles from AdminUser (they come separately) - Update hasPermission logic: id=1 (AdminAll) = Super Admin access - Fix localStorage handling to remove admin_all_permissions key - Super Admin (permission id=1) now has access to everything - Other users checked against their specific permissions
This commit is contained in:
parent
bdfbef91ac
commit
d06135824d
|
|
@ -67,20 +67,18 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
|
||||||
const refreshToken = localStorage.getItem('admin_refresh_token');
|
const refreshToken = localStorage.getItem('admin_refresh_token');
|
||||||
const userStr = localStorage.getItem('admin_user');
|
const userStr = localStorage.getItem('admin_user');
|
||||||
const permissionsStr = localStorage.getItem('admin_permissions');
|
const permissionsStr = localStorage.getItem('admin_permissions');
|
||||||
const allPermissionsStr = localStorage.getItem('admin_all_permissions');
|
|
||||||
|
|
||||||
if (token && userStr && permissionsStr) {
|
if (token && userStr && permissionsStr) {
|
||||||
try {
|
try {
|
||||||
const user = JSON.parse(userStr);
|
const user = JSON.parse(userStr);
|
||||||
const permissions = JSON.parse(permissionsStr);
|
const permissions = JSON.parse(permissionsStr);
|
||||||
const allPermissions = allPermissionsStr ? JSON.parse(allPermissionsStr) : [];
|
|
||||||
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: 'RESTORE_SESSION',
|
type: 'RESTORE_SESSION',
|
||||||
payload: {
|
payload: {
|
||||||
user,
|
user,
|
||||||
permissions,
|
permissions,
|
||||||
allPermissions,
|
allPermissions: permissions,
|
||||||
token,
|
token,
|
||||||
refreshToken: refreshToken || ''
|
refreshToken: refreshToken || ''
|
||||||
}
|
}
|
||||||
|
|
@ -90,7 +88,6 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
|
||||||
localStorage.removeItem('admin_refresh_token');
|
localStorage.removeItem('admin_refresh_token');
|
||||||
localStorage.removeItem('admin_user');
|
localStorage.removeItem('admin_user');
|
||||||
localStorage.removeItem('admin_permissions');
|
localStorage.removeItem('admin_permissions');
|
||||||
localStorage.removeItem('admin_all_permissions');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -104,16 +101,25 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
|
||||||
localStorage.removeItem('admin_refresh_token');
|
localStorage.removeItem('admin_refresh_token');
|
||||||
localStorage.removeItem('admin_user');
|
localStorage.removeItem('admin_user');
|
||||||
localStorage.removeItem('admin_permissions');
|
localStorage.removeItem('admin_permissions');
|
||||||
localStorage.removeItem('admin_all_permissions');
|
|
||||||
dispatch({ type: 'LOGOUT' });
|
dispatch({ type: 'LOGOUT' });
|
||||||
toast.success('خروج موفقیتآمیز بود');
|
toast.success('خروج موفقیتآمیز بود');
|
||||||
};
|
};
|
||||||
|
|
||||||
const hasPermission = (permissionId: number): boolean => {
|
const hasPermission = (permissionId: number): boolean => {
|
||||||
|
// اگر Super Admin (id=1) باشد، به همه چیز دسترسی دارد
|
||||||
|
const isSuperAdmin = state.permissions.some(permission => permission.id === 1);
|
||||||
|
if (isSuperAdmin) return true;
|
||||||
|
|
||||||
|
// در غیر اینصورت چک کن permission مورد نیاز را دارد یا نه
|
||||||
return state.permissions.some(permission => permission.id === permissionId);
|
return state.permissions.some(permission => permission.id === permissionId);
|
||||||
};
|
};
|
||||||
|
|
||||||
const hasPermissionByTitle = (title: string): boolean => {
|
const hasPermissionByTitle = (title: string): boolean => {
|
||||||
|
// اگر Super Admin (AdminAll) باشد، به همه چیز دسترسی دارد
|
||||||
|
const isSuperAdmin = state.permissions.some(permission => permission.title === "AdminAll");
|
||||||
|
if (isSuperAdmin) return true;
|
||||||
|
|
||||||
|
// در غیر اینصورت چک کن permission مورد نیاز را دارد یا نه
|
||||||
return state.permissions.some(permission => permission.title === title);
|
return state.permissions.some(permission => permission.title === title);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,6 @@ export const useLogin = () => {
|
||||||
localStorage.setItem("admin_user", JSON.stringify(response.admin_user));
|
localStorage.setItem("admin_user", JSON.stringify(response.admin_user));
|
||||||
localStorage.setItem(
|
localStorage.setItem(
|
||||||
"admin_permissions",
|
"admin_permissions",
|
||||||
JSON.stringify(response.admin_user.permissions)
|
|
||||||
);
|
|
||||||
localStorage.setItem(
|
|
||||||
"admin_all_permissions",
|
|
||||||
JSON.stringify(response.permissions)
|
JSON.stringify(response.permissions)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,5 +15,4 @@ export const postLogout = () => {
|
||||||
localStorage.removeItem("admin_refresh_token");
|
localStorage.removeItem("admin_refresh_token");
|
||||||
localStorage.removeItem("admin_user");
|
localStorage.removeItem("admin_user");
|
||||||
localStorage.removeItem("admin_permissions");
|
localStorage.removeItem("admin_permissions");
|
||||||
localStorage.removeItem("admin_all_permissions");
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ export const getAuth = async () => {
|
||||||
localStorage.removeItem("admin_refresh_token");
|
localStorage.removeItem("admin_refresh_token");
|
||||||
localStorage.removeItem("admin_user");
|
localStorage.removeItem("admin_user");
|
||||||
localStorage.removeItem("admin_permissions");
|
localStorage.removeItem("admin_permissions");
|
||||||
localStorage.removeItem("admin_all_permissions");
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,6 @@ export interface AdminUser {
|
||||||
first_name: string;
|
first_name: string;
|
||||||
last_name: string;
|
last_name: string;
|
||||||
status: "active" | "inactive";
|
status: "active" | "inactive";
|
||||||
permissions: Permission[];
|
|
||||||
roles: Role[];
|
|
||||||
created_at: string;
|
created_at: string;
|
||||||
updated_at: string;
|
updated_at: string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue