受JAAS保护的JAX-RS端点

随着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上下文,将jdbcRealm
  • 填充JNDI名称,最好以"jndi/"开头

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

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

填充数据库以进行测试

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

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

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

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

相关文章

前端必须懂的计算机网络知识—(跨域、代理、本地存储)

前端必须懂的计算机网络知识系列文章&#xff1a; DNS服务器和跨域问题计算机网络的分层模型IP地址和MAC地址前端必须懂的计算机网络知识—(跨域、代理、本地存储)前端必须懂的计算机网络知识—(TCP)前端必须懂的计算机网络知识—(HTTP)前端必须懂的计算机网络知识—(XSS、CSR…

php canvas 前端JS压缩,获取图片二进制流数据并上传

<?php if(isset($_GET[upload]) && $_GET[upload] img){//二进制数据流$data file_get_contents ( php://input ); // 不需要php.ini设置&#xff0c;内存压力小if(empty($data)){$data gzuncompress ( $GLOBALS [HTTP_RAW_POST_DATA] ); // 需要php.ini设…

cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解

模型事件在 Laravel 的世界中&#xff0c;你对 Eloquent 大多数操作都会或多或少的触发一些模型事件&#xff0c;下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;需要的朋友可以参考借鉴。前言Laravel的ORM…

【译】10个有趣的JSCSS库(2018.10)

Tutorialzine每月都会给我们精心挑选优秀的web开发资源&#xff0c;这些资源可以帮助我们解锁最新和最炫酷的网络开发姿势。前端er,让我们一起先睹为快吧&#xff01; WatermelonDB WatermelonDB是用于构建React和React Native应用程序的下一代数据库。快速&#xff0c;高度可…

自定义分页器

好久没来写东西那&#xff01;今天写个自定义分页器给大家参考下吧 首先我们在自己创建的Django项目的app下新建一个utils文件夹&#xff0c;用来放我们的分页器组件 简单说下分页器实现原理&#xff1a; 1.利用ORM查询语句的限制数据条数来确定每页显示的数据 2.设置我们每页显…

五 Vue学习 首页学习 (上)

首页&#xff1a; http://localhost:8002/#/&#xff0c; 登录页面如下&#xff1a; index.js文件中如下的路由配置&#xff0c;转过去看login.vue是如何实现的。 const routes [ { path: /, component: login },&#xff08;这里一个问题&#xff1a; logi…

linux下mqm添加用户,Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接&#xff1a;MQ参考文档http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htmhttp://www-01.ibm.com/support/docview.wss?uidswg27006467MQ下载地址&#xff1a;http://www-03.ibm.com/so…

小程序tabbar这套方案全搞定!

关于微信小程序的tarbar&#xff0c;相信你们都不会陌生 在实现小程序微信原装的tabbar却比较呆板&#xff0c;不够精致&#xff0c;往往不符合自己的要求 这个时候怎么办呢 这套方案接着&#xff01; 先简单的来说一下主要思想:自定义字体图标组件以及tabbar组件&#xff0c…

linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?

Linux服务器管理面板哪家比较好用&#xff1f;发布时间&#xff1a;2020-07-21 06:08:33来源&#xff1a;51CTO阅读&#xff1a;261作者&#xff1a;BirdCloud_1022现在&#xff0c;越来越多的站长朋友都会选择服务器用来搭建网站&#xff0c;但是势必需要我们自己搭建WEB环境&…

spring boot(一)入门

目录 spring boot(一)入门一、简介1、微服务的概念2、什么是spring boot3、快速入门4.springboot的快捷部署spring boot(一)入门 一、简介 1、微服务的概念 说起spring boot&#xff0c;我们不得不说一下“微服务”一词的兴起&#xff0c;微服务一词最早起源于2014年&#xff0…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

理论知识总结 第三章Java基本程序设计结构 1、基本知识&#xff1a;&#xff08;1&#xff09;标识符&#xff1a;是由字母、下划线、美元符号和数字组成&#xff0c;且第一个符号不能为数字。&#xff08;2&#xff09;关键字&#xff1a;剧啊语言中被赋予特定意义的一些单词。…

Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎&#xff0c;可以帮助开发人员以各种领域特定语言&#xff08;DSL&#xff09;&#xff08;例如Java&#xff0c;Spring / XML&#xff0c;scala等&#xff09;创建路由和中介规则。 骆驼用途广泛 Cam…

qt结构体嵌套结构体方法_9.2 C++结构体类型变量

C定义结构体类型变量的方法 1、先声明结构体类型再定义变量名&#xff0c;在定义了结构体变量后&#xff0c;系统会为之分配内存单元。struct Student{ //自定义结构体变量int num;//学号char sex;//性别int age;//年龄};2、在声明类型的同时定义变量 一般形式为struct 结构体名…

Vue解析--如何应对面试官提问

近期不断面试中&#xff0c;面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问&#xff0c;我们应该如何更好应答呢&#xff1f;在这里我把对Vue的理解整理出来供大家来参考。 1.Vue是什么&#xff1f; Vue是一套构建用户界面的渐进式框架&#xf…

Java开发人员的Erlang

您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 原因是我的Soleus骨折了&#xff0c;而我的腿也石膏了。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那天的电视&#xff0c;要么&#xff0c;尽管Kojak和Magnum PI的重播很诱人…

20165339第六周学习总结

课本知识点总结 第八章 String类 使用String类声明对象并创建对象 String s new String("We are students"); String t new String("We are students"); String (char a[])用一个字符数组a创建一个String对象 char a[] {J,a,v,a}; String s new String(a)…

keil5用jlink不到芯片_洛达芯片检测

安卓手机下载一个络达官方的刷机软件然后连接上耳机&#xff0c;打开软件&#xff0c;就可以看到耳机芯片的相关信息。软件下载地址&#xff1a;https://pan.baidu.com/s/1MOXjkHv1wfxWWIVdcsMSFg 提取码: tasc我们的耳机都是络达芯片&#xff0c;不怕你检测&#xff0c;希望用…

层次和约束:项目中使用vuex的3条优化方案

问题描述 使用vuex的store的过程中&#xff0c;发现了一些不是很优雅的地方&#xff1a; store层module太多&#xff0c;找state、getter、mutation、action对应的module比较慢。 组件里面mapGetters、mapActions、mapMutations过多&#xff0c;分不清getter、action、mutati…