JBoss AS 7:自定义登录模块

JBoss AS 7很整洁,但是仍然缺少文档(错误消息没有那么有用)。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块,以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。

为什么要使用Java EE标准认证? Java EE安全入门

Java EE规范的一部分是针对Web和EE应用程序的安全性,这使得在web.xml中指定声明性约束成为可能(例如,“角色X是访问URL“ / protected / *”的资源所必需的)”,并且以编程方式对其进行控制,即验证用户是否具有特定角色(请参见HttpServletRequest.isUserInRole )。

其工作方式如下:

  1. 您在web.xml中声明:
    1. 登录配置–主要是使用浏览器提示(基本)还是自定义登录表单以及登录领域的名称
      • 自定义表单对发布操作和字段(以j_开头)使用“魔术”值,这些值由服务器拦截并处理
    2. 应用程序中使用的角色(通​​常是“用户”或“管理员”之类的角色)
    3. 访问特定的URL模式需要什么角色(默认值:无)
    4. 应用程序的某些部分是否需要HTTPS
  2. 您通常通过将其名称与配置中可用的登录模块之一(从简单的基于文件的用户列表到LDAP和Kerberos支持的模块)相关联,来告诉应用服务器如何针对该登录领域对用户进行身份验证。 您很少需要创建自己的登录模块,这是本文的主题。

如果这不是您的新手,那么我强烈建议您阅读Java EE 5教程–示例:保护Web应用程序 (使用JSP页面进行基于表单的身份验证,包括安全性约束规范,使用JAX-WS进行基本身份验证,保护企业Bean,使用isCallerInRole和getCallerPrincipal方法)。

为什么要打扰?

  • 声明式安全性与业务代码完全分离
  • 在Web应用程序与EJB之间传播安全性信息很容易(在EJB中,您可以通过xml或@RolesAllowed之类的注释以声明方式保护完整的bean或特定方法)
  • 切换到其他身份验证机制(例如LDAP)很容易,并且很可能会支持SSO

自定义登录模块实施选项

如果JBoss 提供的现成的登录模块(也称为安全域)(例如UsersRoles,Ldap,Database,Certificate)不足以满足您的需求,则可以调整其中之一或实现自己的登录模块 。 您可以:

  1. 扩展其中一个具体模块,覆盖其一种或某些方法以适应您的需求-请参阅f.ex。 如何重写DatabaseServerLoginModule以指定您自己的存储密码加密方式。 这应该是您的主要选择。
  2. 子类UsernamePasswordLoginModule
  3. 如果需要最大的灵活性和可移植性,请实现javax.security.auth.spi.LoginModule(这是Java EE的一部分,即JAAS ,非常复杂)

JBoss EAP 5 安全指南 12.2。 自定义模块对基本模块(AbstractServerLoginModule,UsernamePasswordLoginModule)以及子类或其他任何标准模块的子类化如何进行了出色的描述,包括对实现/覆盖的关键方法的描述。 您必须阅读它。 (在这方面,该指南仍然完全适用于JBoss AS7 。)定制的JndiUserAndPass模块示例 (扩展了UsernamePasswordLoginModule)也值得一读–它使用模块选项和JNDI查找。

示例:自定义UsernamePasswordLoginModule子类

请参阅MySimpleUsernamePasswordLoginModule的源代码,该源代码扩展了JBoss的UsernamePasswordLoginModule

抽象的UsernamePasswordLoginModule ( 源代码 )通过比较用户提供的相等性密码与从子类实现的getUsersPassword方法返回的密码进行比较。 您可以使用方法getUsername获取尝试登录的用户的用户名。

实现抽象方法

getUsersPassword()

实现getUsersPassword()可以在任何地方查找用户密码。 如果您不以纯文本格式存储密码,请阅读下面的其他方法来自定义行为

getRoleSets()

实现getRoleSets()(来自AbstractServerLoginModule)以返回至少一个名为“ Roles”的组,其中包含分配给用户的0+个角色,请参见此帖子的源代码中的实现。 通常,您会在某个地方查找用户的角色(而不是返回硬编码的“ user_role”角色)。

(可选)扩展initialize(..)以访问模块选项等。

通常,您还需要扩展initialize(Subject subject,CallbackHandler callbackHandler,Map sharedState,Map options) (每次身份验证尝试都需要调用),

  • 要获取通过安全域配置中的<module-option ..>元素声明的属性的值– 请参见JBoss 5定制模块示例
  • 要进行其他初始化,例如通过JNDI查找数据源–请参见DatabaseServerLoginModule

(可选)重写其他方法以自定义行为

如果您不以纯文本形式存储密码(明智的选择!),并且不支持开箱即用的哈希方法,则可以覆盖createPasswordHash(String username,String password,String摘要选项)来哈希/加密用户提供的密码密码与存储的密码进行比较之前。

或者,您可以重写validatePassword(String inputPassword,String ExpectedPassword)以在比较之前对密码进行任何转换,甚至可以进行比相等类型不同的比较。

自定义登录模块部署选项

在JBoss AS中,您可以

  1. <JBoss AS 7> / modules /下 ,将登录模块类作为独立模块独立于Web应用程序部署在JAR中,以及module.xml –在JBossAS7SecurityCustomLoginModules中进行了介绍
  2. 将登录模块类部署为webapp的一部分(不需要module.xml)
    1. 在WEB-INF / lib /中的JAR中
    2. 直接在WEB-INF / classes下

在每种情况下,您都必须在JBoss配置(standalone / configuration / standalone.xml或domain / configuration / domain.xml)中声明一个对应的安全域:

<security-domain name='form-auth' cache-type='default'><authentication><login-module code='custom.MySimpleUsernamePasswordLoginModule' flag='required'><!--module-option name='exampleProperty' value='exampleValue'/--></login-module></authentication>
</security-domain>

code属性应包含您的登录模块类的完全限定名称,并且安全域的名称必须与jboss-web.xml中的声明匹配:

<?xml version='1.0' encoding='UTF-8'?>
<jboss-web><security-domain>form-auth</security-domain><disable-audit>true</disable-audit>
</jboss-web>

编码

下载包含自定义登录模块MySimpleUsernamePasswordLoginModule 的webapp jboss-custom-login ,并按照README中的部署说明进行操作。

参考: The Holy Java博客上的JCG合作伙伴 Jakub Holy 在JBoss AS 7(及更早版本)中创建自定义登录模块 。


翻译自: https://www.javacodegeeks.com/2012/06/jboss-as-7-custom-login-modules.html

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

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

相关文章

MySQL安装步骤及相关问题解决

1. 下载MySQL Server&#xff0c;网址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 点击MySQL5.5.21的安装文件&#xff0c;出现安装向导界面&#xff0c;单击“next”继续安装&#xff1a; 3. 选择接受协议&#xff0c;单击“next”继续安装&#xff1a; 4. 在出现选…

matlab的数学函数,matlab中常见数学函数的使用

matlab中常见数学函数的使用 MATLAB 基本知识 Matlab 的内部常数 pi 圆周率 exp(1) 自然对数的底数 e i 或 j 虚数单位 Inf 或 inf 无穷大 Matlab 的常用内部数学函数 指数函数 exp(x) 以 e 为底数 log(x) 自然对数&#xff0c;即以 e 为底数的对数 log10(x) 常用对数&#xff…

C++中 list与vector的区别

C中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的区别 1.vector数据结构vector和数组类似&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变。因此能高效的进行随机存取&#xff0c;时间复杂度为o(1);但因为内…

使用Struts 2的查询网格(无插件)

当将jQuery与struts 2一起使用时&#xff0c;开发人员被说服使用struts2-jQuery插件 。 因为大多数论坛和其他Internet资源都支持struts2 jQuery插件。我有这种经验。 我想将Struts 2使用jQuery Grid插件&#xff0c;但不使用struts2 jQuery插件。 对于我而言&#xff0c;很难找…

php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例

ReflectionMethod::getClosure()函数是PHP中的一个内置函数&#xff0c;用于为该方法返回动态创建的闭包&#xff0c;否则&#xff0c;在出现错误的情况下返回NULL。用法:Closure ReflectionMethod::getClosure ( $object )参数&#xff1a;该函数接受参数对象&#xff0c;该参…

java学习笔记--IO流

第十二章大纲&#xff1a; I/O input/output 输入/输出 一、创建文件&#xff0c;借助File类来实现 file.createNewFile() &#xff1a; 创建文件 file.exists() &#xff1a; 判断文件是否存在&#xff0c;如果存在&#xff0c;则返回true delete() &#xff1a; 删除文件&…

linux命令之kill篇

作业四&#xff1a;查询firewall进程&#xff0c;然后杀死 [rootlocalhost 桌面]# ps -aux |grep firewall root 772 0.0 2.0 327912 20704 ? Ssl 15:23 0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid root 5323 0.0 0.0 112660…

ActiveMQ网络连接器

这篇文章对我和任何对网络连接器如何为ActiveMQ工作感兴趣的ActiveMQ贡献者而言都是更多的内容。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的东西&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入有误&…

《程序设计与数据结构》第3周学习总结

学号 20162317 《程序设计与数据结构》第3周学习总结 教材学习内容总结 第三章的内容相比之前两章更为具体&#xff0c;介绍的内容更为集中&#xff0c;主要说到了类和对象的问题&#xff0c;其中也仔细介绍了String类、Random类、Math类、NumberFormat类等类。此外也说到了与类…

Java中带有JWebSocket的WebServerSocket

首先&#xff0c;转到http://jwebsocket.org/下载2个软件包Server and Client。 如果要查看源代码&#xff0c;请下载源代码包。 服务器 解压缩服务器程序包。 转到“ conf”文件夹 选择“ jWebSocket.xml”文件打开 编辑“ jWebSocket.xml”文件&#xff0c;在标签<dom…

OpenCV入门指南----人脸检测

本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测&#xff08;人脸识别&#xff09;。人脸检测可以说是学术界的宠儿&#xff0c;在不少EI&#xff0c;SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让…

matlab提取艾里斑,艾里斑:我不是雀斑

正是艾里斑&#xff0c;限制了光学仪器的精度我们知道凸透镜能把入射光会聚到它的焦点上&#xff0c;由于透镜的口径有一定大小&#xff0c;限制了光线的传播&#xff0c;所以凸透镜也会发生衍射。这导致透镜无法把光线会聚成无限小的点&#xff0c;而只会在焦点上形成具有一定…

mysql启动错误排查-无法申请足够内存

一般情况下mysql的启动错误还是很容易排查的&#xff0c;但是今天我们就来说一下不一般的情况。拿到一台服务器&#xff0c;安装完mysql后进行启动&#xff0c;启动错误如下&#xff1a; 有同学会说&#xff0c;哥们儿你是不是buffer pool设置太大了&#xff0c;设置了96G内存。…

Spring vs Guice:重要的一个关键区别

根据弹簧对象的名称识别它们 不管使用XML还是Java配置都没有关系&#xff0c;Spring范围大致类似于Map <String&#xff0c;Object>结构。 这意味着您不能有两个名称相同的对象 。 为什么这是一件坏事&#xff1f; 如果您的大型应用程序包含许多Configuration类或XML文件…

php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...

我无法弄清楚哪个Query在尝试获取锁定时导致死锁;尝试重新启动事务.我的mysql包装器有以下几行if (mysql_errno($this->conn) 1213) {$this->bug_log(0,"Deadlock. SQL:".$this->sql);}bug_log写入文件的位置.错误日志文件没有死锁错误,但/var/log/mysqld.…

Task和BackTask

一、总结性知识点&#xff1a; 1、Android应用运行时会创建任务Task&#xff0c;用于存放主窗口2、每一个任务包含一个堆栈数据结构&#xff0c;用于保存当前应用已创建的窗口对象&#xff0c;这个堆栈即回退栈BackStack3&#xff64; 位于回退栈顶的窗口会处于焦点状态4&#…

Java面试题二

1、public、private、protected、Friendly的区别与作用域 public,protected,friendly,private的访问权限如下&#xff1a; 关键字 当前类 包内 子孙类 包外 public √ √ √ √ protected…

使用Spring Roo进行快速云开发–第1部分:Google App Engine(GAE)

Spring Roo是在Java平台上提供快速应用程序开发的工具。 我已经解释了何时使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持两种针对云计算的解决方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

mysql 重装,Windows系统中完全卸载MySQL数据库实现重装mysql

一、在控制面板&#xff0c;卸载MySQL的所有组件控制面板——》所有控制面板项——》程序和功能&#xff0c;卸载所有和MySQL有关的程序二、找到你的MysQL安装路径&#xff0c;看还有没有和MySQL有关的文件夹&#xff0c;全删如果安装在C盘&#xff0c;检查一下C:\Program File…

loadrunner 关联

1、记住关联的位置&#xff08;之前&#xff09;&#xff0c;因为登录之前需要token&#xff0c;才能验证登录是否成功&#xff0c;所以&#xff0c;放在登录之前 转载于:https://www.cnblogs.com/zyp1/p/5692343.html