2

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

@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”字符串 ....

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

任何建议表示赞赏。

4

1 回答 1

1

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

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

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

ROLE_前缀可能会被删除(一些额外的配置):

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

或 JSR-250 @RolesAllowed:

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

从安全的角度来看,它的灵活性会降低,但传递起来会更简单。

于 2013-03-25T09:33:15.540 回答