【发布时间】:2013-08-02 11:25:02
【问题描述】:
假设我们有一个使用 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 的用户管理优先级?
【问题讨论】:
-
这种方法是不可能的,因为它是相同的 URL 映射。这将导致模棱两可的映射错误。尝试为每个用户构建不同的 URL 或接受这两个方法权限并在其中进行角色登录。您可以检索
SecurityContextHolder上的权限 -
这可以使用自定义请求条件。该问题似乎与stackoverflow.com/questions/10073695/… 重复
-
-
@Rob Winch 我不认为这是重复的,因为我询问了如何使用 @ Secured 注释进行操作,但感谢您的建议。
-
在这里查看接受的答案stackoverflow.com/questions/10312177/…。尽管它在技术上并不能准确回答您的问题 - 使用预先存在的注释一起工作,它应该会有所帮助。
标签: java spring spring-mvc spring-security