jaas

随着RESTFUL(JAX-RS)作为创建Web服务端点的“首选”方式的问世,很长一段时间以来,我一直想知道人们如何围绕它实现安全机制。

归根结底,我假设JAX-RS的基础实现是servlet,因此其安全性也可能围绕容器(即JAAS)已经提供的安全性。

这篇文章将涵盖我在Glassfish 3上如何使用JDBC领域,JAX-RS逐步实现基于FORM的安全性以及如何使用cURL对其进行测试的发现。

设置JDBC领域

首先,因为我们使用的是JDBC领域,所以我们假设我们已经在JNDI jdbc/test下创建了到基础数据库的JDBC连接。

下一步是创建一个新领域。 您可以通过以下方法执行此操作:转到服务器配置>安全性>领域,然后添加一个新领域。 选择领域类型com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm ,然后填充必填字段。

  • 首先给您的新领域起一个名字。
  • 对于JAAS Context,将jdbcRealm
  • 填充JNDI名称,最好以"jndi/"开头

接下来,请注意其余字段。 Glassfish似乎希望看到两个表。 第一个表包含用户列表,其中用户名是其唯一标识符。 第二张表列出了每个用户所属的组。 用户名是两个表之间的外键链接。 (下一节应该让您更好地了解表格的外观,毕竟它们非常简单)。

一旦创建了这些表,我们就可以相应地填充必填字段。

填充数据库以进行测试

下一步是填充表以进行测试。 假设我们将使用用户名hpotter和password test 。 但是,对于密码,请注意,Glassfish的摘要默认情况下为SHA-256,如以下屏幕截图所示。

因此,您需要在插入之前对密码test进行编码。 您可以使用technipixel编码器,这将为您提供字符串9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

下一步是编写一些INSERT语句:

INSERT INTO person (id, password, username) VALUES (1, '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', 'hpotter');
COMMIT;
INSERT INTO person_role (username, user_group) VALUES ('hpotter', 'User');
INSERT INTO person_role (username, user_group) VALUES ('hpotter', 'Admin');
COMMIT;

让我们继续下一步。

使用JAAS保护Web应用程序的安全

关于JAAS的很多使用FORM认证方法的教程。 但是,我想我再把它放在这里,希望有人会发现它更简单。

web.xml

对您的web.xml进行以下修改

<welcome-file-list><welcome-file>/index.jsp</welcome-file><!-- 1 --></welcome-file-list><security-constraint><!-- 2 --><display-name>TestConstraint</display-name><web-resource-collection><web-resource-name>TestResource</web-resource-name><description/><url-pattern>/*</url-pattern></web-resource-collection><auth-constraint><description/><role-name>User</role-name><role-name>Admin</role-name></auth-constraint></security-constraint><login-config><!-- 3 --><auth-method>FORM</auth-method><realm-name>testRealm</realm-name><form-login-config><form-login-page>/login.html</form-login-page><form-error-page>/error.html</form-error-page></form-login-config></login-config><security-role><!-- 4 --><description/><role-name>User</role-name></security-role><security-role><!-- 5 --><description/><role-name>Admin</role-name></security-role>

让我们一一讲解它们。

  1. 这是成功登录后将显示的文件。 您也可以将此文件用作重定向。 例如,假设您有一个名为index.xhtml的文件(一个JSF页面),则可以使用response.sendRedirect("index.jsf");
  2. 这是实际的约束,即如何保护应用程序。 此部分基本上可以保护所有对应用程序的访问,以/* url模式表示,并且仅允许以UserAdmin角色访问用户。
  3. 这部分表示我们正在使用的是FORM身份验证方法(我将在下一部分中对其进行详细说明)。 重要的部分是确保使用的安全领域的名称正确,在这种情况下,该名称为testRealm ,即与我们通过Glassfish管理页面进行设置时提供的相同领域名称。 另一部分是设置包含j_security_check的页面,如果尚未验证请求访问权限,则应用程序将自动重定向到该页面。
  4. 已知角色
  5. 与上一节相同。

glassfish-web.xml

我们还需要配置glassfish-web.xml以便容器知道数据库中组之间的映射以及应用程序识别的角色。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url=""><security-role-mapping><role-name>Admin</role-name><group-name>Admin</group-name></security-role-mapping><security-role-mapping><role-name>User</role-name><group-name>User</group-name></security-role-mapping><class-loader delegate="true"/><jsp-config><property name="keepgenerated" value="true"><description>Keep a copy of the generated servlet class' java code.</description></property></jsp-config>
</glassfish-web-app>

注意:如果您使用Netbeans,则可能会为您生成此文件。

登录页面:login.html

如果我们再次参考上面的web.xml ,请注意登录页面指向login.html 。 对于FORM身份验证方法,根据规范,我们需要使用j_security_checkj_usernamej_password (Oracle 2013)。

<!DOCTYPE html>
<html><body><form action="j_security_check" method="post"><p><strong>Username</strong><input type="text" name="j_username" size="25" /></p><p><strong>Password</strong><input type="password" size="15" name="j_password" /></p><p><input type="submit" value="Submit" /><input type="reset" value="Reset" /></p></form></body>
</html>

完成所有这些操作后,我们可以启动Glassfish,部署我们的应用程序并使用任何浏览器对其进行测试。 访问该应用程序后,应将用户定向到login.html进行登录。 请记住使用hpotter作为用户名并test作为密码。 成功登录后,应将用户重定向到index.jsp (根据您的要求,该重定向又将用户重定向到index.jsfindex.jsp重定向到的任何内容)。

创建一个RESTFUL端点

当然,下一步是创建一个RESTFUL端点,这非常简单。 我在这里写的一篇文章可能也很有用。

首先,假设我们具有以下应用程序路径。

package com.dwuysan;import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;/*** @author denywuy*/
@ApplicationPath(value = "resources")
public class ApplicationConfig extends Application {
}

让我们假设我们具有以下简单的RESTFUL服务。

package com.dwuysan;import com.dwuysan.entity.Outlet;
import com.dwuysan.service.OutletService;
import javax.annotation.ManagedBean;
import javax.annotation.security.RolesAllowed;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;@Path(value = "generic")
@RolesAllowed(value = "User")
@ManagedBean
public class GenericResource {@Injectprivate OutletService outletService;@GET@Path("{id}")public Outlet get(@PathParam(value = "id") final long id) {return this.outletService.getOutlet(id);}
}

请注意,我们已使用javax.annotation.security.RolesAllowed批注保护了此服务的安全。

使用curl测试安全的RESTFUL服务

鉴于我们上面创建的RESTFUL服务,我们应该能够使用CURL通过以下命令对其进行测试:

curl -X GET -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8080/testApp/resources/generic/101

上面的命令翻译为以下内容:使用GET命中上面的URL,标题为Accept:application / json和Content-Type:application / json(cURL 2013)

由于我们已经保护了我们的应用程序,因此上述调用将无法进行。 用户将被重定向到login.html 。 因此,我们现在的目标是首先登录。 使用cURL,我们可以提交登录参数(即用户名和密码),然后获取cookie。 为此,我们可以使用以下命令:

curl -b cookies.txt -c cookies.txt -d "j_username=hpotter&j_password=test" http://localhost:8080/testApp/j_security_check

该命令将用户名和密码提交给j_security_check (记住我们之前创建的login.html ),并将获得的cookie存储在cookies.txt文件cookies.txt

如果打开cookies.txt,则可能会看到以下内容:

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.#HttpOnly_localhost     FALSE   /testApp     FALSE   0       JSESSIONID      245a317ab91fbb28244403346770

注意:您可能会收到“文件移动”响应。 这意味着登录已成功。 否则,您将再次获得error.html的原始html。

成功通过身份验证后,我们可以使用从登录名获得的cookie来调用RESTFUL服务。

curl -X GET -H "Accept:application/json" -H "Content-Type:application/json" -b cookies.txt -c cookies.txt http://localhost:8080/testApp/resources/generic/101

参考文献:

  • BalusC,2012年, ``是否基于JSF支持表单的安全性'' ,2013年2月12日访问。
  • Oracle,2013年, “保护Web应用程序的安全” ,2013年2月12日访问。
  • Wolff,N,2005年, “如何使用带有CURL的cookie处理身份验证?” ,2013年2月12日访问。
参考:在dwuysan博客博客中,由我们的JCG合作伙伴 Deny Wuysan提供了JAAS保护的JAX-RS端点 。

翻译自: https://www.javacodegeeks.com/2013/09/jaas-secured-jax-rs-end-point.html

jaas

jaas_受JAAS保护的JAX-RS端点相关推荐

  1. 受JAAS保护的JAX-RS端点

    随着RESTFUL(JAX-RS)作为创建Web服务端点的"首选"方式的问世,很长一段时间以来,我一直想知道人们如何围绕它实现安全机制. 归根结底,我假设JAX-RS的基础实现是s ...

  2. 怎么样给ajax的ulr加密,研究Ajax请求受登录保护的URL的优雅解决

    在此先记下思路. 场景:登录页面login,在一个登录后才能访问的页面dashboard,dashboard上有一个按钮button,button绑定了一个单击事件,触发后发出一个ajax请求,aja ...

  3. 西安市版权申请代理公司怎么选,哪些类型作品受版权保护?

    西安市版权申请代理公司怎么选,版权申请可以直接通过作品登记机关申请:各省.自治区.直辖市版权局负责本辖区的作者或其他著作权人的作品登记工作.也可以交给版权代理公司申请. 经验丰富的代理公司可以提高申请 ...

  4. 帕斯卡计算机介绍,帕斯卡计算机:第一台受专利保护的计算机

    本文转自[科技日报]: 清华科学博物馆制作的帕斯卡计算器的互动模型图片来源:清华科学博物馆 科海拾贝 1642年,年仅19岁的法国数学家.物理学家.哲学家布莱兹·帕斯卡(Blaise Pascal,1 ...

  5. 帕斯卡计算机结构,帕斯卡计算机: 第一台受专利保护的计算机

    清华科学博物馆制作的帕斯卡计算器的互动模型图片来源:清华科学博物馆 1642年,年仅19岁的法国数学家.物理学家.哲学家布莱兹·帕斯卡(Blaise Pascal,1623-1662年)发明了一种机械 ...

  6. 本网站受海外服务器保护,该网站服务器受美国保护

    该网站服务器受美国保护 乌和安 485万字 58人读过 全本 裴度,字中立,河东闻喜人.擢进士第.进御史中丞.宣徽五坊小使方秋阅鹰狗,所过挠官司,厚得饷谢乃去.下邽令裴寰,才吏也,不为礼,因构寰出丑言 ...

  7. 巴比特 | 元宇宙每日必读:美版权局判定用AI工具生成的图片不受版权保护,官方解释:AI生成具有不可预测性,但并非一刀切...

    摘要:据GameLook报道,一名图书作者Kristina Kashtanova此前为其创作的漫画书<Zarya of the Dawn>向美国版权局提起注册,书中使用了部分由Midjou ...

  8. Android media 测试,如何在ANDROID中检测媒体文件是否受DRM保护?

    我尝试使用Android VideoView(媒体播放器)播放MPEG4文件 . 但它给出了以下错误 . 这是日志 . VERBOSE/MediaPlayerService(64): setDataS ...

  9. 什么是受 DRM 保护的内容?

    简介:当谈到数字媒体世界中的内容时,您当然需要借助 DRM(数字版权管理)技术来保护您的创作或内容.让我们简要了解什么DRM以及什么是受 DRM 保护的内容. 什么是DRM? 在当今的数字时代,我们可 ...

最新文章

  1. Linux 黑话解释:什么是定时任务
  2. Lightroom Classic CC8.2安装教程 IT宝盒 10-14 20:32
  3. php document.getel,javascript 密码强弱度检测万能插件_javascript技巧
  4. django 视图-----视图函数
  5. 【算法】排序_基数排序
  6. soapui 测试webservice
  7. 关于杭州电子科技大学毕业论文格式设置
  8. 发红包的程序代码java_Java实现微信发红包
  9. php脾组词,脾组词_脾字组词_脾的组词意思及拼音
  10. Python中tkinter库
  11. 元旦给计算机老师的贺卡,元旦给老师的祝福语贺卡
  12. 【《Multimodal Transformer for Unaligned Multimodal Language Sequences》论文翻译】
  13. 基于java/php/python的毕业设计管理系统开题报告
  14. 老韩思考:为什么毕业后3年,同学之间相差如此大?
  15. 使用工具 SQL Tuning Expert for Oracle 优化SQL语句
  16. ethtool在Linux里的交互
  17. 近几年天猫双十一交易额数据是多少
  18. Bandzip右键菜单离奇消失解决办法
  19. [Apple]通过Apple ID登录App时提示“共享”和“隐藏”邮件地址的问题
  20. 一本英文书|让在华外资企业了解中国网络安全等级保护实施条例

热门文章

  1. NCPC2018 D.Delivery Delays[二分答案+DP check]
  2. Dubbo(四)之xml配置方式
  3. Java5泛型的用法,T.class的获取和为擦拭法站台
  4. 图说:为什么Java中的字符串被定义为不可变的
  5. git合并分支的策略(赞)
  6. python的三元运算
  7. 插值查找+代码实现+注意事项
  8. Python MySQL 插入表
  9. 进程与服务的签名_苹果app签名需要注意哪几点
  10. java.util.concurrent.locks.Lock文档说明