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)
)
出于身份验证目的,用户名与用户名列中存储的数据匹配 , 密码应当以十六进制编码的 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 } } ] )
这会在旧 安全 子系统中产生以下 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>
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} } ] )
这会在服务器配置文件的 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>
Elytron 现在使用 JDBC 域配置来管理数据库身份验证。Elytron 比 PicketBox 更高效,因为它使用一个 SQL 查询来获取所有用户属性和凭据,然后从 SQL 结果中提取数据并创建用于身份验证的属性映射。