2016-07-24 40 views
0

我有一个使用Spring MVC(RestControllers)和基于令牌的安全性(使用Spring Security)实现的REST服务。我如何根据用户身份过滤资源?假设用户有一些报告。我如何让授权用户通过拨打电话/报告只能看到他的报告?REST服务只返回当前用户相关资源

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

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

回答

0

你有Authentication对象每当用户成功登录。 它包含Object principalObject credentialsSet authorities

您只需要覆盖UserDetailsService即可为您的已验证用户添加新参数。在身份验证添加您的userid shown in blog

现在,当你做

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

+0

您不需要会话,因为已经提到安全性是由rest impl维护的,这只是一种将自定义数据添加到令牌的方法。 –

+0

谢谢!没有更优雅的方式来获取用户信息吗?使用Spring Security注释之一可能?哪里可以做到这一点?控制器? – underscore

+0

你也想看看[Json Web Tokens](https://jwt.io/)。是的,这是Spring Security根据文档所做的。因为SecurityContextHolder在上下文中是静态的,所以你可以在控制器甚至服务中执行它。 –