|
|
@@ -0,0 +1,108 @@
|
|
|
+import { useCallback, useMemo } from 'react';
|
|
|
+import { useQuery } from '@tanstack/react-query';
|
|
|
+import { useAuth } from './AuthProvider';
|
|
|
+import { authClient } from '@/client/api';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 权限检查Hook
|
|
|
+ * 用于检查当前用户是否拥有特定权限
|
|
|
+ *
|
|
|
+ * 完整的权限检查逻辑:
|
|
|
+ * 1. 管理员角色拥有所有权限
|
|
|
+ * 2. 基于角色权限关联表进行权限验证
|
|
|
+ * 3. 支持权限编码和权限名称两种方式的权限检查
|
|
|
+ */
|
|
|
+export const usePermission = () => {
|
|
|
+ const { user } = useAuth();
|
|
|
+
|
|
|
+ // 获取用户权限列表
|
|
|
+ const { data: permissionData, isLoading, error } = useQuery({
|
|
|
+ queryKey: ['userPermissions', user?.id],
|
|
|
+ queryFn: async () => {
|
|
|
+ if (!user?.id) return [];
|
|
|
+
|
|
|
+ try {
|
|
|
+ const response = await authClient.permissions.$get();
|
|
|
+ if (response.status !== 200) {
|
|
|
+ console.error('获取权限失败:', response.status);
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ const data = await response.json();
|
|
|
+ return data.permissions || [];
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取用户权限失败:', error);
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ enabled: !!user?.id && !!user.roles, // 只在用户已登录且有角色时获取权限
|
|
|
+ staleTime: 5 * 60 * 1000, // 5分钟内缓存有效
|
|
|
+ retry: 1
|
|
|
+ });
|
|
|
+
|
|
|
+ const userPermissions = useMemo(() => permissionData || [], [permissionData]);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查用户是否拥有指定权限编码
|
|
|
+ * @param permissionCode 权限编码(如 'user:manage')
|
|
|
+ * @returns boolean 是否有权限
|
|
|
+ */
|
|
|
+ const hasPermission = useCallback((permissionCode: string) => {
|
|
|
+ if (!user?.roles) return false;
|
|
|
+
|
|
|
+ // 管理员角色拥有所有权限
|
|
|
+ const hasAdminRole = user.roles.some(role => role.name === 'admin');
|
|
|
+ if (hasAdminRole) return true;
|
|
|
+
|
|
|
+ // 基于权限列表进行权限检查
|
|
|
+ return userPermissions.includes(permissionCode);
|
|
|
+ }, [user, userPermissions]);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查用户是否拥有多个权限中的任意一个
|
|
|
+ * @param permissions 权限标识符数组
|
|
|
+ * @returns boolean 是否有任意一个权限
|
|
|
+ */
|
|
|
+ const hasAnyPermission = useCallback((permissions: string[]) => {
|
|
|
+ return permissions.some(permission => hasPermission(permission));
|
|
|
+ }, [hasPermission]);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查用户是否拥有所有指定权限
|
|
|
+ * @param permissions 权限标识符数组
|
|
|
+ * @returns boolean 是否拥有所有权限
|
|
|
+ */
|
|
|
+ const hasAllPermissions = useCallback((permissions: string[]) => {
|
|
|
+ return permissions.every(permission => hasPermission(permission));
|
|
|
+ }, [hasPermission]);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户角色列表
|
|
|
+ * @returns 角色名称数组
|
|
|
+ */
|
|
|
+ const getUserRoles = useCallback(() => {
|
|
|
+ return user?.roles?.map(role => role.name) || [];
|
|
|
+ }, [user]);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查用户是否拥有特定角色
|
|
|
+ * @param roleName 角色名称
|
|
|
+ * @returns boolean 是否拥有该角色
|
|
|
+ */
|
|
|
+ const hasRole = useCallback((roleName: string) => {
|
|
|
+ if (!user?.roles) return false;
|
|
|
+ return user.roles.some(role => role.name === roleName);
|
|
|
+ }, [user]);
|
|
|
+
|
|
|
+ return {
|
|
|
+ hasPermission,
|
|
|
+ hasAnyPermission,
|
|
|
+ hasAllPermissions,
|
|
|
+ hasRole,
|
|
|
+ getUserRoles,
|
|
|
+ roles: user?.roles || [],
|
|
|
+ permissions: userPermissions,
|
|
|
+ isLoadingPermissions: isLoading,
|
|
|
+ permissionsError: error
|
|
|
+ };
|
|
|
+};
|