Spring Security + MVC:相同的@RequestMapping,不同的@Secured
问题内容:
假设我们有一个使用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的自定义实现。然后,在将传入请求与方法匹配时,将考虑所有这些信息。