假设我们有一个使用Spring MVC和Spring Security配置的API端点。我们希望能够处理@RequestMapping和@Secured注释对,其中只有@Secured注释值对之间不同。这样,我们将能够根据同一请求的安全规则返回不同的响应主体。
通过避免直接在方法主体中检查安全规则,这可以使我们的代码更具可维护性。
对于一个不起作用的示例,我们要做的是:
@Controller @RequestMapping("/api") public class Controller { @Secured ({"ROLE_A"}) @RequestMapping(value="{uid}", method=RequestMethod.GET) @ResponseBody public Response getSomething(@PathVariable("uid") String uid) { // Returns something for users having ROLE_A } @Secured ({"ROLE_B"}) @RequestMapping(value="{uid}", method=RequestMethod.GET) @ResponseBody public Response getSomethingDifferent(@PathVariable("uid") String uid) { // Returns something different for users having ROLE_B } }
我们怎样才能做到这一点?如果可以做到这一点:应该如何为同时具有ROLE_A和ROLE_B的用户管理优先级?
假设您将Spring 3.1(或更高版本)与RequestMappingHandlerMapping(和RequestMappingHandlerAdapter)一起使用,则可以扩展请求映射机制。您可以通过创建自己的RequestCondition接口实现并扩展RequestMappingHandlerMapping来实现此方法,以基于方法上的@Secured注释构造此接口。
您将需要在RequestMappingHandlerMapping上覆盖“getCustomMethodCondition”方法,并基于该方法和@Secured注释的存在来构造您的RequestCondition的自定义实现。然后,在将传入请求与方法匹配时,将考虑所有这些信息。