Java 是否有人可以exlpain advantage spring security预授权注释?

Java 是否有人可以exlpain advantage spring security预授权注释?,java,spring,spring-security,Java,Spring,Spring Security,例如: @预授权(“hasRole('admin')和&hasPermission('save',#user)”) void updateUser(用户){ //一些代码 } 以及一些未经预授权的示例实现 void updateUser(用户){ Security.hasRole(Roles.ADMIN); Security.hasPermission(Permission.SAVE,user); //一些代码 } 第二个例子更容易理解。可以通过IDE进行重构(重命名角色或查找所有角色用法)

例如:

@预授权(“hasRole('admin')和&hasPermission('save',#user)”)
void updateUser(用户){
//一些代码
}
以及一些未经预授权的示例实现

void updateUser(用户){
Security.hasRole(Roles.ADMIN);
Security.hasPermission(Permission.SAVE,user);
//一些代码
}
第二个例子更容易理解。可以通过IDE进行重构(重命名角色或查找所有角色用法)。编译时的代码检查。工作快一点。还有其他好处

为什么spring安全开发人员选择注释和SpEL?有人能解释一下吗

我能找到的唯一原因是更容易访问ApplicationContext。但就我所见,spring安全性通过SecurityContextHolder singleton以任何方式工作。

最大的优势(从我的角度来看)是,它可以在测试中轻松停用(或者更正确,不激活)

因此,我可以编写我的测试(单元测试、功能测试等等),而不必注意安全性。这样测试就可以专注于他们想要测试的功能


当然,对于“显式”版本(第二个示例),这也是可能的,但是我需要在测试中注意这一点,这将使测试更长(更多代码),也意味着需要维护更多的内容。

除了@Ralph answer,我还将添加一些其他优点

  • @预授权(&co.)使用@Documented进行元注释,这意味着注释将显示在安全方法的Javadocs中。您文档的读者将立即知道该方法是安全的,并且在什么条件下是安全的

  • 由于它是用@Inherited进行元注释的,因此可以将@PreAuthorize添加到父类中,并自动保护所有层次结构,而无需实现任何其他模式