【发布时间】:2017-10-04 20:13:27
【问题描述】:
假设应用程序中有两种类型的角色 -
- 管理员
- 区域经理
管理员可以获取所有办公室 ID,而区域经理只能获取其区域下分配的办公室。在控制器中我想要这样的东西
@RequestMapping(method = RequestMethod.GET)
Collection<Long> getOfficeIds(){
// returns all office ids in system
}
@RequestMapping(method = RequestMethod.GET, value = "/{zoneId}")
Collection<Long> getOfficeIds(@RequestParam("zoneId") long zoneId){
// returns all office ids in the zone
}
现在我希望我的所有用户只使用无参数版本(第一种方法)提出请求。系统应该在点击控制器之前获取用户角色,并且应该调用适当的控制器方法(如果管理员调用第一个方法,如果区域经理调用具有适当区域的第二个方法)。
问题是,这有可能吗?如果是,那么最好的方法是什么?我可以尝试在 servlet 过滤器中修改请求。有没有办法使用方法参数解析器?
【问题讨论】:
-
为什么不将获取所有办公室 ID 或区域经理拥有的办公室 ID(如果他们是一个)的逻辑放在第一个方法主体中?您可以通过向在处理之前运行的请求添加过滤器来获取上下文。过滤器将使用帐户上下文填充 ThreadLocal。
-
我记得以前使用过,但我无法再访问该代码库了。此处列出的步骤似乎非常简单:stackoverflow.com/questions/2725102/…
-
Xtreme Biker 的回答基本上就是你会做的(使用你自己计算的 URL,其逻辑显然会在转发之前)。
-
我们使用spring实现过滤器的方式是创建一个扩展OncePerRequest过滤器的bean,例如
@Component("accountContextFilter") public class AccountContextFilter extends OncePerRequestFilter { ... public void doFilterInternal(){ //logic } ... } -
Spring Security 为这种情况提供了解决方案,搜索
@PreAuthorized和@PostAuthorized但在您的情况下,@PreAuthorized似乎是很好的解决方案。
标签: spring methods controller userinfo