我正在尝试通过在我的存储库接口上使用 @PreAuthorize 注释来保护 Spring-Data 存储库(因为大多数方法都是继承的),以便所有方法都得到保护。结果是我的接口中包含的任何自定义方法都没有通过 Spring-Data 接口继承的所有方法获得安全性。在扩展超级接口的简单组件接口上应用相同的东西将正常工作。我不确定这是 Spring-Security 还是 Spring-Data 问题。我会很感激一些帮助解决这个问题。可以在http://forum.springsource.org/showthread.php?133083-Using-PreAuthorize-on-SpringData-repositories下载工作服务设置和非工作 Spring-Data 存储库的单元测试示例. 失败的 testSuperRepositoryWithUser 应该得到一个 AccessDeniedException,但 @PreAuthorize 注释不适用于 JpaRepository 接口。
问问题
1763 次
2 回答
1
默认情况下,spring 使用 JDK 代理包装 bean。在这种情况下,注释仅适用于接口方法。所以你需要一些更强大的代理(CGlib 或 AspectJ)。我不确定它是否会“按原样”解决您的问题。你可以试试 CGlib:
<security:global-method-security ... proxy-target-class="true" />
对于 AspectJ:
<security:global-method-security ... mode="aspectj" />
在这两种情况下,您都需要额外的库和额外的配置。有关更多详细信息,请参阅AOP 代理。
从架构的角度来看,安全注释的最佳位置是在您的服务方法上。考虑以下情况:您有 ServiceA.methodA() 和 ServiceB.methodB()。他们使用 RepositoryC.methodC()。您的客户希望 methodA() 和 methodB() 具有不同的安全权限。如果您的安全层应用于存储库,那将是不可能的。因此,只需将您的安全注释应用于服务,就完全没有问题。
于 2012-12-13T16:56:04.907 回答
0
您可以通过将其应用于接口而不是方法来对接口的@PreAuthorize
所有方法应用或类似的注释。Repository
@PreAuthorize("hasRole('ROLE_SUPERUSER')")
public interface PersonnelRepository extends PagingAndSortingRepository<Person, Long>{}
您还可以在其他人继承的基础存储库上提供注释,以保护继承的存储库的方法。
@NoRepositoryBean
@RepositoryRestResource()
@PreAuthorize("hasAuthority('ROLE_USER')")
public interface BaseRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID>{}
现在这个存储库在它的所有方法上也将具有相同的安全性。
public interface FooRepo extends BaseRepository <Foo, Long> {}
于 2017-09-20T12:54:13.447 回答