1

假设我有一个@Controller,它有两种方法可以做相关但不同的事情。我想在同一个 URL 端点上公开它们,但根据安全上下文具有不同的功能。现在我知道我可以有一个映射的请求方法并分派到我的类中的不同实用程序函数,但是我可以连接它以便 Spring MVC 将根据进来的内容为我处理分派吗?

作为一个稻草人的例子,有代码在 ROLE_ADMIN 和 ROLE_USER 之间分派,但我的实际用例要复杂得多:

@Controller
public class Controller {

    @RequestMapping("/api/thing")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String doAnAdministrativeThing() {
         ... (admin-priviledge stuff goes here)
    }

    @RequestMapping("/api/thing")
    @PreAuthorize("hasRole('ROLE_USER')")
    public String doADifferentThing() {
         ... (normal-priviledged stuff goes here)
    }

}

抢占任何兔子洞:

  1. 不,我可能没有任何选择让这两个函数位于不同的 URL 或具有不同的参数或任何“正常”@RequestMapping 位

  2. 安全上下文差异很复杂,但可以在 @PreAuthorize 表达式中处理

  3. 实际上有两个以上不同的上下文可以调度

4

2 回答 2

2

这将适用于一些扩展。请参阅@andy 对Can Spring Security 在 Spring 控制器方法上使用 @PreAuthorize的回答中对GitHub mohchi / spring-security-request-mapping的引用?

于 2013-02-08T21:53:49.693 回答
2

我认为这行不通,全局方法安全与 MVC 层完全无关。此外,官方建议仅对服务层使用方法安全性

通常,我们建议在服务层而不是在单个 Web 控制器上应用方法安全性。

PS 通常我尽量避免将 AOP 与 Spring 控制器一起使用,并且仅在根上下文(而不是 servlet 上下文)中声明 AOP 方法,因为代理控制器实例会导致一些令人困惑的行为,并迫使用户了解 Spring AOP 特定诸如 JDK 代理和 CGLIB 代理之间的区别、注释的处理方式等。

于 2013-02-07T20:03:52.473 回答