【问题标题】:How to get user information after REST authentication on client side?如何在客户端进行 REST 身份验证后获取用户信息?
【发布时间】:2017-03-12 07:09:18
【问题描述】:

我有 Spring REST 后端和 Angular 前端。

使用对“/login”URL 的 POST 请求执行身份验证,其中用户名和密码位于请求 JSON 正文中(我使用基于表单的身份验证)。 REST 后端使用 OK 代码回复。一切都很好,我可以从需要身份验证的前端执行其他请求。

但是前端需要知道经过身份验证的用户的角色是什么,以便它可以显示正确的视图/死记硬背。我们在哪里可以在前端获得这个角色?我们从身份验证中得到的唯一响应是 OK,这对于 REST 来说很好。

我们可以通过对“/users/[user_id]”执行GET请求来获取用户信息。但是我们没有用户 ID,只有用户名。

所以问题是 - REST 从只有用户名的前端获取角色(或其他用户信息)的正确方法是什么?

作为一种解决方法,我可以在使用用户名而不是 id 的后端创建新请求,或者我可以将用户 id 添加到身份验证响应中。但我不确定从 REST 的角度来看这是一种正确的方法。

【问题讨论】:

  • 如果你的后端需要传递一个用户ID来获取当前用户信息,但不允许获取用户ID,那么后端就存在严重的设计问题。您似乎能够发送需要身份验证的请求。这意味着后端能够识别您的身份(可能要归功于 cookie)。如果这是真的,您不需要传递任何参数作为参数,因为它是在 cookie 中隐式传递的。你可以只拥有一个 /current-user 资源。
  • 我正在开发后端和前端。后端遵循 REST 提供用户信息的正确方法是什么?
  • 我刚刚告诉过你。假设后端有一种识别请求的隐式方式(例如,使用 cookie),您可以只提供 /current-user 或 /me 或任何您想命名的资源。例如,请参阅developer.github.com/v3/users/#get-the-authenticated-user
  • 从 REST 的角度来看这会好吗?我不确定“POST /current-user”或“DELETE /current-user”是什么意思。
  • 如果用户名是用户的唯一标识,是的。你的理解是错误的。如果资源是只读的,那么为该资源提供 DELETE 和 POST 方法是没有意义的。您是否注意到 github api 仅使用 /user 来获取经过身份验证的用户?

标签: java angularjs spring rest spring-rest


【解决方案1】:

你不能重写HTTP方法。所以,如果你打算用不同的查询参数编写GET调用,具有相同的路径,那么它是不允许的。你需要编写两个GET路径。

例如

GET /users/userid/{id} GET /users/username/{name}

在第二个调用中,您可以添加所需的逻辑以在第二个调用中获取角色。

【讨论】:

  • 但从 REST 的角度来看,我不确定这是否正确。 “删除/用户/用户名”是什么意思?
  • 如果您不想允许 DELETE,那么就不要为 DELETE 调用编写实现。根据 REST 标准,这是完全可以接受的。
【解决方案2】:

有两种方法。

1) 在从服务器成功认证后,使用用户名再对服务器进行一次$http 调用,您可以从服务器逻辑中获取详细信息,该逻辑获取并存储结果为$rootScope。此信息将是可在整个应用程序中使用。

2) 当您对用户进行身份验证时,如果用户有效,则获取他的详细信息并将其存储在一个对象中。

现在在您的服务器逻辑中返回响应时,您可以像下面那样做

response.setHeaders("User",userDetilsObj);

注意:响应是一个 HttpServletResponse 对象。

按照你说的完成请求后,我们将得到一个状态 OK 响应,即 200。要访问 JS 端的用户详细信息,请按照以下代码进行操作

if(response.status == '200/OK'){
   $rootScope.user = response.getHeaders().User;//In this object all the user details set at server side are available now..
}

希望这能让您了解如何实现您想要的结果。

【讨论】:

  • 谢谢。这两种方法看起来与我在问题中提到的解决方法非常相似。问题是关于另一件事。 JB Nizet 指出,从设计的角度来看,用“/users/:name”端点替换“/users/:id”是可以的,因此可以回答我的问题。
  • 是的,同意,但是你问过哪种方法更好,所以我建议选择第一种更清洁和可维护的方法。
  • 使用 "/users/:name" 不是一种更简洁的方法,因为 ID 将永远保持不变名称可以更改,或者它可以区分大小写,再次需要转换如果你有更多同名用户?您将如何确定哪个已登录?
  • 只需阅读我的问题以及我们与@JBNizet 的讨论,这样您就可以避免重复这个问题和 JBNizet 的话。
【解决方案3】:

在您对用户进行身份验证时从服务器获取用户信息。在成功的用户身份验证时传递用户详细信息。

【讨论】:

    【解决方案4】:

    在与 cmets 中的 @JBNizet 讨论该问题后,我决定将 REST 端点从“/users/:user_id”更改为“/users/:user_name”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多