使用数据库身份库配置安全性

JSR-375 规范提供了使用数据库身份库的选项。 您可以使用此选项来实现自己的身份库,并精确控制获取用户信息的位置。

有关 JSR-375的更多信息,请参阅 Enterprise Java Security API

关于此任务

遵循以下步骤来认证 Liberty Web 应用程序。 本例使用 HTTP 身份验证和 Db2® 数据库中的数据库身份存储。

过程

  1. 根据您使用的是 Java EE 8、Jakarta EE 9 还是 Jakarta EE 10,将 appSecurity-3.0 功能、 appSecurity-4.0 功能或 appSecurity-5.0 功能添加到 server.xml

  2. 确保已启用 CDI 注释文件扫描。 缺省情况下, CICS® 在 server.xml中将其禁用。 您可以通过以下方法确保对 Web 应用程序启用 CDI 注释文件扫描:
    • 将 CDI 功能部件的相关版本添加到 Liberty 功能部件管理器列表。
    • beans.xml 文件添加到 .war 文件的 WEB-INF 文件夹。
  3. 创建 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"
        }
    )
    
  4. 在数据库中创建表。 例如,要使用 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);
    

    必须对数据库中的密码进行加密。 数据库设置中提供了在数据库中插入加密密码的示例。

  5. 配置 Liberty server.xml:
    1. server.xml中添加 jdbc-4.2 功能部件:
      <feature>jdbc-4.2</feature>
    2. server.xml 中定义与身份存储类上引用的 JNDI 名称相匹配的数据源。 例如:
      <dataSource id="DefaultDataSource" jndiName="jdbc/sec">
          <jdbcDriver libraryRef=<xxx>"/>
          ...
      </dataSource>
      
  6. 创建用于定义对身份库实现返回的角色的访问权的 servlet。 例如:
    @WebServlet("/home")
    @ServletSecurity(@HttpConstraint(rolesAllowed = "ROLE1"))
    public class Servlet extends HttpServlet {...}
    
    在 servlet 类中添加 HTTP 基本身份验证或登录表单注解,例如,要使用基本身份验证,请添加以下文本:
    @BasicAuthenticationMechanismDefinition(realmName="defaultRealm")
  7. 确定是否将身份库凭证映射到 SAF 用户标识。

    如果希望 CICS 任务在从数据库身份库映射的特定 SAF 用户下运行,那么需要执行以下步骤:

    1. <safRegistry/> 元素添加到 server.xml 以启用 SAF 支持。
    2. cicsts:security-1.0 功能部件添加到 server.xml 以确保将 Liberty 主体集声明为 CICS 任务用户标识。
    3. 通过设置以下元素来配置 server.xml 中分布式身份的映射。
      <safCredentials mapDistributedIdentities="true" suppressAuthFailureMessages="false"/>
      
    4. 创建从数据库存储器到 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 错误。 您可以从三个选项中进行选择以解决此错误:

  1. 在 CICS 束中部署,并在 @ServletSecurity rolesAllowed 注释上命名 cicsAllAuthenticated 角色。
  2. 在 CICS 束中部署,但使用 SAF 授权和 SAF 角色映射器。 使用这些选项会绕过 <application-bnd>. 中指定的角色映射
  3. 通过使用 server.xml中的 <application> 元素将应用程序直接部署到 Liberty 中,从而避免使用 CICS 束。

结果

您已成功配置数据库身份库。