欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

JBoss AS 7:自定义登录模块

发布时间:2023/12/3 编程问答 68 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 )。

其工作方式如下:

  • 您在web.xml中声明:
  • 登录配置–主要是使用浏览器提示(基本)还是自定义登录表单以及登录领域的名称
    • 自定义表单对发布操作和字段(以j_开头)使用“魔术”值,这些值由服务器拦截并处理
  • 应用程序中使用的角色(通​​常是“用户”或“管理员”之类的角色)
  • 访问特定的URL模式需要什么角色(默认值:无)
  • 应用程序的某些部分是否需要HTTPS
  • 您通常通过将其名称与配置中可用的登录模块之一(从简单的基于文件的用户列表到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)不足以满足您的需求,则可以调整其中之一或实现自己的登录模块 。 您可以:

  • 扩展其中一个具体模块,覆盖其一种或某些方法以适应您的需求-请参阅f.ex。 如何重写DatabaseServerLoginModule以指定您自己的存储密码加密方式。 这应该是您的主要选择。
  • 子类UsernamePasswordLoginModule
  • 如果需要最大的灵活性和可移植性,请实现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中,您可以

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

    总结

    以上是生活随笔为你收集整理的JBoss AS 7:自定义登录模块的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。