解析Spring Security方法@PreAuthorize

时间:2013-03-23 18:39:51

标签: spring-security

我在我的应用程序中使用@PreAuthorize注释注释了一些服务方法。这些注释使用hasAuthorityhasRole等,将来可能包含其他有效的构造。 例如:

@PreAuthorize("hasAuthority('Customer.Get')")
public Customer getCustomer(String name);

我想反过来收集所有PreAuthorize注释中使用的所有权限,例如Customer.Get等。

PreAuthorize pre = (PreAuthorize) m.getAnnotation(PreAuthorize.class);
String expr = pre.value();

我正在寻找各种各样的东西:

List<HasAuthority> h = SpringXYZ.getHasAuthorities(expr); 并从h.get(0)....

中获取“Customer.Get”字符串

这可能吗?由于我需要在应用程序初始化期间执行此检索,因此当时没有可用的身份验证对象。

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

将在运行时评估此hasAuthority('Customer.Get')之类的SPeL表达式。在加载时,所有框架必须知道的是应用了@PreAuthorize(以及相应的参数作为字符串)。所有工作都将在运行时由SPeL解析器/运行时环境完成。所以我认为没有帮助类可以帮助你。

如果您想避免解析,请尝试使用@Secured annotations:

@Secured("ROLE_Customer.Get")
public Customer getCustomer(String name);
可以删除

ROLE_前缀(一些额外的conf):

@Secured("Customer.Get")
public Customer getCustomer(String name);

或JSR-250 @RolesAllowed:

@RolesAllowed("Customer.Get")
public Customer getCustomer(String name);

从安全角度来看,它的灵活性会降低,但对于pasing来说则更为简单。