arquillian_使用Arquillian测试安全的EJB

arquillian

从历史上讲,很难测试安全的EJB。 到目前为止,我一直在使用专有技术(如JBossLoginContextFactory)中所述的文章( 使用Arquillian在WildFly 8.1.x上测试安全的EJB)来测试安全的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

api怎么写_使用Node.js原生API写一个web服务器

Node.js是JavaScript基础上发展起来的语言&#xff0c;所以前端开发者应该天生就会一点。一般我们会用它来做CLI工具或者Web服务器&#xff0c;做Web服务器也有很多成熟的框架&#xff0c;比如Express和Koa。但是Express和Koa都是对Node.js原生API的封装&#xff0c;所以其实不…

C语言预处理命令分类和工作原理

C语言编程过程中&#xff0c;经常会用到如 #include、#define 等指令&#xff0c;这些标识开头的指令被称为预处理指令&#xff0c;预处理指令由预处理程序&#xff08;预处理器&#xff09;操作。相比其他编程语言&#xff0c;C/C 语言更依赖预处理器&#xff0c;故在阅读或开…

查看mysql用户权限_mysql 如何查看该数据库用户具有哪些权限?

展开全部背景在了解动态权限之前&#xff0c;我们先回顾下 MySQL 的权限列表。权限列表大体分为服务级别和表级别&#xff0c;列级别以32313133353236313431303231363533e59b9ee7ad9431333433633464及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SU…

注释嵌套注释_注释,无处不在的注释

注释嵌套注释十年前的2004年 &#xff0c; Java 1.5开始提供注释。 很难想象没有此功能的代码。 实际上&#xff0c;首先引入了注释&#xff0c;以减轻开发人员编写繁琐的样板代码的痛苦&#xff0c;并使代码更具可读性。 考虑一下J2EE 1.4&#xff08;没有可用的注释&#xff…

a标签跳到另一个页面指定选项卡_HTML常用标签

本篇文章主要是对a、img和table标签用法介绍&#xff1a;a标签&#xff1a;可称为锚元素&#xff0c;主要功能是创建通向其他网页、文件、同一页面的其他位置、电子邮件地址或其他任何url地址的超链接&#xff1b;1.img标签&#xff1a;发出get请求并显示返回的图片1.常用属性&…

c语言也能用模板方法模式?

模式动机在嵌入式的应用场景中&#xff0c;管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后&#xff0c;还必须释放资源。例如fopen()打开文件后&#xff0c;必须要使用fclose()来关闭文件&#xff0c;而使用malloc申请内存资源后&#xff0c;就…

cv2 imshow窗口大小_cv2.imshow()图片无法显示

在Pycharm和jupyter notebook中运行cv2.imshow()函数的时候&#xff0c;图片无法正常显示&#xff0c;是因为在运行cv2.imshow()之后&#xff0c;需要使用cv2.waitKey()来保持窗口的显示&#xff0c;用cv2.destroyAllWindows()来关闭窗口。cv2.imshow()后面需要跟随着cv2.waitK…

游戏 服务器 微服务_整体服务器与微服务

游戏 服务器 微服务介绍 刚开始时&#xff0c;由于要求简单&#xff0c;所以应用程序既简单又小。 随着时间的要求和需求的增长&#xff0c;我们的应用程序变得越来越大&#xff0c;越来越复杂。 这就导致了将单片服务器开发和部署为一个单元。 在某种程度上&#xff0c;微服务…

数据与ELF数据节-计算机系统基础题目

实验内容&#xff1a;修改二进制可重定位目标文件“phase1.o”的数据&#xff08;.data&#xff09;节内容&#xff08;不允许修改其他节&#xff09;&#xff0c;使其与main.o模块如下链接后运行时输出目标字符串“123456789”。 实验步骤&#xff1a; 1. 使用objdump工具获得…

sqlserver拼接sql插入table_10个SQL技巧

介 绍为了理解这 10 个 SQL 技巧的价值&#xff0c;首先需要了解下 SQL 语言的上下文。为什么我要在 Java 会议上讨论 SQL 呢&#xff1f;(我可能是唯一一个在 Java 会议上讨论 SQL 的了)下面讲下为什么&#xff1a;从早期开始&#xff0c;编程语言设计者就有这种的愿望&#x…

【C语言笔记】指定初始化器

C99增加了一个新特性&#xff1a;指定初始化器(designated initializer)。利用该特性可以初始化指定的数组元素&#xff0c;也可以初始化指定的结构体变量。本文主要分享&#xff1a;使用指定初始化器初始化数组。例如&#xff0c;只初始化数组中的最后一个元素。对于传统的C初…

本地虚拟机上的docker安装mysql_Linux虚拟机上安装docker,并使用docker安装mysql,tomcat...

1、序言现在在Linux虚拟机上安装程序&#xff0c;越来越多的人都使用docker完成&#xff0c;本次就记录下在虚拟机上安装docker的过程。如果你的windows系统上还没有安装Linux虚拟机&#xff0c;请参考我的上一篇博客&#xff1a;安装Linux虚拟机2、docker简介Docker是一个开源…

java锁性能对比_提高Java的锁性能

java锁性能对比Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案。 几个月前&#xff0c;我们在Plumbr中引入了锁定线程检测之后&#xff0c;我们开始收到类似于“嘿&#xff0c;太好了&#xff0c;现在我知道是什么导致了性能问题&#xf…

binlog日志_MySQL三大日志binlog、redo log和undo log

点击蓝色“JavaKeeper”关注我哟加个“星标”&#xff0c;一起成长&#xff0c;做牛逼闪闪的技术人Keeper导读&#xff1a;日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制…

C 语言精髓之变参函数

我们以 printf 这个 very 熟悉的函数为例&#xff0c;来分析一下变参函数。先看下 printf 函数的定义&#xff1a;int printf(const char *fmt, ...){ int i; int len; /* va_list 即 char * */va_list args;va_start(args, fmt); /* 内部使用了 va_arg() */len v…

mysql error 变量_mysql 变量问题

关于mysql5.5数据库中变量的引用的问题.1.有一个数据库是test_num_base,其中有一个test表.我想通过变量的方式获取test的数据.select * from test_num_base.test;使用变量:set Atest_num_base;但是再次访问使用: select * from A.test;报错:ERROR 1064 (42000): You have an er…

lambda捕获this_非捕获Lambda的实例

lambda捕获this大约一个月前&#xff0c;我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 。 目前&#xff0c;我正在研究有关默认方法的文章&#xff0c;令我惊讶的是&#xff0c;我又回到了Java处理lambda表达式的方式。 这两个功能的交集可能会产生微妙但令人惊讶的…

mysql8 安装_MySQL8.x安装使用

1.下载网址https://dev.mysql.com/downloads/mysql/下载要登录&#xff0c;可以使用Oracle账户登录2.安装MySQL服务下载好的解压到D:developer目录下配置MySQL(windows下是my.ini&#xff0c;Linux下是my.cnf)[mysql]# 设置mysql客户端默认字符集default-character-setutf8[mys…

从原理到方法,一文讲清如何应对C语言内存泄露!

可能不少开发者都遇到过内存泄漏导致的网上问题&#xff0c;具体表现为单板在现网运行数月以后&#xff0c;因为内存耗尽而导致单板复位现象。一方面&#xff0c;内存泄漏问题属于比较浅显的错误&#xff0c;此类问题遗漏到现网&#xff0c;影响不好&#xff1b;另一方面&#…

如何卸载pip 重新安装mysql_pip install cymysql失败的解决办法 | 厘米天空

今天在配置一台后端的时候用pip安装cymysql出现错误&#xff1a;Cannot fetch index base URL http://pypi.python.org/simple/Could not find any downloads that satisfy the requirement cythonNo distributions at all found for cythonStoring complete log in /root/.pip…