【问题标题】:Spring calling controller method based on user informationSpring根据用户信息调用控制器方法
【发布时间】:2017-10-04 20:13:27
【问题描述】:

假设应用程序中有两种类型的角色 -

  1. 管理员
  2. 区域经理

管理员可以获取所有办公室 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


【解决方案1】:

每个 cmets,我在下面发布答案。

实现目标的最佳方法是添加一个过滤器,该过滤器在控制器处理请求之前运行。在此过滤器中,您可以应用适当的逻辑来确定请求用户的角色并采取相应的行动。如果您在所有控制器中遵循相同的 URL 模式来处理这些不同的情况,您可以在确定应用哪种情况后简单地重写内部 URL,以便可以由适当的控制器处理。通过这种方式,您可以将所有用户角色逻辑保存在一个位置,并且您的控制器逻辑可以相应地处理它们自己的独立流程。

要使用 spring 创建这样的过滤器,您可以执行以下操作:

@Component("accountContextFilter") public class AccountContextFilter extends OncePerRequestFilter { 

    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException{
        //user role and routing logic
    }
}

doFilterInternal 内部的逻辑参考可以在这里找到:How to use a servlet filter in Java to change an incoming servlet request url?

只需通过使用角色定义的 URL 附加到您的路由来相应地更改请求路径即可。

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 2013-01-20
    • 1970-01-01
    • 2015-09-12
    • 2019-02-01
    • 2015-03-05
    • 2016-07-19
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多