Spring Security + MVC:相同的@RequestMapping,不同的@Secured

Jul*_*rin 11 java spring spring-mvc spring-security

假设我们有一个使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

我们怎样才能做到这一点?如果可以这样做:如何为同时拥有ROLE_A和ROLE_B的用户管理优先级?

M. *_*num 4

假设您将 Spring 3.1(或更高版本)与 RequestMappingHandlerMapping(和 RequestMappingHandlerAdapter)一起使用,您可以扩展请求映射机制。您可以通过创建自己的RequestCondition接口实现并扩展RequestMappingHandlerMapping以基于方法上的 @Secured 注释来构造此接口来实现此目的。

您需要重写 RequestMappingHandlerMapping 上的“getCustomMethodCondition”方法,并根据该方法和 @Secured 注释的存在来构造 RequestCondition 的自定义实现。然后,在将传入请求与方法进行匹配时,会考虑所有这些信息。

相关答案(虽然不是特定于 @Secured 注解,但机制是相同的)也可以在这里这里找到