4

是否可以执行以下操作:

public void doStuff(@RequirePrivilege("foo") User user) {
    // ...
}

并让它像下面这样有效地运行?

public void doStuff(User user) {
    if(!user.hasPrivilege("foo"))
        throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
    // ...
}

我知道 Spring 有各种 AOP 支持,但我能找到的最好的是 AOP 代码,它经过注释,以便在特定方法之前或之后执行。我想做相反的事情并注释应该更改的代码。

最终,我可以在方法内部进行上述检查,但是注释的处理方式提供了额外的文档,这使得用户需要特定的权限而无需使文档与代码保持同步。

4

2 回答 2

1

我确定您的“权限不足”示例可以使用Spring AOP完成,因为这就是 Spring Security 的工作方式。您可以使用周围的建议和 AspectJ 做一些非常复杂的事情。

于 2009-06-19T00:46:39.430 回答
1

您可以考虑使用 AspectJ 来执行此操作,因为它会匹配注释。然后,您可以使用环绕方面来确定用户是否满足使用此方法的要求。

Spring 允许您使用 AspectJ,我建议您尽可能不要在运行时执行此操作,而是在编译时执行此操作,因为在启动应用程序时没有理由为使用此方面付出代价。但是,如果你必须在运行时这样做,那么这是可行的,对我来说,我尝试尽可能多地使用编译时。

您可能想查看 AspectJ In Action ( http://www.manning.com/laddad2/ ),但这里有一个示例:签名模式:

* *(@RequestParam
(@Sensitive *))

描述

*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*

例子

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.
于 2009-09-24T01:44:43.003 回答