2012-02-08 60 views
3

例如:有人可以使用Spring-Security PreAuthorize注释吗?

@PreAuthorize("hasRole('admin') && hasPermission('save', #user)") 
void updateUser(User user) { 
    // some code 
} 

而且没有预先授权一些示例实现。

void updateUser(User user) { 
    Security.hasRole(Roles.ADMIN); 
    Security.hasPermission(Permission.SAVE, user); 
    // some code 
} 

第二个例子更容易理解。可以通过IDE重构(重命名角色,或查找所有角色用法)。在编译时检查代码。工作更快。并可能有其他优点。

为什么春季安全开发者选择了注释和SpEL?有人能解释吗?

只有一个原因我可以找到 - 更容易访问ApplicationContext。但据我所见,Spring Security通过SecurityContextHolder单例可以工作。

回答

3

从我的角度来看,最大的优点是,它可以很容易地在测试中停用(或更正确,不激活)。

因此,我可以写我的测试(单元测试,功能测试,...),而不必关注安全的东西。以便测试可以专注于他们想要测试的功能。

当然这也是可能的“显式”版本(第二个例子),但是我需要在测试中考虑它,这将使测试更长(更多代码),也意味着更多的东西保持。

1

除了@Ralph答案我还会增加其他一些优点。

  1. @PreAuthorize(& CO。)是间注释有@Documented,这意味着该注释将在安全方法的Javadoc显示。您的文档的读者将立即知道该方法是安全的,并且在什么条件下。

  2. 由于它使用@Inherited进行元注释,所以您可以将@PreAuthorize添加到父类,并自动让所有层次结构保持安全,而无需实施任何其他模式。