React 路由权限方案
===============
在 React 应用中,对路由进行权限控制是一种常见的需求。以下是两种常见的权限控制方案:页面级粒度和元素级粒度。
1. 页面级粒度
--------
在页面级粒度进行权限控制时,不同的页面有不同的权限要求。当用户尝试访问一个页面时,会检查其是否具有访问该页面的权限。
实现页面级粒度的权限控制通常可以采取以下步骤:
1. 在路由配置文件中,为每个路由组件添加一个表示所需权限的属性,如 `requiresAuth`。
2. 在组件内部,检查当前用户是否具有访问该页面的权限。如果没有权限,则跳转到登录页或显示一个提示信息。
3. 如果用户具有访问权限,则渲染该组件。
例如,在 `routes.js` 文件中,可以这样配置路由:
```jsx
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import HomePage from './components/HomePage';
import LoginPage from './components/LoginPage';
import AdminPage from './components/AdminPage';
import RestrictedPage from './components/RestrictedPage';
const Routes = () => {
  return (
    <Router>
      <Switch>
        <Route path="/login" component={LoginPage} />
        <Route path="/admin" component={AdminPage} requiresAuth />
        <Route path="/restricted" component={RestrictedPage} requiresAuth />
        <Route path="/" component={HomePage} />
      </Switch>
    </Router>
  );
};react router v6 文档
export default Routes;
```
在上面的例子中,`requiresAuth` 属性表示该路由需要用户认证才能访问。在 `AdminPage` 和 `RestrictedPage` 组件中,需要添加检查用户权限的代码。例如:
```jsx
// AdminPage.js
import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
import { isAuthenticated } from './features/auth/selectors';
const AdminPage = () => {
  const isAuthenticated = useSelector(isAuthenticated);
  useEffect(() => {
    if (!isAuthenticated) {
      props.history.push('/login'); // 跳转到登录页
    }
  }, [isAuthenticated]);
  // 组件的其他代码...
};
```
2. 元素级粒度
--------
除了页面级粒度,还可以在元素级粒度进行权限控制。在这种情况下,即使整个页面是公开的,某些元素(如按钮、表单等)也可能需要进行权限控制。这通常用于控制用户只能访问
某些特定功能或数据。
实现元素级粒度的权限控制可以采用以下步骤:
1. 在需要控制的元素上添加一个表示权限的属性,如 `permission`。该属性的值应该与用户角的权限相对应。例如,如果用户角有 "reader" 和 "writer" 两种权限,则可以设置元素的 `permission` 属性为 "reader" 或 "writer"。