react实现不同用户角色可访问不同的页面(路由权限管理)

需求:

可制定不同的角色以及对应角色可以访问的页面

实现:

1.登录后根据用户角色字段获取该角色能够访问的页面路径
2.将能够访问的路径存储到全局(这里用的是localstorage)
3.在涉及权限的路由下使用自定义路由组件PrivateRoute代替Route(关于某一菜单/路径是否是需要权限的页面,可以在配置菜单数组的时候新增一个字段,值为true/false对应是否需要权限)

自定义私有路由组件
/**
 * 涉及权限的路由展示配置
 * 有权限访问/view/profile则有权限访问/view,有权限访问/view不一定能访问/view/profile
 */
import React from "react";
import { Route, withRouter, RouteComponentProps } from "react-router-dom";
interface PrivateRouteProps extends RouteComponentProps {
  exact?: boolean; //Route组件的exact属性
  path: string; //路由路径
  component: React.ComponentType; //有访问权限时展示的组件
  noPermissionComponent?: React.ComponentType; //没有访问权限时展示的组件
}
interface PrivateRouteStates {
  authMenu: any[];
}
class PrivateRoute extends React.Component<
  PrivateRouteProps,
  PrivateRouteStates
> {
  constructor(props) {
    super(props);
    const authMen = window.sessionStorage.getItem("authMenu");
    this.state = {
      authMenu: JSON.parse(authMen) || []
    };
  }
  //减少不必要的更新
  // shouldComponentUpdate(nextProps) {
  //可能存在/view/sysMng/web/portal/:catalogue形式的路径,所以不能通过此方法判断路由是否变化
  //   // return nextProps.path !== this.props.path
  // }
  render() {
    //为了用户在加入购物车时登录后可以获得最新的权限信息,故不将authMenu放在state中
    const authMenu =
      JSON.parse(window.sessionStorage.getItem("authMenu")) || [];
    let accessible = authMenu.find(authpath => {
      return authpath.includes(this.props.path);
    });
    if (!accessible && this.props.path.includes("/:")) {
      accessible = authMenu.find(authpath => {
        return authpath.includes(this.props.location.pathname);
      });
    }
    const { exact, path, component, noPermissionComponent } = this.props;
    return accessible ? (
      <Route path={path} component={component} exact={exact} />
    ) : (
      <Route
        path={path}
        component={noPermissionComponent ? noPermissionComponent : NoPermission}
        exact={exact}
      />
    );
  }
}
class NoPermission extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div
        style={{ textAlign: "center", padding: "0.3rem", fontSize: "0.2rem" }}
      >
        您暂时没有权限访问此页面,如果您还未登录,请先登录;如果您已登录,可联系管理员设置权限
      </div>
    );
  }
}
export default withRouter(PrivateRoute);


私有路由的使用:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React实现权限角色路由可以通过以下步骤来完成: 1. 首先,你需要定义一个权限配置文件,该文件包含了每个路由对应的权限信息。例如,你可以创建一个名为`routes.js`的文件,并在其中定义路由权限的映射关系。 2. 在你的应用程序的根组件中,你需要使用React Router来设置路由。你可以使用`<Route>`组件来定义每个路由,并使用`<Switch>`组件来确保只有一个路由被渲染。 3. 在每个路由组件中,你可以使用`hasPermission`函数来检查当前用户是否有权限访问路由。如果用户权限,你可以渲染对应的组件;如果用户没有权限,你可以渲染一个提示组件。 下面是一个示例代码,演示了如何在React实现权限角色路由: ```javascript // routes.js const routes = [ { path: '/dashboard', component: Dashboard, auth: ['admin', 'user'] // 只有admin和user角色可以访问 }, { path: '/profile', component: Profile, auth: ['admin', 'user'] // 只有admin和user角色可以访问 }, { path: '/settings', component: Settings, auth: ['admin'] // 只有admin角色可以访问 }, { path: '/login', component: Login, auth: [] // 不需要权限就能访问 } ]; // App.js import { Route, Switch, Redirect } from 'react-router-dom'; const hasPermission = (auth, userRoles) => { if (auth.length === 0) { return true; // 不需要权限就能访问 } return userRoles.some(role => auth.includes(role)); // 检查用户角色是否包含在权限列表中 }; const App = () => { const userRoles = ['admin']; // 当前用户角色 return ( <Switch> {routes.map(route => ( <Route key={route.path} path={route.path} render={() => hasPermission(route.auth, userRoles) ? ( <route.component /> ) : ( <UnauthorizedComponent /> ) } /> ))} <Redirect to="/login" /> // 默认重定向到登录页面 </Switch> ); }; ``` 这样,当用户访问某个路由时,系统会根据用户角色路由权限配置来判断是否有权限访问。如果有权限,会渲染对应的组件;如果没有权限,会渲染一个未授权的提示组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值