使用Arquillian测试安全的EJB

从历史上讲,很难对安全的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

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

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

相关文章

Java基础笔记之数据类型

一、数据类型 &#xff08;一&#xff09;8种基本数据类型(内置数据类型\C#中为值类型) 字符长度&#xff1a;1byte 8 bit;布尔&#xff1a;可认为是 1byte (8 bit);字符&#xff1a;char&#xff1a;2/16整型:short: 2/16int: 4/32long: 16/64浮点型:float: 8/32double: 16/6…

SSTI模板注入基础(Flask+Jinja2)

文章目录 一、前置知识1.1 模板引擎1.2 渲染 二、SSTI模板注入2.1 原理2.2 沙箱逃逸沙箱逃逸payload讲解其他重要payload 2.3 过滤绕过点.被过滤下划线_被过滤单双引号 "被过滤中括号[]被过滤关键字被过滤 三、PasecaCTF-2019-Web-Flask SSTI参考文献 一、前置知识 1.1 模…

JQuery 样式设置、追加、移除与切换

有了JQuery&#xff0c;元素的样式操作会变得相当简易。下面我们来看看如何使用JQuery来实现元素样式的获取、设置、追加、删除以及其它一些操作。 获取与设置样式 获取class和设置class都可以使用attr()方法来完成。例如使用attr()方法来获取p元素的class&#xff0c;JQuery代…

关于Java的十件事

那么&#xff0c;您从一开始就一直在使用Java&#xff1f; 还记得曾经被称为“ Oak”的日子&#xff0c;OO仍然是热门话题&#xff0c;C 人士认为Java没有机会&#xff0c;Applet还是一件事吗&#xff1f; 我敢打赌&#xff0c;您至少不了解以下一半内容。 让我们从本周开始&a…

JQuery DataTables Selected Row

获取单行选中的值 $(#MonitoringTypeTable tbody).on(click, tr, function () {if ($(this).hasClass(selected)) {$(this).removeClass(selected);}else {dataTable.$(tr.selected).removeClass(selected);$(this).addClass(selected);var data dataTable.rows(.selected).da…

JSP9大内置对象

JSP9大内置对象 JSP9个内置对象&#xff1a;out对象 用于输出各种数据reuest对象 封装了来自客户端的各种信息response对象 封装了服务器的响应信息exception对象 封装了程序运行过程中发生的异常和错误信息config对象 封装了应用程序的配置信息page对象 指向了当前JSP程序本身…

【转】SQL Server中行列转换 Pivot UnPivot

PIVOT用于将列值旋转为列名&#xff08;即行转列&#xff09;&#xff0c;在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是&#xff1a;PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法&#xff1a; table_source PIVOT( 聚合函数&#xff08;value_col…

ExecutorService – 10个提示和技巧

从Java 5开始就已经存在ExecutorService抽象。在这里我们谈论的是2004。 提醒一下&#xff1a;Java 5和6不再受支持&#xff0c;Java 7 将不在半年之内 。 之所以提出这一点&#xff0c;是因为许多Java程序员仍然不完全了解ExecutorService工作方式。 有很多地方可以学习&#…

.NET学习杂记

1..NET中一个组件可以是一个类,如:public class MyClass{public string GetMessage( ){return "Hello";}}2.组件开发尽量使用接口使用接口可以在基本不影响客户代码的清况下对级件进行更新.使用接口需要尽可能地利用封装性,尽量不要显露组件的内部如何实现.封装是实…

.net c# 序列化和反序列

所谓的序列化就是是将对象转换为容易传输的格式的过程&#xff0c;一般情况下转化打流文件&#xff0c;放入内存或者IO文件中。例如&#xff0c;可以序列化一个对象&#xff0c;然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象&#xff0c;或者和其它应用程序共享…

注释,无处不在的注释

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

ajax长链接--拉实现

很多时候需要用在网页上实时显示数据&#xff0c;这个时候一般要用到长链接技术。最简单的实现就是ajax轮询&#xff0c;也就是拉的方式。 下面是一个简单的例子&#xff1a;在网页上实时显示服务器时间。 后端WebService代码&#xff1a; /// <summary>/// ServerTime 的…

EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法

带参提交一次查询&#xff0c;从服务器加载新数据。这是一个神奇的方法 $(#dg).datagrid(load,{code: 01,name: name01 });easyui修改操作的回显方法 $("#standardForm").form(load,rows[0]); var toolbar [ {id : button-add,text : 增加,iconCls : icon-add,han…

jboss4。0下mysql数据源的配置

花了一个小时的时间&#xff0c;搞了一下jboss4。0下mysql数据源的配置。下面是一些具体过程 1、首先安装mysql数据库并将其驱动程序考到jboss的server\default\lib下面 2、将mysql-ds.xml文件放置到server\default\deploy下面 内容如下&#xff1a; <datasources&g…

JavaFX技巧15:ListView自动滚动

我最近不得不为FlexGanttFX实现自动滚动功能&#xff0c;并认为我的解决方案可能对其他人有用。 您可以在下面的清单中找到它的基本概念。 主要思想是使用后台线程来调整列表视图使用的虚拟流节点的像素位置。 当检测到“靠近”顶部或底部边缘的拖拉时&#xff0c;线程开始。 “…

Direct3D学习_绘制

运行了示例&#xff0c;重要步骤记录如下&#xff1a; 1&#xff1a;创建顶点和索引缓存 IDirect3DDevice9::CreateVertexBuffer IDirect3DDevice9::CreateIndexBuffer 2&#xff1a;填充数据 lock ........ unlock 3&#xff1a;设置摄像机 D3DXVECTOR3 position(x,y,z);   …

JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法

servlet层中的代码如下&#xff1a; package com.swift.jztk.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletReque…

【RTOS】基于V7开发板的uCOS-III,uCOS-II,RTX4,RTX5,FreeRTOS原版和带CMSIS-RTOS V2封装层版全部集齐...

RTOS模板制作好后&#xff0c;后面堆各种中间件就方便了。 1、基于V7开发板的最新版uCOS-II V2.92.16程序模板&#xff0c;含MDK和IAR&#xff0c;支持uC/Probehttps://www.cnblogs.com/armfly/p/11255981.html 2、基于V7开发板的最新版uCOS-III V3.07.03程序模板&#xff0c;含…

三极管开关电路设计(转)

三极管开关电路设计 三极管除了可以当做交流信号放大器之外&#xff0c;也可以做为开关之用。严格说起来&#xff0c;三极管与一般的机械接点式开关在动作上并不完全相同&#xff0c;但是它却具有一些机械式开关所没有的特点。图1所示&#xff0c;即为三极管电子开关的基本电路…

poj3009

样例和网上找的测试数据 都过了 还是 wa program poj3009;type starecord x,y:integer; end;var dir:array[1..4,1..2]of integer((1,0),(-1,0),(0,1),(0,-1)); w,h,ans,ansb:integer; map:array[0..21,0..21]of integer; start:sta; flag:boolean; procedur…