电子商务网站建设与管理的论文总结,湘潭新思维网站,海南封岛最新消息,做网站怎么接私活我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后#xff0c;我认为可能是时候重新访问它并提出更新的版本了。 开始了#xff1a; 制备 就像在原始教程… 我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后我认为可能是时候重新访问它并提出更新的版本了。 开始了 制备 就像在原始教程中一样我将依靠某些东西。 确保安装了最新的NetBeans 7.3 beta2包括GlassFish 3.1.2.2和MySQL Community Server5.5.x。 您应该已经验证一切正常并且可以启动GlassFish并且MySQL Server也已启动。 一些基础 GlassFish身份验证领域也称为安全策略域或安全域是GlassFish Server在其上定义和实施通用安全策略的范围。 GlassFish Server已预先配置了文件证书和管理领域。 此外您可以设置LDAPJDBC摘要Oracle Solaris或自定义领域。 应用程序可以在其部署描述符中指定要使用的领域。 如果要将应用程序的用户凭据存储在数据库中则首选是JDBC领域。 准备数据库 启动NetBeans并切换到“服务”选项卡。 右键单击“数据库”节点然后选择“注册MySQL服务器”。 填写安装细节然后单击“确定”。 右键单击新的MySQL节点然后选择“连接”。 现在您将看到所有已经可用的数据库。 再次右键单击并选择“创建数据库”。 输入“ jdbcrealm”作为新的数据库名称。 备注我们不会用一个单独的数据库用户来完成所有这些工作。 强烈建议您这样做但是我在此示例中使用的是root用户。 如果您有用户还可以在此处授予对其的完全访问权限。 点击“确定”。 您将自动连接到新创建的数据库。 展开粗体节点然后右键单击“表”。 选择“执行命令”或通过向导输入表格详细信息。 CREATE TABLE USERS (USERID VARCHAR(255) NOT NULL,PASSWORD VARCHAR(255) NOT NULL,PRIMARY KEY (USERID)
);CREATE TABLE USERS_GROUPS (GROUPID VARCHAR(20) NOT NULL,USERID VARCHAR(255) NOT NULL,PRIMARY KEY (GROUPID)
); 现在这就是数据库的全部内容。 移至下一段。 让GlassFish了解MySQL 首先要做的是从撰写本文时的5.1.22的MySQL网站获取最新最好的MySQL Connector / J。 解压缩mysql-connector-java-5.1.22-bin.jar文件并将其放到您的域文件夹中例如glassfish \ domains \ domain1 \ lib。 做完了 现在终于可以创建一个项目了。 基本项目设置 启动一个新的基于Maven的Web应用程序项目。 选择“新建项目”“ Maven”“ Web应用程序”然后单击下一步。 现在输入一个名称例如secureapp和所有需要的maven坐标然后单击下一步。 选择您配置的GlassFish 3服务器。 选择Java EE 6 Web作为您的EE版本然后点击“完成”。 现在我们需要在GlassFish域中添加更多配置。右键单击新创建的项目然后选择新建其他 GlassFish JDBC连接池。 输入新连接池的名称例如SecurityConnectionPool并在“从现有连接中提取”复选框下方选择您注册的MySQL连接。 点击下一步。 查看连接池属性然后单击“完成”。 现在新创建的Server Resources文件夹显示了sun-resources.xml文件。 遵循步骤并创建一个“新建其他 GlassFish JDBC资源”指向创建的SecurityConnectionPool例如jdbc / securityDatasource。您将在名为glassfish-resources.xml的文件“其他源/设置”下找到已配置的内容。 。 它与应用程序一起部署到您的服务器。 因此您不必在乎使用GlassFish管理控制台配置所有内容。此外我们仍然需要Primefaces。 右键单击您的项目选择“属性”更改为“框架”类别然后添加“ JavaServer Faces”。 切换到“组件”选项卡然后选择“ PrimeFaces”。 单击“确定”完成。 您可以通过打开pom.xml并检查Primefaces依赖项来验证是否可行。 3.4应该在那里。 随时将版本更改为最新的3.4.2。 最终的GlassFish配置 现在是时候启动GlassFish并进行领域配置了。 在NetBeans中再次切换到“服务”选项卡然后右键单击“ GlassFish 3”节点。 选择“开始”并观察“输出”窗口是否成功启动。 再次右键单击并选择“查看域管理控制台”这将打开默认的浏览器指向您http// localhost4848 /。 选择“配置服务器配置安全性领域”然后单击表顶部的“新建…”。 输入名称例如JDBCRealm然后从下拉列表中选择com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm。 在文本字段中填写以下值 贾斯 jdbcRealm 日本国家发展研究院 jdbc / securityDatasource 用户表 使用者 用户名列 用户名 密码栏 密码 组表 团体 组名列 组的名字 保留所有其他默认值/空白然后在右上角选择“确定”。 您会看到一个漂亮JavaScript警告窗口该窗口告诉您_not_保留“摘要算法”字段为空。 我发现了一个关于它的错误。 默认为SHA-256。 与3.1之前使用MD5的GlassFish版本不同。 本教程的较旧版本完全不使用摘要算法“无”。 这是为了使事情变得容易但根本不被认为是好的做法。 因此即使开发也请坚持使用SHA-256。 保护您的应用程序 完成配置环境。 现在我们必须实际保护应用程序。 第一部分是考虑要保护的资源。 跳到您的Web页文件夹然后再创建两个文件夹。 一个叫“管理员”另一个叫“用户”。 其背后的想法是拥有两个单独的文件夹属于相应组的用户可以访问这些文件夹。 现在我们必须创建一些页面。 打开Web Pages / index.xhtml并将hbody标记之间的所有内容替换为以下内容 h:bodySelect where you want to go:br /h:link outcomeadmin/index valueTo the admin section /br /h:link outcomeusers/index valueTo the user section //h:body 现在将新的index.xhtml添加到用户和admin文件夹。 让他们做这样的事情 h:bodyh1Hello Admin|User/h1br /h:link outcome/index valueBack to Homepage //h:body 转到login.xhtml。 在Web文件夹的根目录中使用以下内容创建它。 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
html xmlnshttp://www.w3.org/1999/xhtmlxmlns:phttp://primefaces.org/uixmlns:hhttp://java.sun.com/jsf/htmlh:headtitleLogin Form/title/h:headh:bodyp:panel headerLogin Fromform methodPOST actionj_security_checkUsername: input typetext namej_username /Password: input typepassword namej_password /br /input typesubmit valueLogin /input typereset valueReset //form/p:panel/h:body
/html 如您所见它具有基本的Primefaces ppanel组件该组件具有简单的html形式该形式指向预定义的动作j_security_check。 这就是所有魔力发生的地方。 您还必须包括两个用于用户名和密码的输入字段并带有预定义的名称j_username和j_password。 现在如果用户未输入正确的凭据我们将创建显示的loginerror.xhtml。 使用与上例相同的DOCTYPE和标头。 h:bodyp:panel headerLogin ErrorSorry, you made an Error. Please try again: a href#{facesContext.externalContext.requestContextPath}/ Login/a/p:panel/h:body 唯一的魔术是登录锚的href链接。 我们需要获取正确的请求上下文这可以通过访问faces上下文来完成。 如果没有适当权限的用户尝试访问文件夹则会看到“ 403访问被拒绝”错误页面。 如果要自定义它则需要添加它并将以下几行添加到web.xml中 error-page
error-code403/error-code
location/faces/403.xhtml/location
/error-page 该片段定义了所有未经授权的请求都应转到403页。 如果您已经打开了web.xml让我们开始保护您的应用程序。 我们需要为任何受保护的资源添加安全约束。 尽管安全约束对于Java EE Web应用程序的安全至关重要但它对Web开发人员的了解却很少。 指定URL模式HTTP方法角色和传输约束的组合对于程序员或管理员而言可能是艰巨的。 重要的是要意识到任何旨在安全但未通过安全约束指定的组合都将意味着Web容器将允许这些请求。 安全约束包括Web资源集合URL模式HTTP方法授权约束角色名称和用户数据约束是否需要通过受保护的传输例如TLS接收Web请求。 security-constraintdisplay-nameAdmin Pages/display-nameweb-resource-collectionweb-resource-nameProtected Admin Area/web-resource-namedescription/descriptionurl-pattern/faces/admin/*/url-patternhttp-methodGET/http-methodhttp-methodPOST/http-methodhttp-methodHEAD/http-methodhttp-methodPUT/http-methodhttp-methodOPTIONS/http-methodhttp-methodTRACE/http-methodhttp-methodDELETE/http-method/web-resource-collectionauth-constraintdescription/role-nameadmin/role-name/auth-constraintuser-data-constrainttransport-guaranteeNONE/transport-guarantee/user-data-constraint/security-constraintsecurity-constraintdisplay-nameAll Access/display-nameweb-resource-collectionweb-resource-nameNone Protected User Area/web-resource-namedescription/url-pattern/faces/users/*/url-patternhttp-methodGET/http-methodhttp-methodPOST/http-methodhttp-methodHEAD/http-methodhttp-methodPUT/http-methodhttp-methodOPTIONS/http-methodhttp-methodTRACE/http-methodhttp-methodDELETE/http-method/web-resource-collectionuser-data-constrainttransport-guaranteeNONE/transport-guarantee/user-data-constraint/security-constraint 如果必须定义约束那么容器应如何挑战用户。 Web容器可以使用HTTP BASICHTTP DIGESTHTTPS CLIENT或基于FORM的身份验证方案对Web客户端/用户进行身份验证。 在这种情况下我们使用基于FORM的身份验证并定义JDBCRealm。 login-configauth-methodFORM/auth-methodrealm-nameJDBCRealm/realm-nameform-login-configform-login-page/faces/login.xhtml/form-login-pageform-error-page/faces/loginerror.xhtml/form-error-page/form-login-config/login-config 领域名称必须是您之前分配的安全领域的名称。 关闭web.xml并打开sun-web.xml以进行从应用程序角色名到数据库中实际组的映射。 这种抽象感觉很奇怪但是有一些原因。 引入它是为了可以将应用程序角色映射到企业中的不同组名。 我从未见过广泛使用此功能但是该功能已存在您必须对其进行配置。 其他应用服务器的确假设没有映射则角色名称和组名称确实匹配。 GlassFish不这么认为。 因此您必须将以下内容放入glassfish-web.xml中。 您可以通过右键单击项目的WEB-INF文件夹来创建它选择“新建其他 GlassFish GlassFish描述符” security-role-mappingrole-nameadmin/role-namegroup-nameadmin/group-name/security-role-mapping 就是说基本上……您所需的一切都准备就绪。 唯一缺少的是数据库中的用户。 它仍然是空的……我们需要添加一个测试用户 将测试用户添加到数据库 再次我们首先右键单击NetBeans中“服务”选项卡上的jdbcrealm数据库。 选择“执行命令”并插入以下内容 INSERT INTO USERS VALUES (admin, 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918);
INSERT INTO USERS_GROUPS VALUES (admin, admin); 您可以使用用户admin和密码admin登录并访问安全区域。 生成哈希的示例代码如下所示 try {MessageDigest md MessageDigest.getInstance(SHA-256);String text admin;md.update(text.getBytes(UTF-8)); // Change this to UTF-16 if neededbyte[] digest md.digest();BigInteger bigInt new BigInteger(1, digest);String output bigInt.toString(16);System.out.println(output);} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {Logger.getLogger(PasswordTest.class.getName()).log(Level.SEVERE, null, ex);} 参考来自JCG合作伙伴 Markus Eisele的GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证来自企业软件开发和Java博客。 翻译自: https://www.javacodegeeks.com/2013/02/jdbc-realm-and-form-based-authentication-with-glassfish-3-1-2-2-and-primefaces-3-4.html