7.3.4. 将数据库身份验证配置迁移到 Elytron


本节论述了如何将基于 JDBC 数据源的 PicketBox 身份验证迁移到 Elytron。此处应用标题为 Elytron 的"基于 Migrate Properties 的验证和授权 "部分所提供的大部分信息,特别是有关如何定义安全域和身份验证工厂以及如何将它们映射为身份验证使用的信息。本节不重复这些指令,因此请务必通读该部分,然后再继续。

以下示例假定用户身份验证数据存储在使用类似以下示例语法创建的数据库中。

示例:创建数据库用户表的语法

CREATE TABLE User (
    id BIGINT NOT NULL,
    username VARCHAR(255),
    password VARCHAR(255),
    role ENUM('admin', 'manager', 'user'),
    PRIMARY KEY (id),
    UNIQUE (username)
)
Copy to Clipboard Toggle word wrap

出于身份验证目的,用户名与用户名列中存储的数据匹配 密码应当以十六进制编码的 MD5 哈希形式存储在 密码 列中,用于授权目的的用户角色存储在 角色 列中。

PicketBox 安全域配置为使用 JBDC 数据源从数据库表中检索数据,然后使用它来验证用户名和密码,以及分配角色。假定使用下列管理 CLI 命令配置 PicketBox 安全域:

示例:PicketBox Database LoginModule 配置命令

/subsystem=security/security-domain=application-security:add
/subsystem=security/security-domain=application-security/authentication=classic:add( login-modules=[ { code=Database, flag=Required, module-options={ dsJndiName="java:jboss/datasources/ExampleDS", principalsQuery="SELECT password FROM User WHERE username = ?", rolesQuery="SELECT role, 'Roles' FROM User WHERE username = ?", hashAlgorithm=MD5, hashEncoding=base64 } } ] )
Copy to Clipboard Toggle word wrap

这会在旧 安全 子系统中产生以下 login-module 配置:

示例:PicketBox LoginModule 配置

<subsystem xmlns="urn:jboss:domain:security:2.0">
  <security-domains>
    ...
    <security-domain name="application-security">
      <authentication>
        <login-module code="Database" flag="required">
          <module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
          <module-option name="principalsQuery" value="SELECT password FROM User WHERE username = ?"/>
          <module-option name="rolesQuery" value="SELECT role, 'Roles' FROM User WHERE username = ?"/>
          <module-option name="hashAlgorithm" value="MD5"/>
          <module-option name="hashEncoding" value="base64"/>
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>
Copy to Clipboard Toggle word wrap

7.3.4.1. 将传统数据库身份验证迁移到 Elytron

若要将前面的数据库身份验证示例配置迁移到 Elytron,您必须定义 JDBC 域,以启用 Elytron 数据源访问。

使用下列管理命令来定义 jdbc-realm

/subsystem=elytron/jdbc-realm=jdbc-realm:add(principal-query=[ { data-source=ExampleDS, sql="SELECT role, password FROM User WHERE username = ?", attribute-mapping=[{index=1, to=Roles } ] simple-digest-mapper={algorithm=simple-digest-md5, password-index=2} } ] )
Copy to Clipboard Toggle word wrap

这会在服务器配置文件的 elytron 子系统中配置以下 jdbc-realm

<subsystem xmlns="urn:wildfly:elytron:4.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
  ...
  <security-realms>
    ...
    <jdbc-realm name="jdbc-realm">
      <principal-query sql="SELECT role, password FROM User WHERE username = ?" data-source="ExampleDS">
        <attribute-mapping>
          <attribute to="Roles" index="1"/>
        </attribute-mapping>
        <simple-digest-mapper password-index="2"/>
      </principal-query>
    </jdbc-realm>
    ...
  </security-realms>
  ...
</subsystem>
Copy to Clipboard Toggle word wrap

Elytron 现在使用 JDBC 域配置来管理数据库身份验证。Elytron 比 PicketBox 更高效,因为它使用一个 SQL 查询来获取所有用户属性和凭据,然后从 SQL 结果中提取数据并创建用于身份验证的属性映射。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat