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