当前位置: 首页 > 知识库问答 >
问题:

如果使用JWT,如何保护路线免受客人和角色的影响?

宗政霄
2023-03-14

在服务器端,我有2个中间件——protect(登录了吗?)和restrictTo(检查用户的角色)。如果不允许,这些中间件会阻止用户或访客执行某些操作

exports.protect = catchAsync(async (req, res, next) => {
  let token;

  if (
    req.headers.authorization && req.headers.authorization.startsWith("Bearer")
  ) {
    token = req.headers.authorization.split(" ")[1];
  }

  if (!token) {
    return next(new AppError("You are not signed in!", 401));
  }

  const decodedToken = await promisify(jwt.verify)(
    token,
    process.env.JWT_SECRET
  );

  const currentUser = await User.findById(decodedToken.id);
  if (!currentUser) {
    return next(new AppError("User with such token no longer exists"));
  }

  req.user = currentUser;
  next();
});


exports.restrictTo = (...roles) => {
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return next(new AppError("No access", 403));
    }
    next();
  };
};

但是如何在客户端保护路由呢?如果不允许我发布新消息,那么我应该被阻止进入 /newnote页面,这样我就看不到并填写表单。JWT令牌存储在带有http唯一标志的cookie中。因此我无法从Vue路由器访问令牌。将用户角色存储在Vuex中?那么如何在cookie和Vuex中同步令牌状态?如果我的令牌在服务器端被销毁,我仍然可以将其保存在Vuex中,直到我向受保护的endpoint发送请求。我应该为受保护的路由请求一个特殊的身份验证endpoint,以便使用befor每检查我当前的角色吗?

共有1个答案

汲雅珺
2023-03-14

基本上,您应该添加两件事:

    < li >存储当前认证的用户。默认情况下,authUser为空。当有人登录时,authUser是一个包含用户数据的对象。你可以把它保存在Vuex,localStorage等等。 < li >在您用于api请求的任何库中创建一个拦截器/中间件。如果在某个时候你得到一个401/403,这意味着当前用户的会话已经过期,或者他正在试图访问一个他不应该看到的受保护的区域。无论采用哪种方法,都需要将本地authUser重置为null,并重定向到login。

在Spa/移动设备中,只要您的后端得到适当的保护,您就不必太担心这一点。如果您的 authUser 逻辑正确,那么只有恶意用户才会尝试访问受保护区域,而普通用户将遵守规则,并且永远不会以当前权限访问他们不应该访问的页面(假设 UI 已正确连接......

 类似资料:
  • 要使用注释,必须创建一个包含getters和setters的类: 但这会导致有人试图通过调用以下命令来修改此值: 有没有一种方法可以创建注释类,而不使用setter和外部解析器/读取器类?

  • 我正在用python(2.7)创建一个程序,我想保护它不受逆向工程的影响。

  • 在< code>/users下,我有一些需要身份验证令牌的路由,还有一些不需要。为了实现这一点,我做了以下工作。 然后我按照以下方式安装这些路线。 当我向< code>/users发送POST时,它运行预期的路径,但是当< code>next()被调用时,< code > protected _ middleware 运行。这是因为它在标有“D”的行中找到了下一个< code>/users定义。

  • 我的API应用程序中有此路由: 在postman中,我执行如下api调用: URL用户?令牌=令牌 但这会带来: 如何在postman中使用令牌正确执行api调用?

  • 问题内容: 我试图使用TypeScript 在react-router 文档中创建一个描述。谁能帮我吗? react-router文档中的privateRoute: 以下是我的TypeScript版本(无法使用): 这是不对的。错误是:NodeInvocationException:inst.render不是函数TypeError:inst.render不是函数 问题答案: 该错误可能与打字和渲染

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。