从历史上讲,很难对安全的EJB进行测试。 到目前为止,我一直在使用诸如用Arquillian 在WildFly 8.1.x上测试安全的EJB文章中描述的JBossLoginContextFactory等专有技术来测试安全的EJB。

在本年度Devoxx中 , Apache TomEE项目(轻量级Java EE应用程序服务器)的创始人David Blevins为我带来了一个小窍门,我们可以使用该技巧以一种标准方式处理Java EE安全性,该方法可在所有符合Java EE的服务器上运行。

GitHub上的javaee-testing / security提供了本文中使用的示例。

编码

要测试的代码包括一个实体和一个EJB服务,如下所示。

图书实体

@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String isbn;private String title;public Book() {}public Book(String isbn, String title) {this.isbn = isbn;this.title = title;}// getters and setters omitted for brevity
}

书架EJB服务

@Stateless
public class BookshelfService {@PersistenceContext(unitName = "bookshelfManager")private EntityManager entityManager;@RolesAllowed({ "User", "Manager" })public void addBook(Book book) {entityManager.persist(book);}@RolesAllowed({ "Manager" })public void deleteBook(Book book) {entityManager.remove(book);}@PermitAll@TransactionAttribute(TransactionAttributeType.SUPPORTS)public List<Book> getBooks() {TypedQuery<Book> query = entityManager.createQuery("SELECT b from Book as b", Book.class);return query.getResultList();}
}

测试类使用Arquillian进行集成测试,并断言尊重我们EJB上定义的安全角色。

书架服务测试

@RunWith(Arquillian.class)
public class BookshelfServiceIT {@Injectprivate BookshelfService bookshelfService;@Injectprivate BookshelfManager manager;@Injectprivate BookshelfUser user;@Deploymentpublic static JavaArchive createDeployment() throws IOException {return ShrinkWrap.create(JavaArchive.class, "javaee-testing-security.jar").addClasses(Book.class, BookshelfService.class, BookshelfManager.class, BookshelfUser.class).addAsManifestResource("META-INF/persistence.xml", "persistence.xml").addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));}@Testpublic void testAsManager() throws Exception {manager.call(new Callable<Book>() {@Overridepublic Book call() throws Exception {bookshelfService.addBook(new Book("978-1-4302-4626-8", "Beginning Java EE 7"));bookshelfService.addBook(new Book("978-1-4493-2829-0", "Continuous Enterprise Development in Java"));List<Book> books = bookshelfService.getBooks();Assert.assertEquals("List.size()", 2, books.size());for (Book book : books) {bookshelfService.deleteBook(book);}Assert.assertEquals("BookshelfService.getBooks()", 0, bookshelfService.getBooks().size());return null;}});}@Testpublic void testAsUser() throws Exception {user.call(new Callable<Book>() {@Overridepublic Book call() throws Exception {bookshelfService.addBook(new Book("978-1-4302-4626-8", "Beginning Java EE 7"));bookshelfService.addBook(new Book("978-1-4493-2829-0", "Continuous Enterprise Development in Java"));List<Book> books = bookshelfService.getBooks();Assert.assertEquals("List.size()", 2, books.size());for (Book book : books) {try {bookshelfService.deleteBook(book);Assert.fail("Users should not be allowed to delete");} catch (EJBAccessException e) {// Good, users cannot delete things}}// The list should not be emptyAssert.assertEquals("BookshelfService.getBooks()", 2, bookshelfService.getBooks().size());return null;}});}@Testpublic void testUnauthenticated() throws Exception {try {bookshelfService.addBook(new Book("978-1-4302-4626-8", "Beginning Java EE 7"));Assert.fail("Unauthenticated users should not be able to add books");} catch (EJBAccessException e) {// Good, unauthenticated users cannot add things}try {bookshelfService.deleteBook(null);Assert.fail("Unauthenticated users should not be allowed to delete");} catch (EJBAccessException e) {// Good, unauthenticated users cannot delete things}try {// Read access should be allowedList<Book> books = bookshelfService.getBooks();Assert.assertEquals("BookshelfService.getBooks()", 0, books.size());} catch (EJBAccessException e) {Assert.fail("Read access should be allowed");}}
}

技巧是在两个辅助EJB上,它们通过使用@RunAs标准注释允许我们的测试代码在所需的安全范围内执行。

书架经理角色

@Stateless
@RunAs("Manager")
@PermitAll
public class BookshelfManager {public <V> V call(Callable<V> callable) throws Exception {return callable.call();}
}

书架用户角色

@Stateless
@RunAs("User")
@PermitAll
public class BookshelfUser {public <V> V call(Callable<V> callable) throws Exception {return callable.call();}
}

跑步

-------------------------------------------------------T E S T S
-------------------------------------------------------
Running com.samaxes.javaeetesting.security.BookshelfServiceIT
nov 23, 2014 2:44:48 AM org.xnio.Xnio <clinit>
INFO: XNIO version 3.2.0.Beta4
nov 23, 2014 2:44:48 AM org.xnio.nio.NioXnio <clinit>
INFO: XNIO NIO Implementation Version 3.2.0.Beta4
nov 23, 2014 2:44:49 AM org.jboss.remoting3.EndpointImpl <clinit>
INFO: JBoss Remoting version (unknown)
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 36.69 sec - in com.samaxes.javaeetesting.security.BookshelfServiceITResults :Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

测试愉快!

翻译自: https://www.javacodegeeks.com/2014/11/testing-secured-ejbs-with-arquillian.html

使用Arquillian测试安全的EJB相关推荐

  1. arquillian_使用Arquillian测试安全的EJB

    arquillian 从历史上讲,很难测试安全的EJB. 到目前为止,我一直在使用专有技术(如JBossLoginContextFactory)中所述的文章( 使用Arquillian在WildFly ...

  2. jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器

    jpa 测试 该帖子与+ Aslak Knutsen ( @aslakknutsen )一起撰写. JPA类型转换器为定义实体属性如何持久存储到数据库提供了一种简便的方法. 您可以使用它们来实现许多不 ...

  3. 使用外星人进行测试:如何使用Arquillian测试JPA类型转换器

    该帖子与+ Aslak Knutsen ( @aslakknutsen )一起撰写. JPA类型转换器为定义实体属性如何持久存储到数据库提供了一种简便的方法. 您可以使用它们来实现许多不同的功能,例如 ...

  4. 变色龙引导_Arquillian变色龙。 简化您的Arquillian测试

    变色龙引导 Arquillian Chameleon的诞生是为了简化Arquillian测试的配置. 我很自豪地宣布,使用1.0.0.CR2版本,我们不仅简化了Arquillian测试的配置方式,而且 ...

  5. Arquillian变色龙。 简化您的Arquillian测试

    Arquillian Chameleon的诞生是为了简化Arquillian测试的配置. 我很自豪地宣布,使用1.0.0.CR2版本,我们不仅简化了Arquillian测试的配置方式,而且简化了编写方 ...

  6. 使用sikuli和Arquillian测试HTML5 canvas应用程序

    HTML5引入了一个很棒的新元素,可以用来在窗格上绘制任意内容: canvas元素. 数十年来,胖客户端应用程序的标准功能现已引入Web应用程序领域. Web开发人员不再需要使用专有插件在其应用程序中 ...

  7. 使用JMeter测试你的EJB

    对EJB进行一些 性能 基准 测试 是非常有必要和有帮助的,测试的方法和工具有很多,不过我最近发现,Apache JMeter是进行基准测试的一个优秀工具.可惜的是,JMeter没有提供一个可测试任意 ...

  8. openshift_在OpenShift上托管的WildFly实例上进行Arquillian测试

    openshift 技术提示#54解释了如何为现有Java EE项目启用Arquillian. 在该技巧中,测试是针对本地安装的WildFly服务器运行的. 如果此WildFly实例在OpenShif ...

  9. 使用Arquillian测试Spring Data + Spring Boot应用程序(第1部分)

    Spring Data的使命是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特​​殊特征. 它提供了与一些后端技术的集成,例如JPA,Rest,MongoDB,N ...

最新文章

  1. deeplearning搜索空间
  2. 【译】JavaScript 核心(第二版)
  3. 两个半月!出差终于结束啦
  4. Windows XP文件夹右键属性没有“安全”选项卡的解决
  5. 根据需要通过代码的方式加载js文件
  6. Ubuntu16.04上安装kitti2bag
  7. 2021互联网医疗行业洞察
  8. HyperV2012的学习,从这里开始
  9. Java爬虫(Selement)-B站粉丝取关人排查(1)
  10. 软件测试-验收测试与回归测试
  11. 嵌入式组态软件HMImaker(绿色版人机界面组态软件)
  12. 学python能做什么-学Python后到底能干什么
  13. Python入门--字典元素的遍历for-in
  14. javascript 面向对象 new 关键字 原型链 构造函数
  15. js base64图片太大_JS实现base64图片下载 简易方法
  16. QT4升级QT5调研报告
  17. 谷歌云盘文件快速下载方法
  18. win8配置JDK1.8环境变量
  19. Android开发【记事本App】项目开发流程——1
  20. Win10如何高效压缩卷,亲测有效

热门文章

  1. 西安理工大学计算机专业毕业,西安理工大学什么专业好找工作?毕业工资大概多少?答案在这里...
  2. tensorflow图形检测_社交距离检测器——Tensorflow检测模型设计
  3. vue - resource 使用过程的坑
  4. apache ignite_Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署
  5. java记录类型_Java中的记录类型
  6. java cuba_CUBA平台–用于快速应用程序开发的开源Java框架
  7. ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体
  8. jooq sql_使用jOOQ和JavaFX将SQL数据转换为图表
  9. spring体系结构_了解Spring Web应用程序体系结构:经典方法
  10. 成为Java流大师–第1部分:创建流