【问题标题】:REST service to return only current user-related resourcesREST 服务仅返回当前用户相关资源
【发布时间】:2016-11-27 17:36:54
【问题描述】:

我有一个使用 Spring MVC (RestControllers) 实现的 REST 服务,该服务具有基于令牌的安全性(使用 Spring Security)。如何根据用户身份过滤资源?假设用户有一些报告。如何通过调用 /reports 让授权用户仅查看他的报告?

显然我可以让 userId 成为请求参数或路径变量,但有些东西告诉我这是一种不好的做法。

我假设我可以使用 Spring Security 功能实现这一点,但我究竟如何才能做到这一点,更重要的是,应用此类过滤的最合适位置在哪里?控制器应该执行对传递用户身份的服务的调用,还是应该在存储库级别以某种方式检索它(我使用 Spring Data JPA)? 提前致谢

【问题讨论】:

    标签: java spring rest spring-mvc spring-security


    【解决方案1】:

    只要用户成功登录,您就有Authentication 对象。 它包含Object principalObject credentialsSet authorities

    您需要做的就是覆盖UserDetailsService 为您的认证用户添加新参数。在身份验证中添加您的 userId 为 shown in blog

    当你这样做时

    SecurityContextHolder.getContext().getAuthentication().getPrincipal() 这将返回 Spring Security 的 User 对象。 您可以从这里获取用户 ID,并在控制器中使用它来执行必要的操作。

    【讨论】:

    • 您不需要会话,因为已经提到安全性由 rest impl 维护,这只是将自定义数据放入令牌的一种方式。
    • 谢谢!难道没有更优雅的方式来获取用户信息吗?也许使用 Spring Security 注释之一?正确的地方在哪里?控制器?
    • 你也想看看Json Web Tokens。是的,这是根据文档在 Spring Security 中执行的方法。您可以在控制器甚至服务中执行此操作,因为 SecurityContextHolder 在上下文中是静态的。
    • 好的,所以基本上这个想法是在令牌本身中提供所需的用户信息,所以我可以让我的 REST 服务完全无状态?
    • 是的,你是对的,因为它是无状态的,你的令牌应该能够提供你需要在服务器端进行处理的信息
    猜你喜欢
    • 2020-05-24
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2014-01-05
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多