一尘不染

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

spring-mvc

假设我们有一个使用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的用户管理优先级?


阅读 400

收藏
2020-06-01

共1个答案

一尘不染

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

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

2020-06-01