Java REST服务仅返回当前与用户相关的资源

Java REST服务仅返回当前与用户相关的资源,java,spring,rest,spring-mvc,spring-security,Java,Spring,Rest,Spring Mvc,Spring Security,我有一个REST服务,它是使用SpringMVC(RESTController)实现的,具有基于令牌的安全性(使用SpringSecurity)。如何根据用户身份筛选资源?假设用户有一些报告。如何通过调用/reports让授权用户只查看他的报告 显然,我可以将userId设置为请求参数或路径变量,但有些东西告诉我这是一种不好的做法 我假设我可以使用Spring的安全特性来实现这一点,但我究竟如何才能做到这一点,更重要的是,在哪里应用这种过滤最合适?控制器应该执行对传递用户标识的服务的调用,还是应

我有一个REST服务,它是使用SpringMVC(RESTController)实现的,具有基于令牌的安全性(使用SpringSecurity)。如何根据用户身份筛选资源?假设用户有一些报告。如何通过调用/reports让授权用户只查看他的报告

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

我假设我可以使用Spring的安全特性来实现这一点,但我究竟如何才能做到这一点,更重要的是,在哪里应用这种过滤最合适?控制器应该执行对传递用户标识的服务的调用,还是应该以某种方式在存储库级别检索(我使用SpringDataJPA)?
提前感谢

只要用户成功登录,您就拥有了
身份验证
对象。 它包含
对象主体
对象凭证
设置权限

您只需覆盖
UserDetailsService
,为经过身份验证的用户添加新参数。在身份验证中添加您的用户标识,如下所示

现在当你这么做的时候

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 这将返回spring安全性的用户对象。
您可以从此处获取用户id,并在控制器中使用此id执行必要的操作。

每当用户成功登录时,您就拥有了
身份验证
对象。 它包含
对象主体
对象凭证
设置权限

您只需覆盖
UserDetailsService
,为经过身份验证的用户添加新参数。在身份验证中添加您的用户标识,如下所示

现在当你这么做的时候

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 这将返回spring安全性的用户对象。
您可以从这里获取用户id,并在控制器中使用此id执行必要的操作。

您不需要会话,因为前面提到的安全性由rest impl维护,这只是将自定义数据放入令牌的一种方式。谢谢!难道没有更优雅的方式来获取用户信息吗?可能使用一种Spring安全注释?在哪里做这件事是正确的?控制器?你还想看看。是的,这是根据文档在Spring Security中执行的方式。您可以在控制器甚至服务中执行此操作,因为SecurityContextHolder在上下文中是静态的。好吧,基本上我们的想法是在令牌本身中提供所需的用户信息,这样我就可以让我的REST服务完全无状态?是的,您是对的,因为它是无状态的,您的令牌应该能够提供您需要在服务器端进行处理的信息。您不需要会话,因为前面提到的安全性由rest impl维护,这只是将自定义数据放入令牌的一种方式。谢谢!难道没有更优雅的方式来获取用户信息吗?可能使用一种Spring安全注释?在哪里做这件事是正确的?控制器?你还想看看。是的,这是根据文档在Spring Security中执行的方式。您可以在控制器甚至服务中执行此操作,因为SecurityContextHolder在上下文中是静态的。好吧,基本上我们的想法是在令牌本身中提供所需的用户信息,这样我就可以让我的REST服务完全无状态?是的,您是对的,因为它是无状态的,您的令牌应该能够提供您需要在服务器端进行处理的信息