在按下登录按钮并进行身份验证后,我希望应用程序将我定向到所需的页面.但当我按下按钮时,它不会重定向,或者即使我输入了错误的密码,它也会转到所需的页面并返回.因为它还没有被鉴定过.我找不到正确的路.
通过身份验证后,我想转到包含资源列表的页面.此页面的路径为"/".
我在此分享几段代码,以便让您有所了解. 应用程序:
const Layout = ({ children }) => {
return (
<div className="link">
<MiniDrawer>
<Outlet />
</MiniDrawer>
</div>
);
};
const router = createBrowserRouter([
{
path: "/login",
element: <Login />,
},
{
path: "/",
element: (
<AdminGuard>
<Layout />
</AdminGuard>
),
children: [
{
path: "/",
element: <Resources />,
},
{
path: "/create",
element: <CreateResource />,
},
{
path: "/edit/:id",
element: <EditResource />,
},
],
},
]);
function App({ Component }) {
return (
<div className="App">
<RouterProvider router={router} />
</div>
);
}
export default App;
-看这个.
import React from "react";
import { Route, Navigate, Outlet } from "react-router-dom";
import { AuthService } from "../services/auth.services";
const AdminGuard = ({ children }) => {
if (AuthService.isAuthenticated()) {
return children;
} else {
return <Navigate to="/login" />;
}
};
export default AdminGuard;
登录页面:
import { useDispatch } from "react-redux";
import LoginView from "./view";
import { AuthService } from "../../services/auth.services";
function Login() {
const dispatch = useDispatch();
function onSubmit({ username, password }) {
dispatch(AuthService.userLogin({ username, password }));
}
return (
<>
<LoginView onSubmit={onSubmit} />
</>
);
}
export default Login;
身份验证服务:
import { createAsyncThunk } from "@reduxjs/toolkit";
import { axiosApiInstance } from "./axios.services";
import { TokenService } from "./token.service";
export const AuthService = {};
AuthService.userLogin = createAsyncThunk(
"userSlice/userLogin",
async ({ username, password }, { rejectWithValue }) => {
try {
const response = await axiosApiInstance.post(
"https://localhost:7105/api/Connect",
{ username, password },
{
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
username: typeof username === "string" ? username.toString() : "",
password: typeof password === "string" ? password.toString() : "",
}),
}
);
const tokenResponse = { accessToken: response?.data };
TokenService.setToken(tokenResponse);
return tokenResponse;
} catch (error) {
return rejectWithValue(error);
}
}
);
AuthService.isAuthenticated = () => {
return localStorage.getItem("access_token") ? true : false;
};
AuthService.logout = () => {
TokenService.clearToken();
window.location.href = "/login";
};
令牌服务:
export const TokenService = {};
TokenService.setToken = ({ accessToken }) => {
localStorage.setItem("access_token", accessToken);
};
TokenService.clearToken = () => {
localStorage.removeItem("access_token");
};
身份验证切片:
import { useNavigate } from "react-router-dom";
import { AuthService } from "../../services/auth.services";
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
const initialState = {
data: {},
isLoading: false,
hasError: false,
};
const authSlice = createSlice({
name: "authSlice",
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(AuthService.userLogin.pending, (state) => {
state.isLoading = true;
state.hasError = false;
})
.addCase(AuthService.userLogin.fulfilled, (state, { payload }) => {
state.pending = false;
state.data = payload;
})
.addCase(AuthService.userLogin.rejected, (state) => {
state.isLoading = false;
state.hasError = true;
});
},
});
export const selectAuthState = (state) => state.authSlice.data;
export default authSlice.reducer;