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:
hosseintaromi 2025-07-22 00:01:53 +03:30
parent bdfbef91ac
commit d06135824d
5 changed files with 11 additions and 13 deletions

View File

@ -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);
}; };

View File

@ -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)
); );

View File

@ -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");
}; };

View File

@ -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;
} }
} }

View File

@ -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;
} }