济南网站建设哪家强,深圳市住房和建设局官网电话,企业网站和域名的好处,网页设计代码下载jaas随着RESTFUL#xff08;JAX-RS#xff09;作为创建Web服务端点的“首选”方式的问世#xff0c;很长一段时间以来#xff0c;我一直想知道人们如何围绕它实现安全机制。 归根结底#xff0c;我假设JAX-RS的基础实现是servlet#xff0c;因此其安全性也可能围绕容器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-listwelcome-file/index.jsp/welcome-file!-- 1 --/welcome-file-listsecurity-constraint!-- 2 --display-nameTestConstraint/display-nameweb-resource-collectionweb-resource-nameTestResource/web-resource-namedescription/url-pattern/*/url-pattern/web-resource-collectionauth-constraintdescription/role-nameUser/role-namerole-nameAdmin/role-name/auth-constraint/security-constraintlogin-config!-- 3 --auth-methodFORM/auth-methodrealm-nametestRealm/realm-nameform-login-configform-login-page/login.html/form-login-pageform-error-page/error.html/form-error-page/form-login-config/login-configsecurity-role!-- 4 --description/role-nameUser/role-name/security-rolesecurity-role!-- 5 --description/role-nameAdmin/role-name/security-role 让我们一一讲解它们。 这是成功登录后将显示的文件。 您也可以将此文件用作重定向。 例如假设您有一个名为index.xhtml的文件一个JSF页面则可以使用response.sendRedirect(index.jsf); 这是实际的约束即如何保护应用程序。 此部分基本上可以保护所有对应用程序的访问以/* url模式表示并且仅允许以User和Admin角色访问用户。 这部分表示我们正在使用的是FORM身份验证方法我将在下一部分中对其进行详细说明。 重要的部分是确保使用的安全领域的名称正确在这种情况下该名称为testRealm 即与我们通过Glassfish管理页面进行设置时提供的相同领域名称。 另一部分是设置包含j_security_check的页面如果尚未验证请求访问权限则应用程序将自动重定向到该页面。 已知角色 与上一节相同。 glassfish-web.xml 我们还需要配置glassfish-web.xml以便容器知道数据库中组之间的映射以及应用程序识别的角色。 ?xml version1.0 encodingUTF-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-urlsecurity-role-mappingrole-nameAdmin/role-namegroup-nameAdmin/group-name/security-role-mappingsecurity-role-mappingrole-nameUser/role-namegroup-nameUser/group-name/security-role-mappingclass-loader delegatetrue/jsp-configproperty namekeepgenerated valuetruedescriptionKeep 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_check j_username和j_password Oracle 2013。 !DOCTYPE html
htmlbodyform actionj_security_check methodpostpstrongUsername/stronginput typetext namej_username size25 //ppstrongPassword/stronginput typepassword size15 namej_password //ppinput typesubmit valueSubmit /input typereset valueReset //p/form/body
/html 完成所有这些操作后我们可以启动Glassfish部署我们的应用程序并使用任何浏览器对其进行测试。 访问该应用程序后应将用户定向到login.html进行登录。 请记住使用hpotter作为用户名并test作为密码。 成功登录后应将用户重定向到index.jsp 根据您的要求该重定向又将用户重定向到index.jsf或index.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;GETPath({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标题为Acceptapplication / json和Content-Typeapplication / jsoncURL 2013 由于我们已经保护了我们的应用程序因此上述调用将无法进行。 用户将被重定向到login.html 。 因此我们现在的目标是首先登录。 使用cURL我们可以提交登录参数即用户名和密码然后获取cookie。 为此我们可以使用以下命令 curl -b cookies.txt -c cookies.txt -d j_usernamehpotterj_passwordtest 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 参考文献 BalusC2012年 是否基于JSF支持表单的安全性 2013年2月12日访问。 Oracle2013年 “保护Web应用程序的安全” 2013年2月12日访问。 WolffN2005年 “如何使用带有CURL的cookie处理身份验证” 2013年2月12日访问。 参考在dwuysan博客博客中由我们的JCG合作伙伴 Deny Wuysan提供了JAAS保护的JAX-RS端点 。 翻译自: https://www.javacodegeeks.com/2013/09/jaas-secured-jax-rs-end-point.htmljaas