使用 Java EE 安全性 API 1.0 为 Liberty JVM 服务器配置安全性

Java EE 8 引入了具有 Java EE 安全性 API 1.0的可移植,灵活且标准化的安全模型。 Liberty JVM 服务器可配置为通过包含 Liberty appSecurity-3.0 功能部件来遵循新的安全性配置。

Java EE 安全性 API 1.0 规范包含三个原则:
  1. 认证机制: HttpAuthenticationMechanism为servlet容器提供
  2. 身份库: 尝试使 JAAS LoginModule 标准化
  3. 安全上下文: 程序化安全性的访问点

认证机制

认证机制是一种用于从 Java Security API稍后处理的用户获取用户名和密码的方法。 有两个用于认证的标准选项,这两个选项都利用 Java EE 安全性 1.0 API 引入的注释。

HTTP 基本认证
基本认证会先显示浏览器的本机登录对话框,然后用户才能访问受保护的资源。
@BasicAuthenticationMechanismDefinition(realmName="user-realm") 
@WebServlet("/home") @DeclareRoles({"user"}) 
@ServletSecurity(@HttpConstraint(rolesAllowed = "user")) 
public class HomeServlet extends HttpServlet { 
    ... 
}
基于表单的认证
您可以使用基于表单的认证将浏览器的内置对话框替换为您自己的定制 HTML 表单。 您可以创建具有注释的应用程序配置类,如下所示:
@FormAuthenticationMechanismDefinition(
    loginToContinue = @LoginToContinue(
        loginPage = "/login",
        errorPage = "/error"
    ) 
)
@ApplicationScoped
public class ApplicationConfig {
    ...
}

身份库

组件充当 DAO (数据访问对象) ,用于访问用户信息,包括其用户名,密码和关联角色。 Java EE 安全性 API 1.0引入了许多身份库类型,包括:
数据库身份库
数据库身份库用于从关系数据库中检索用户信息。
@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"
    }
)
轻量级目录访问协议 (LDAP) 身份存储

LDAP 是在单个组织中组织用户对不同系统的访问的常见方法。 LDAP 实现了 Single-Sign On 的想法,用户具有单个用户名和密码,然后在用于执行特定组织的日常业务的所有不同系统中使用该用户名和密码。

@WebServlet("/home")
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
@LdapIdentityStoreDefinition(
    url = "ldap://localhost:33389/",
    callerBaseDn = "ou=user,dc=jsr375,dc=net", 
    groupSearchBase = "ou=group,dc=jsr375,dc=net"
)
public class HomeServlet extends HttpServlet{ 
    ...
}

URL 用于身份验证的LDAP服务URL。

callerBaseDn: LDAP存储中呼叫者的基本区分名称。

groupSearchBase: 用于查找群组的搜索基础。

定制身份库

除了在 Java EE 安全性 API 1.0中找到的内置身份库外,用户还可以实现自己的身份库并控制获取用户信息的确切位置。 这可以通过创建自定义身份存储类,然后创建与该自定义身份存储关联的 HTTP 身份验证机制来实现。

安全情境信息

安全上下文对象用于以编程方式检查用户访问特定资源的权限。 这在您需要执行定制行为时很有用。 在此示例中,仅当用户有权访问另一个页面时,才会将该用户转发到该页面:

@WebServlet("/home")
public class HomeServlet extends HttpServlet {
    @Inject
    private SecurityContext securityContext;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        if (securityContext.hasAccessToWebResource("/anotherServlet", "GET")) {
            req.getRequestDispatcher("/anotherServlet").forward(req, res);
        } else {
            req.getRequestDispatcher("/logout").forward(req, res);
        }
    }
}

有关 Java EE 8 安全性 API 的更多信息,请参阅 Liberty Knowledge Center 中的 Java EE Security API