我有一个足够简单的项目,我正在尝试使用JBehave核心进行测试,并以maven-kosher方式进行操作(即src/main下的生产,src/test下的测试,添加下的集成测试src/it/{java,resources}的路径,以及测试的测试依赖项.让这一切在一起运行似乎比它应该更难.
我的情况有点不同,因为我的代码在src/it/java中,src/it/resources中的资源.在maven中配置了这些,Eclipse运行故事就好了 - 问题在于Maven.
目前我的问题是它在运行时没有看到mockito(或其他测试依赖项)(mvn -X).即使编辑工作示例并添加测试依赖项也不包括它.
我已经能够通过在插件xml blob中粘贴我的测试依赖项来使其工作,但显然我不想像那样重复自己.
构建文件的相关部分(没有手动指定的依赖项hack)是:
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*</include>
</includes>
</testResource>
<testResource>
<directory>src/it/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*</include>
</includes>
</testResource>
</testResources>
Run Code Online (Sandbox Code Playgroud)
...
<plugin>
<groupId>org.jbehave</groupId>
<artifactId>jbehave-maven-plugin</artifactId>
<executions>
<execution>
<id>embeddable-stories</id>
<phase>integration-test</phase>
<configuration>
<includes>
<include>**/*Story.java</include>
</includes>
<ignoreFailureInStories>false</ignoreFailureInStories>
<ignoreFailureInView>false</ignoreFailureInView>
<scope>test</scope>
<testSourceDirectory>src/it/java</testSourceDirectory>
</configuration>
<goals>
<goal>run-stories-as-embeddables</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
想法?
TL; DR:我如何在Spring-Data-Rest为我们提供的扁平REST api方法中实现细粒度的访问控制?
所以 - 我正在使用Spring-Data-Rest创建一个API,其中有三个主要的访问级别:
1)管理员 - 可以查看/更新所有组
2)组的所有者 - 可以查看/更新组及其下的所有内容
3)子组的所有者 - 只能查看/更新他的组.没有递归嵌套,只允许一个子级别.
并且'group'作为资源公开(具有crud存储库).
到目前为止一直很好 - 我已经实现了一些使用Repository Event Handler进行修改的访问控制 - 所以在创建/写入/删除方面我觉得我很好.
现在我需要达到限制某些项目的可见性的程度.这对于获得单个项目是可以的,因为我可以使用Pre/Post Authorize注释并引用主体.
问题在于findAll()方法 - 我没有一个简单的钩子来过滤掉我不希望基于当前主体公开的特定实例.例如,子组所有者可以通过执行GET /组来查看所有组.理想情况下,他们应该拥有他们无法访问的项目甚至根本不可见.
对我来说,这听起来像是在存储库接口上编写自定义的@Query()注释,但这似乎并不可行,因为:
我需要在查询中引用主体.SPeL应该得到支持,但似乎根本没有使用?#表达式(尽管这篇博客文章提示不然:https : //spring.io/blog/2014/07/15/spel-support-in- spring-data-jpa-query-definitions).我通常使用带有1.1.8.RELEASE和Evans-RELEASE列的spring-boot来获取spring-data.
我需要编写的查询类型将根据访问级别而有所不同,访问级别实际上不能包含在单个JPQL语句中(如果管理员选择所有组,否则获取与主体用户关联的所有(子)组) ).
因此,我觉得我需要为此编写一些自定义存储库实现,并在代码中引用主体.嗯,这没关系 - 但是对于我需要控制访问权限的每个存储库来说,似乎需要做很多工作(我认为这几乎就是所有存储库).这适用于findAll和各种自定义搜索方法.
我接近这个错吗?是否有另一种方法可以根据当前登录的用户动态限制项目可见性,以便更好地工作?在像spring-data-rest暴露的平面命名空间中,我认为这将是一个常见的问题.
在先前的设计中,我刚刚通过暴露/ api/groups/{groupId}/...下的所有内容来解决它,并且让子资源定位器充当单个夹点以控制对其下任何内容的访问.在spring-data-rest中没有这样的运气.
更新:现在绊倒了一个覆盖findAll()的自定义方法(这适用于我的自定义接口上定义的其他方法).虽然这可能是一个单独的问题 - 我现在被阻止了.当我执行GET /组时,Spring-data并没有调用它,而是调用原始数据.奇怪的是,如果我在界面上定义一个并用@Query标记它,它确实使用我的查询(可能不再支持内置方法的自定义覆盖?).
public interface GroupRepository extends JpaRepository<Group, Long>, GroupCustomRepository {}
public interface GroupCustomRepository {
Page<Group> findAll(Pageable pageable);
}
public class GroupCustomRepositoryImpl extends SimpleJpaRepository<Group, Long> implements GroupCustomRepository {
@Inject
public GroupCustomRepositoryImpl(EntityManager em) {
super(Group.class, em); …Run Code Online (Sandbox Code Playgroud) rest spring spring-security spring-data-jpa spring-data-rest