【问题标题】:Using @PreAuthorize on SpringData repositories在 Spring Data 存储库中使用 @PreAuthorize
【发布时间】:2012-11-25 02:29:18
【问题描述】:

我正在尝试通过在我的存储库接口上使用 @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 接口。

【问题讨论】:

  • 在 xml 配置中使用保护切入点启用安全性时,同样的问题也适用。
  • 您是否有“正常”情况(Repository1.findAll() 和 Repository2.findAll() 具有不同的允许角色列表)或简化的情况(所有存储库的所有 findAll() 方法具有相同的列表允许的角色)?

标签: spring-security spring-data spring-data-jpa


【解决方案1】:

默认情况下,spring 使用 JDK 代理包装 bean。在这种情况下,注释仅适用于接口方法。所以你需要一些更强大的代理(CGlib 或 AspectJ)。我不确定它是否会“按原样”解决您的问题。你可以试试CGlib:

<security:global-method-security ... proxy-target-class="true" />

对于 AspectJ:

<security:global-method-security ... mode="aspectj" />

在这两种情况下,您都需要额外的库和额外的配置。 请参阅AOP Proxies 了解更多详情。

从架构的角度来看,安全注释的最佳位置是在您的服务方法上。考虑以下情况:您有 ServiceA.methodA() 和 ServiceB.methodB()。他们使用 RepositoryC.methodC()。您的客户希望 methodA() 和 methodB() 具有不同的安全权限。如果您的安全层应用于存储库,那将是不可能的。因此,只需将您的安全注释应用于服务,就完全没有问题。

【讨论】:

  • 我尝试过 cglib 但它不起作用。 AspectJ 不是一个选项,因为它适用于具体类。同意架构点,但在我的情况下,我想在 OSGI 服务中公开存储库并控制谁(用户或服务)调用它。如果无法直接保护存储库方法,我必须将它与一个服务捆绑在一起,该服务将公开和保护相同的方法,这是一个小小的不便,因为我必须在服务 IF 上复制为我生成的方法 spring-data。
【解决方案2】:

您可以将@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> {}

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多