Spring Security实体字段级安全

我有一个Spring

MVC应用程序,该应用程序提供一个视图,该视图显示Customer实体中的所有字段,例如名称,地址,电话号码等。该应用程序具有诸如ROLE_USER和的各种角色ROLE_ADMIN。的用户ROLE_USER只能看到客户名称,而的用户ROLE_ADMIN可以看到所有客户字段。

目前,我实现的方式是使用Thymeleaf视图,该视图利用SpringSecurityDialect基于用户的角色来限制对某些字段的访问:

<th:block sec:authorize="hasRole('ROLE_ADMIN')">

<div th:text="${customer.phoneNumber}" />

</th:block>

虽然这绝对可以正常工作,但是感觉不正确并且很难测试。我想针对控制器编写测试,该测试使用具有不同角色(例如testViewCustomerAsRoleAdmin和)的主体调用controller方法testViewCustomerAsRoleUser。这无法验证,因为控制器Customer将向已填充的视图返回一个视图,并且该视图的每个字段都可以通过getter进行访问。

我需要的是实体级别的某种字段级别的安全性,在这里我可以使用Spring Security批注:

@PreAuthorize("hasRole('ROLE_ADMIN')")

public String getPhoneNumber()

{

return phoneNumber;

}

AccessDeniedException如果在委托人未授权的情况下尝试访问该字段时会引发,这将是理想的。

泽西岛项目似乎有这种被提到的概念在这里,这里和一个例子在这里。但是,它似乎仅限于基于角色的安全性,而不是随提供的完整SpEL支持@PreAuthorize

有什么方法可以用Spring

Security实现这种事情,我知道安全性上下文或SpEL评估上下文在实体中不可用,因为它们不是由Spring管理的。如果没有,是否还有其他方法可以使我实现同一目标?

我不完全了解Spring Security框架,但似乎可以在ApectJ模式下使用Spring

AOP来检测域(实体)类的方法来完成某些工作。然后将是这样一种情况:掌握AccessDecisionManager并通过认证(可能是从那里获得的SecurityContextHolder)以及域类方法(如果存在)上的注释的内容。有人有做这种事情的经验吗?

回答:

我设法在AspectJ模式下使用Spring

AOP解决了这个问题。如果启用了AspectJ模式并执行编译时或加载时编织,则各种Spring注释(例如@Transactional和)@PreAuthorize都可以在任何非Spring托管类上使用,这里有一个很好的示例:https :

//github.com/spring-projects /spring-

security/tree/4.0.1.RELEASE/samples/aspectj-jc

您需要确保您spring-security-

aspects的项目中具有依赖项(如果使用编译时编织,则为插件),以启用@Secured注释的编织。尽管其中的注释AnnotationSecurityAspect将类描述为:

针对JDK 1.5+使用Spring Security @Secured批注的具体AspectJ方面。

本类已经织其他Spring的注解,包括@PreAuthorize@PreFilter@PostAuthorize@PostFilter

以上是 Spring Security实体字段级安全 的全部内容, 来源链接: utcz.com/qa/412736.html

回到顶部