reactjs - 授权路线被按钮覆盖(React)
问题描述
我正在制作一个基本网站,在其中实现了基本的身份验证路线。这将获得令牌,如果用户拥有令牌,则允许他们访问他们想要的页面。这如下所示。
const AuthRoute = ({ component: Component }) => (
<Route
render={props =>
token && token !== undefined ? <Component /> : <Redirect to="/" />
}
/>
);
然后在我的 app.js 中使用它(我所有的反应路由器路由都完成了)。
<AuthRoute
exact
path="/admin-center-view-users"
component={AdminCenterViewUsers}
/>
所以本质上是说如果他们有令牌(它是我从我的快递后端分配给他们的一个 json Web 令牌)允许他们访问这条路线。这很好用,但是我正在使用我的按钮,这似乎完全忽略了我已经实现的这条路线。
这就是我完成按钮路由的方式。无论这条路线如何,这都会将它们带到页面。
<Link to="/RouteImNotAllowedToBe"> Sign Up </Link>
解决这个问题的合乎逻辑的方法是什么?可以用链接标签做类似的事情吗?
编辑
快递后台
app.post("/login", async (req, response) => {
try {
await sql.connect(config);
var request = new sql.Request();
var Email = req.body.email;
var Password = req.body.password;
var AccountValidationMessage = "";
var LastLogin = req.body.date;
let token = "";
let adminToken = "";
console.log({ Email, Password });
request.input("Email", sql.VarChar, Email);
let result = await request.execute("dbo.CheckEmailExists");
if (result.recordsets[0].length > 0) {
console.info("This email exists");
request.input("Password", sql.VarChar, Password);
let result = await request.execute("dbo.LoginUser");
if (result.recordsets[0].length > 0) {
console.info("/login: login successful..");
console.log(req.body);
request.input("LastLogin", sql.DateTime, LastLogin);
await request.execute("dbo.AddLastLoginToRegisteredUsers");
let result = await request.execute("dbo.FindAdmin");
if (result.recordsets[0].length > 0) {
console.info("This is a admin account");
adminToken = jwt.sign({ user: Email }, "SECRET_KEY", {
//////
expiresIn: 3600000 ////////
});
} else {
console.info("this aint a admin account but you get a login token"); //////
token = jwt.sign({ user: Email }, "SECRET_KEY", {
//////
expiresIn: 3600000 ////////
});
}
var decoded = jwt.verify(adminToken, "SECRET_KEY");
console.log(decoded);
response.status(200).json({
ok: true,
user: Email,
jwt: token,
adminJwt: adminToken
});
} else {
console.info("Incorrect Password");
AccountValidationMessage = "Incorrecrt password to account";
response.status(409).json({
AccountValidationMessage: AccountValidationMessage
});
}
} else {
console.log("Email does not exists");
AccountValidationMessage = "Email does not exists";
response.status(409).json({
AccountValidationMessage: AccountValidationMessage
});
}
} catch (err) {
console.log("Err: ", err);
response.status(500).send("Check api console.log for the error");
}
});
分配 jwt 的示例
handleSubmit(e) {
e.preventDefault();
if (this.state.email.length < 8 || this.state.password.length < 8) {
alert(`please enter the form correctly `);
} else {
var today = new Date(),
date = `${today.getUTCFullYear()}-${today.getUTCMonth() +
1}-${today.getUTCDate()} ${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}.${today.getMilliseconds()} `;
const data = {
email: this.state.email,
password: this.state.password,
date
};
console.log(date);
fetch("/login", {
method: "POST", // or 'PUT'
headers: {
Accept: "application/json,",
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(response => {
console.log("response before it is broken down " + response);
return response.json();
})
.then(({ adminJwt, jwt, user, AccountValidationMessage }) => {
console.log(
"after it is broken down",
jwt,
adminJwt,
user,
AccountValidationMessage
);
window.localStorage.removeItem("registerToken");
window.localStorage.removeItem("resetToken");
if (jwt && user) {
window.localStorage.setItem("myToken", jwt);
window.localStorage.setItem("User", user);
} else if (adminJwt && user) {
window.localStorage.removeItem("myToken");
window.localStorage.setItem("adminToken", adminJwt);
window.localStorage.setItem("User", user);
}
if (AccountValidationMessage) {
alert(AccountValidationMessage);
}
})
.catch(error => {
console.error("Error:", error);
});
}
}
解决方案
您正在传递 path/exact 道具,但它们没有在您的 AuthRoute 组件中使用,您可以使用 rest 运算符来解决这个问题。您还需要向组件添加道具,以防将来的路线可能需要它。
const AuthRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
token && token !== undefined ? <Component {...props} /> : <Redirect to="/" />
}
/>
);
推荐阅读
- c# - 委托对 NULL 的引用
- ios - 使用 firebase 获取数据
- r - 将 ... 的 R 函数转换为字符串
- reactjs - 如何在 Heroku 上的 React App 中访问 $PORT 环境变量
- type-conversion - MariaDB CAST OR CONVERT 功能不起作用
- javascript - 拉到刷新和 setState 不起作用 - React Native
- jquery - 添加行点击功能后表格行中的按钮不起作用
- javascript - 当我单击页面上的其他任何位置时,我希望我的手风琴关闭
- perl - Perl:匹配一个大数组
- javascript - Visual Studio 2019 MVC 视图中的 Typescript/Javascript Intellisense