如何按角色剥夺 React 中的路由
How to deprive routes in React by role
我有 2 条路线,每条路线都针对一种类型的用户,我该如何做,我已经有了我的授权,但我不知道该怎么做。如果有人知道或看过这方面的任何文档,请把它放在下面,我整天都在找这个
import React, { createContext, useState, useEffect } from 'react'
import { useNavigate } from "react-router-dom";
import axios from '../services/api';
export const AuthContext = createContext()
export const AuthProvider = ({ children }) => {
const navigate = useNavigate();
const [user, setUser] = useState()
const [loading, setLoading] = useState(true)
useEffect(() => {
const recoveredUser = localStorage.getItem('user')
if (recoveredUser) {
const jsonUser = JSON.parse(recoveredUser)
axios.defaults.headers.common['Authorization'] = `Bearer ${jsonUser.token}`;
setUser(jsonUser)
navigate('/user')
}
setLoading(false)
}, [])
const login = (data) => {
if (data) {
localStorage.setItem('user', JSON.stringify(data))
setUser(data)
navigate('/user')
}
}
const logout = () => {
localStorage.removeItem('user')
setUser("")
navigate('/login')
}
return (
<AuthContext.Provider value={{ authenticated: !!user, user, loading, login, logout }}>
{children}
</AuthContext.Provider>
)
}
Kent C Dodds 有一篇关于此的非常好的文章以及我在我的应用程序中遵循的内容。
https://kentcdodds.com/blog/authentication-in-react-applications
因为您的 user
在您的上下文中,所以您可以检查您的路线在哪里呈现。
import { Routes } from 'react-router-dom'
import { useAuth } from './context/auth'
function App() {
const { user } = useAuth();
return user ? <AuthenticatedApp /> : <UnauthenticatedApp />
}
function AuthenticatedApp () {
return (
<Routes>
// all your authenticated routes
</Routes>
)
}
function UnauthenticatedApp () {
return (
<Routes>
// all your un authenticated routes
</Routes>
)
}
在我的示例中,我创建了一个 useAuth()
挂钩,您必须在文件中执行该挂钩。
function useAuth() {
const context = useContext(AuthContext);
return context;
}
export { useAuth };
我有 2 条路线,每条路线都针对一种类型的用户,我该如何做,我已经有了我的授权,但我不知道该怎么做。如果有人知道或看过这方面的任何文档,请把它放在下面,我整天都在找这个
import React, { createContext, useState, useEffect } from 'react'
import { useNavigate } from "react-router-dom";
import axios from '../services/api';
export const AuthContext = createContext()
export const AuthProvider = ({ children }) => {
const navigate = useNavigate();
const [user, setUser] = useState()
const [loading, setLoading] = useState(true)
useEffect(() => {
const recoveredUser = localStorage.getItem('user')
if (recoveredUser) {
const jsonUser = JSON.parse(recoveredUser)
axios.defaults.headers.common['Authorization'] = `Bearer ${jsonUser.token}`;
setUser(jsonUser)
navigate('/user')
}
setLoading(false)
}, [])
const login = (data) => {
if (data) {
localStorage.setItem('user', JSON.stringify(data))
setUser(data)
navigate('/user')
}
}
const logout = () => {
localStorage.removeItem('user')
setUser("")
navigate('/login')
}
return (
<AuthContext.Provider value={{ authenticated: !!user, user, loading, login, logout }}>
{children}
</AuthContext.Provider>
)
}
Kent C Dodds 有一篇关于此的非常好的文章以及我在我的应用程序中遵循的内容。 https://kentcdodds.com/blog/authentication-in-react-applications
因为您的 user
在您的上下文中,所以您可以检查您的路线在哪里呈现。
import { Routes } from 'react-router-dom'
import { useAuth } from './context/auth'
function App() {
const { user } = useAuth();
return user ? <AuthenticatedApp /> : <UnauthenticatedApp />
}
function AuthenticatedApp () {
return (
<Routes>
// all your authenticated routes
</Routes>
)
}
function UnauthenticatedApp () {
return (
<Routes>
// all your un authenticated routes
</Routes>
)
}
在我的示例中,我创建了一个 useAuth()
挂钩,您必须在文件中执行该挂钩。
function useAuth() {
const context = useContext(AuthContext);
return context;
}
export { useAuth };