使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全

企业应用程序的常见要求是在登录页面后面保护所有JSF页面。 有时,您甚至希望在应用程序内部具有保护区,只有拥有特定角色的用户才能访问这些保护区。 Java EE标准附带实现受某些安全性约束保护的Web应用程序所需的所有方法。 在此博客文章中,我们希望开发一个简单的应用程序,以演示这些方法的用法,并展示如何为两个不同的角色构建完整的JSF应用程序。 由于该解决方案乍看之下可能会直截了当,因此有一些陷阱需要注意。

我们要关心的第一点是应用程序的文件夹布局。 我们有三种不同的页面:

  • 所有用户都应该可以访问登录页面和错误页面。
  • 我们有一个主页,只有经过身份验证的用户才能访问。
  • 我们有一个受保护的页面,该页面仅对角色roleed-role的用户可见。

因此,将这三种类型的页面放在三个不同的文件夹中:根文件夹src / main / webapp,文件夹src / main / webapp / pages和受保护的页面位于src / main / webapp / pages / protected:

安全网页

web.xml文件是定义我们要使用的角色以及如何将某些URL模式的可访问性映射到这些角色的位置:

<security-constraint><web-resource-collection><web-resource-name>pages</web-resource-name><url-pattern>/pages/*</url-pattern><http-method>PUT</http-method><http-method>DELETE</http-method><http-method>GET</http-method><http-method>POST</http-method></web-resource-collection><auth-constraint><role-name>security-role</role-name><role-name>protected-role</role-name></auth-constraint>
</security-constraint>
<security-constraint><web-resource-collection><web-resource-name>protected</web-resource-name><url-pattern>/pages/protected/*</url-pattern><http-method>PUT</http-method><http-method>DELETE</http-method><http-method>GET</http-method><http-method>POST</http-method></web-resource-collection><auth-constraint><role-name>protected-role</role-name></auth-constraint>
</security-constraint><security-role><role-name>security-role</role-name>
</security-role>
<security-role><role-name>protected-role</role-name>
</security-role>

如您所见,我们定义了两个角色:security-role和protected-role。 只有拥有security-role和protected-role角色的用户才能访问与模式/ pages / *匹配的URL,而/ pages / protected / *下的页面仅限于具有protected-role角色的用户。

您可能会偶然发现的另一点是欢迎页面。 乍一看,您希望将登录页面指定为欢迎页面。 但这是行不通的,因为Servlet容器的登录模块会自动将所有未经授权的访问重定向到登录页面。 因此,我们将应用程序的主页指定为欢迎页面。 这已经是一个受保护的页面,但是当用户直接调用其URL时,它将自动重定向到登录页面。

<welcome-file-list><welcome-file>pages/home.xhtml</welcome-file>
</welcome-file-list>

现在我们几乎完成了web.xml页面。 我们要做的就是定义身份验证方法以及登录页面和错误页面,以防用户输入无效凭据时显示。 必须引起注意的是,这两个页面均不包含受保护的URL(例如CSS或JavaScript文件),否则,甚至禁止访问这两个页面,并且用户会看到Application Server特定的错误页面。

<login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/login.xhtml</form-login-page><form-error-page>/error.xhtml</form-error-page></form-login-config>
</login-config>

在将应用程序部署到JBoss Application Server时,我们提供了一个名为jboss-web.xml的文件,该文件将我们的应用程序连接到安全域:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web><security-domain>java:/jaas/other</security-domain>
</jboss-web>

在standalone.xml中配置了“其他”安全域。 默认配置要求用户传递“ RealmUsersRoles”登录模块,该模块从配置文件夹中的两个文件application-users.properties和application-roles.properties获取其用户和角色定义。 您可以使用提供的添加用户脚本将新用户添加到该领域:

What type of user do you wish to add?a) Management User (mgmt-users.properties)b) Application User (application-users.properties)
(a): bEnter the details of the new user to add.
Realm (ApplicationRealm) :
Username : bart
Password :
Re-enter Password :
What roles do you want this user to belong to? (Please enter a comma separated list, or leave blank for none) : security-role,protected-role
About to add user 'bart' for realm 'ApplicationRealm'
Is this correct yes/no? yes

在这里选择正确的领域(ApplicationRealm)很重要,因为默认情况下,在standalone.xml中为“其他”登录模块配置了该领域。 在这里,您还可以用逗号分隔列表的形式提供用户所拥有的角色。

<form method="POST" action="j_security_check" id=""><h:panelGrid id="panel" columns="2" border="1" cellpadding="4" cellspacing="4"><h:outputLabel for="j_username" value="Username:" /><input type="text" name="j_username"/><h:outputLabel for="j_password" value="Password:" /><input type="password" name="j_password"/><h:panelGroup><input type="submit" value="Login"/></h:panelGroup></h:panelGrid>
</form>

下一步是实现一个简单的登录表单,该表单将其数据提交到登录模块。 请注意输入字段的ID以及表单的操作。 通过这种方式,表单被发布到登录模块,该模块从请求中提取输入的用户名和密码。 JSF开发人员可能想知道为什么我们使用标准HTML表单而不是元素。 原因是JSF表单元素跨越了自己的名称空间,因此输入字段的ID带有表单ID的前缀(并且此ID不能为空)。

如果用户已通过登录表单,我们将向他显示一个主页。 但是,只有拥有protected-role角色的用户才能访问到受保护页面的链接。 这可以通过以下呈现条件来完成:

<h:link value="Protected page" outcome="protected/protected" rendered="#{facesContext.externalContext.isUserInRole('protected-role')}"/>

最后但并非最不重要的一点是,我们需要注销功能。 对于这种情况,我们实现了一个简单的后备bean,类似于以下实例,它使用户的会话无效并将其重定向回登录页面:

@Named(value = "login")
public class Login {public String logout() {FacesContext.getCurrentInstance().getExternalContext().invalidateSession();return "/login";}
}
  • 像往常一样,完整的源代码可以在github上找到。

参考:在Martin's Developer World博客上,从我们的JCG合作伙伴 Martin Mois 通过Java EE安全性和JBoss AS 7.x保护JSF应用程序 。

翻译自: https://www.javacodegeeks.com/2014/01/securing-a-jsf-application-with-java-ee-security-and-jboss-as-7-x.html

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

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

相关文章

java 十六进制转十进制_JAVA知识-分析JAVA中的重点和难点

Java中有很多内容在开发项目的过程中并不常用&#xff0c;但是却是很重要的部分&#xff0c;为了避免忘记&#xff0c;今天重新温习了一遍Java中的重点和难点&#xff0c;借此机会记录一下方便以后查找。本文主要分为以下几个部分&#xff1a;1.进制的相互转换2.Java中位运算符…

java运算符知识整理

赋值运算符: int a 0;a 2;System.out.println("a0"""".."a);int b 0;b2;System.out.println("b0""b2"".."b);int c 0;c-2;System.out.println("c0""c-2"".."c);int d 1;d*2;S…

开放才能进步!Angular和Wijmo一起走过的日子

Angular 已成为广受欢迎的前端框架。去年9月份&#xff0c;期待已久的 Angular2 的正式版发布之后&#xff0c;Angular 又迎来了新一轮热潮。伴随着 Angular 这一路走来&#xff0c;Wijmo 一直都是第一个全面支持各种版本 Angular 的JS控件库&#xff0c;为 Angular 用户提供着…

windows 检查cuda安装_Windows云主机GPU驱动-CUDA安装使用

IE安全相关配置如果打开浏览器无法正常下载&#xff0c;则需要设置Internet Explorer增强的安全配置。设置如下&#xff1a;打开"服务器管理器";点击"本地服务器"&#xff1b;"IE增强的安全配置"&#xff1b;选择"关闭"&#xff1b; 之…

镜像镜像–使用反射在运行时查看JVM内部

开发人员&#xff1a;Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面&#xff0c;它使我们使用的库可以与我们的代码进行交互&#xff0c;而无需对其进行硬编码的知识。…

UnicodeMath数学公式编码_翻译(Unicode Nearly Plain - Text Encoding of Mathematics Version 3)

目录 完整目录1. 简介2. 编码简单数学表达式2.1 分数2.2 上标和下标2.3 空白&#xff08;空格&#xff09;字符使用3. 编码其他数学表达式3.1 分隔符强烈推荐本文简明版UnicodeMath编码教程 本文为UnicodeMath官方文档的翻译&#xff0c;原文看这。翻译如有不准还请谅解&#x…

antd 表格树如何展开_如何分析工作,找出规律,使用excel大幅度提高工作效率...

在职场中&#xff0c;掌握一定的excel知识&#xff0c;有时候可以极大的提高工作效率&#xff0c;减少加班次数。但是有的人可能不知道如何去做&#xff0c;下面我使用一个我前几天遇到的工作场景&#xff0c;一步一步的来给大家展示一下&#xff0c;如何使用excel提高工作效率…

Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)

Wijmo的CompositeChart控件允许您使用一个Chart来分析和展现复杂的数据。相同的数据可以使用不同的可视化效果&#xff0c;不同的图表类型展现在一个图表内&#xff0c;使得用户可以从不同的角度&#xff0c;了解分析这组数据所表达的内容 。 本文将介绍如何使用Wijmo的Composi…

广联达2018模板算量步骤_广联达gtj2021实操案例,新增6大板块,快速提高算量效率...

对于从事造价行业的朋友来说&#xff0c;广联达软件是我们最经常用到的软件&#xff0c;不仅是因为广联达软件能够在提高工作效率&#xff0c;主要还是现在大数据下&#xff0c;广联达软件可以做到更精准、零失误广联达软件更新的也比较快&#xff0c;广联达GTJ2021版已经更新出…

WPF中元素拖拽的两个实例

WPF中元素拖拽的两个实例 原文:WPF中元素拖拽的两个实例今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结&#xff0c;这里主要用两个例子来说明在WPF中如何使用拖拽进行操作&#xff0c;元素拖拽是一个常见的操作&#xff0c;第一个拖拽的例子是将ListBox中的子元素…

使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务

中断了将近半年后发表了一篇新文章。 在本文中&#xff0c;我们将快速了解如何开始使用vert.x&#xff0c;更有趣的是&#xff0c;如何使用RxJava简化异步系统的编程。 我们将涵盖以下主题&#xff1a; 使用Maven创建一个空的vert.x项目 导入IntelliJ并创建一个简单的HTTP服务…

搭建react native所遇到的坑

一、所遇问题 在搭建react native环境中,遇到执行react native run-android命令出现如下问题 1 Could not resolve all dependencies for configuration :classpath. 2 > Could not resolve com.github.dcendents:android-maven-gradle-plugin:3.1.4 3 Required b…

sqlalchemy mysql_使用SQLAlchemy操作MySQL

SQLAlchemy是Python编程语言下的一款开源软件&#xff0c;提供了SQL工具包及对象关系映射(ORM)工具&#xff0c;使用MIT许可证发行。SQLAlchemy首次发行于2006年2月&#xff0c;并迅速地在Python社区中最广泛使用的ORM工具之一&#xff0c;不亚于Django的ORM框架。本文将介绍如…

使用phpstorm+wamp实现php代码实时调试审计

转载自&#xff1a;https://www.bugbank.cn/q/article/5853afaffc0bf4f010ee6ac3.html php调试有N多好用的工具&#xff0c;最近研究到phpstorm配合wamp实现php实时断点调试相当不错&#xff0c;推荐给大家&#xff0c;网上有各种配置版本&#xff0c;但没有一个能好使的。本文…

如何使用Play框架为https配置SSL证书

我花了数小时试图使它起作用&#xff0c;最后&#xff0c;问题是我自己没有使用keytool生成CSR&#xff08;证书请求&#xff09;。 尝试通过https访问Play时&#xff0c;我一直收到此错误&#xff1a; javax.net.ssl.SSLPeerUnverifiedException&#xff1a;对等方未通过身份…

js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索

做前端开发少不了各种利器。比如我习惯用的还是Google浏览器和重型武器Fiddller。一&#xff1a;原始情况 首先大家看看如下的代码&#xff1a;估计90%的程序员都会把js文件放在head中&#xff0c;但是大家有没有深究过呢&#xff1f;很多浏览器都会使用单一的线程来做“界面UI…

【线性代数】3-5:独立性,基和维度(Independence,Basis and Dimension)

title: 【线性代数】3-5:独立性&#xff0c;基和维度(Independence,Basis and Dimension) categories: MathematicLinear Algebra keywords:IndependenceBasisDimensionSpan toc: true date: 2017-09-25 15:20:46Abstract: 本文是本章最重要的知识点&#xff0c;也是整个线性代…

APP网络测试要点和弱网模拟

当前APP网络环境比较复杂&#xff0c;网络制式有2G、3G、4G网络&#xff0c;还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异&#xff0c;都会对用户使用app造成一定影响。另外&#xff0c;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使…

word公式插件_再也不用担心我的公式写不出来了:一款公式输入神器实测

→ → https://mp.weixin.qq.com/s/gNRWdN-W4_Eb2MyyTpWzjw关注微信公众号&#xff1a;人工智能前沿讲习&#xff0c;重磅干货&#xff0c;第一时间送达本文推荐一个公式输入神器&#xff0c;只要截图就能识别公式&#xff0c;手写的公式都能识别。经过实测&#xff0c;几乎没有…

使用Camel在Amazon上构建分布式工作流应用程序

带有SNS-SQS的管道 工作流由按动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程&#xff0c;例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了各种工具来构建分布式和可扩展的工作流应用程序。 构建此类应用程序的一种方法是使用主题和队列来…