使用数据库身份库配置安全性
JSR-375 规范提供了使用数据库身份库的选项。 您可以使用此选项来实现自己的身份库,并精确控制获取用户信息的位置。
有关 JSR-375的更多信息,请参阅 Enterprise Java Security API。
关于此任务
遵循以下步骤来认证 Liberty Web 应用程序。 本例使用 HTTP 身份验证和 Db2® 数据库中的数据库身份存储。
过程
根据您使用的是 Java EE 8、Jakarta EE 9 还是 Jakarta EE 10,将
appSecurity-3.0功能、appSecurity-4.0功能或appSecurity-5.0功能添加到 server.xml 。- 确保已启用 CDI 注释文件扫描。 缺省情况下, CICS® 在 server.xml中将其禁用。 您可以通过以下方法确保对 Web 应用程序启用 CDI 注释文件扫描:
- 将 CDI 功能部件的相关版本添加到 Liberty 功能部件管理器列表。
- 将 beans.xml 文件添加到 .war 文件的 WEB-INF 文件夹。
- 创建 Java 类以实现数据库身份存储,并在应用程序中部署此存储,如以下示例中所示:
@DatabaseIdentityStoreDefinition ( dataSourceLookup = "jdbc/sec", callerQuery = "#{'select password from USR where USERNAME = ?'}", groupsQuery = "#{'select ugroup from USR where USERNAME = ?'}", hashAlgorithm = Pbkdf2PasswordHash.class, priorityExpression = "#{100}", hashAlgorithmParameters = { "Pbkdf2PasswordHash.Iterations=3072", "Pbkdf2PasswordHash.Algorithm=PBKDF2WithHmacSHA512", "Pbkdf2PasswordHash.SaltSizeBytes=64" } ) - 在数据库中创建表。 例如,要使用 SQL 创建 Db2 表:
CREATE TABLE PXX.USR ( USERNAME VARCHAR ( 256 ) NOT NULL, PASSWORD VARCHAR ( 256 ) NOT NULL, UGROUP VARCHAR ( 256 ) NOT NULL ) IN SECU.TSSE; CREATE UNIQUE INDEX INDXUSRS ON PXX.USR (USERNAME);必须对数据库中的密码进行加密。 数据库设置中提供了在数据库中插入加密密码的示例。
- 配置 Liberty server.xml:
- 在 server.xml中添加
jdbc-4.2功能部件:<feature>jdbc-4.2</feature> - 在 server.xml 中定义与身份存储类上引用的 JNDI 名称相匹配的数据源。 例如:
<dataSource id="DefaultDataSource" jndiName="jdbc/sec"> <jdbcDriver libraryRef=<xxx>"/> ... </dataSource>
- 在 server.xml中添加
- 创建用于定义对身份库实现返回的角色的访问权的 servlet。 例如:
@WebServlet("/home") @ServletSecurity(@HttpConstraint(rolesAllowed = "ROLE1")) public class Servlet extends HttpServlet {...}在 servlet 类中添加 HTTP 基本身份验证或登录表单注解,例如,要使用基本身份验证,请添加以下文本:@BasicAuthenticationMechanismDefinition(realmName="defaultRealm") - 确定是否将身份库凭证映射到 SAF 用户标识。
如果希望 CICS 任务在从数据库身份库映射的特定 SAF 用户下运行,那么需要执行以下步骤:
- 将
<safRegistry/>元素添加到 server.xml 以启用 SAF 支持。 - 将
cicsts:security-1.0功能部件添加到 server.xml 以确保将 Liberty 主体集声明为 CICS 任务用户标识。 - 通过设置以下元素来配置 server.xml 中分布式身份的映射。
<safCredentials mapDistributedIdentities="true" suppressAuthFailureMessages="false"/> - 创建从数据库存储器到 SAF 用户标识的身份映射。 此映射是通过使用 RACMAP 命令实现的。
在以下示例中, databaseUserid 是数据库身份库中的身份, safUserid 是用于在 Liberty 中运行的 RACF® 用户标识。 使用数据库身份库时,缺省情况下注册表域名为 defaultRealm。
RACMAP ID(safUserid) MAP WITHLABEL('label-name') USERDIDFILTER(NAME('databaseUserid')) REGISTRY(NAME('defaultRealm'))
- 将
重要说明:
如果在 CICS 束中部署应用程序,那么将在 installedApps.xml 中自动设置安全角色
"cicsAllAuthenticated" ,如下所示:<application ...>
<application-bnd>
<security-role name="cicsAllAuthenticated">
<special-subject type="ALL_AUTHENTICATED_USERS"/>
</security-role>
</application-bnd>
</application>
该 cicsAllAuthenticated 角色优先于存储在数据库身份存储中的组名,因此会出现 HTTP 403 错误。 您可以从三个选项中进行选择以解决此错误:
- 在 CICS 束中部署,并在
@ServletSecurity rolesAllowed注释上命名cicsAllAuthenticated角色。 - 在 CICS 束中部署,但使用 SAF 授权和 SAF 角色映射器。 使用这些选项会绕过
<application-bnd>.中指定的角色映射 - 通过使用 server.xml中的
<application>元素将应用程序直接部署到 Liberty 中,从而避免使用 CICS 束。
结果
您已成功配置数据库身份库。