假设我们有一个使用
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接口的实现来实现,并根据您的方法的@Secured注释扩展
RequestMappingHandlerMapping来构建此结构.
您将需要覆盖RequestMappingHandlerMapping上的“getCustomMethodCondition”方法,并且基于方法和@Secured注释的存在构造您的RequestCondition的自定义实现.当将传入请求与方法进行匹配时,所有信息将被考虑.