-
-
Notifications
You must be signed in to change notification settings - Fork 8.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
V6服务器获取菜单并配置权限,刷新后出现403🐛 [BUG] #10827
Comments
我也遇到了同样的问题,进入有权限的页面,刷新页面,发现不会重新触发 request 去获取菜单信息导致 403 了 |
问题描述: 在Ant Design Pro v6中,使用V6服务器从服务端获取菜单并配置权限。第一次登录后,菜单和权限都正常,但是在刷新页面或退出登录后重新登录时,重定向到有权限的页面时出现403错误。 解决方案: 问题的根本原因是刷新页面或重新登录时,没有重新触发request去获取菜单信息。可以通过以下方式解决:
import { getMenuList } from './services/menu'; // 假设菜单服务的请求方法为getMenuList
async function fetchMenu() {
try {
const response = await getMenuList();
const { data } = response;
return data;
} catch (error) {
console.error('Failed to fetch menu data:', error);
throw error;
}
}
// 将fetchMenu导出
export { fetchMenu };
import { fetchMenu } from './access'; // 引入fetchMenu函数
export async function getInitialState(fetchMenu) {
// ...
// 在if (location.pathname !== loginPath) {}代码块中获取菜单数据
if (location.pathname !== loginPath) {
const currentUser = await fetchUserInfo();
const userRoutes: any[] = [];
// 获取菜单数据
const menuData = await fetchMenu();
return {
fetchUserInfo,
userRoutes,
currentUser,
settings: defaultSettings as Partial<LayoutSettings>,
menuData, // 将菜单数据添加到initialState中
};
}
return {
fetchUserInfo,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
// ...
menu: {
params: {
userid: initialState?.currentUser?.userid,
},
request: async (params, defaultMenuData) => {
if (params.userid) {
// 使用initialState中的菜单数据
const menuData = initialState.menuData || [];
const fixMenuData = FixMenultemlcon(menuData);
setInitialState({ ...initialState, userRoutes: fixMenuData });
return fixMenuData;
}
return [];
},
},
// ...
} 通过上述修改,每次刷新页面或重新登录时,都会重新触发 这里假设 相关文档: |
对于这个问题,可能是因为刷新页面或重新登录时,用户权限未正确更新导致的。你可以尝试以下解决方案:
在 你可以通过在 export async function getInitialState(): Promise<{
settings?: Partial<LayoutSettings>;
currentUser?: API.CurrentUser;
loading?: boolean;
fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
userRoutes?: API.MenuRouteItem[];
}> {
const fetchUserInfo = async () => {
try {
const msg = await queryCurrentUser({
skipErrorHandler: true,
});
const currentUser = msg.data;
// 根据当前用户获取权限
const { data: userRoutes } = await getPermission(currentUser.userid);
return { currentUser, userRoutes };
} catch (error) {
history.push(loginPath);
}
return undefined;
};
// 如果不是登录页面,执行
const { location } = history;
if (location.pathname !== loginPath) {
const { currentUser, userRoutes } = await fetchUserInfo();
return {
fetchUserInfo,
currentUser,
userRoutes,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
return {
fetchUserInfo,
settings: defaultSettings as Partial<LayoutSettings>,
};
} 这样,每次刷新页面或重新登录后,都会重新获取用户权限信息并更新
在 请检查以下几点:
你可以在 另外,可以根据具体的需求,调整权限校验逻辑。例如,对于管理员角色( 希望以上解决方案对你有帮助。如果问题仍然存在,请提供更多信息以便我们进一步分析和解决。 |
遇到同样的问题,在一个有权限的页面F5刷新会先进暂无全线页。查看access逻辑,console输出在没有获取到menu的时候返回的是false,获取菜单以后返回了true,但是还是渲染403页。打开后进入菜单就都正常了 |
layout 上面加个 |
你的这个逻辑有问题,递归不能这么写,canAccess 初始传进去的 |
🐛 bug 描述
菜单通过服务端获取,本地routes.ts中配置了所有菜单,并结合access.ts配置了对应菜单的权限,第一次user登录后菜单和权限都正常,通过浏览器输入没权限路由提示403,bug来袭
🏞 期望结果 | Expected results
刷新页面或者退出后重登账号重定向到页面不提示403
💻 复现代码 | Recurrence code
线上代码:https://codesandbox.io/p/github/africa1207/ant-design-pro-v6/dev
核心代码内容如下
© 版本信息
🚑 其他信息
The text was updated successfully, but these errors were encountered: