# Kerberos

pac4j 允许你使用 Keberos 认证机制(也称为 SPNEGOMicrosoft HTTP Negotiate)登录。

Kerberos 客户端需要定义认证器来处理凭据校验。最可能的是,你只需要将现有的 KerberosAuthenticatorSunJaasKerberosTicketValidator 一起使用,即可完成 Kerberos 票证验证的所有繁重工作。

# 1)依赖

你需要使用以下模块:pac4j-kerberos

示例(Maven依赖项)

<dependency>
    <groupId>org.pac4j</groupId>
    <artifactId>pac4j-kerberos</artifactId>
    <version>${pac4j.version}</version>
</dependency>
1
2
3
4
5

# 2)客户端

你可以使用以下客户端,具体取决于它们在 HTTP 请求中的传递方式:

期望行为 客户端
Web 浏览器(Firefox/Safari/IE)票证验证后,它将用户配置文件存储在 session 中 IndirectKerberosClient (opens new window)
(失败时,它发送带有 WWW-Authenticate:Negotiate 头的 HTTP 401,要求浏览器提供 Kerberos/SPNEGO 凭据)
无状态的 Web 服务 DirectKerberosClient (opens new window)
凭证可以作为请求的 HTTP 头预先提供:
Authentication: Negotiate SomeBase64EncKerberosTicket
(如果未提供,默认策略是发送带有 WWW-Authenticate: Negotiate 头的 HTTP 401,要求远程提供 Kerberos/SPNEGO 凭据)

示例

import org.pac4j.kerberos.client.direct.DirectKerberosClient;
import org.pac4j.kerberos.client.indirect.IndirectKerberosClient;
import org.pac4j.kerberos.credentials.KerberosCredentials;
import org.pac4j.kerberos.credentials.authenticator.KerberosAuthenticator;
import org.pac4j.kerberos.credentials.authenticator.SunJaasKerberosTicketValidator;
import org.pac4j.kerberos.profile.KerberosProfile;
import org.springframework.core.io.FileSystemResource;

SunJaasKerberosTicketValidator validator = new SunJaasKerberosTicketValidator();
// HTTP/fully-qualified-domain-name@DOMAIN
validator.setServicePrincipal("HTTP/www.mydomain.myrealm.lt@MYREALM.LT");
// the keytab file must contain the keys for the service principal, and should be protected
validator.setKeyTabLocation(new FileSystemResource("/private/security/http-keytab"));
// validator.setDebug(true);

IndirectKerberosClient client = new IndirectKerberosClient(new KerberosAuthenticator(validator));
client.setCallbackUrl("/force-kerberos-login"); // required only for indirect client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 3)Kerberos 的常见注意事项(在 JVM 中)

一些常见问题或事项:

  • 确保 keytab 文件包含服务主体,并且名称完全匹配

    • 对于 web,HTTP 或前缀是必填的,必须大写
  • 这里可能需要 Oracle Java(JDK/Java SE等)

    • 大多数加密机制都需要下载 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File,并将其复制到 Java 安装的适当目录中。
  • 浏览器 URL 必须与 setServicePrincipal 中指定的完全限定域名匹配

    • 客户端需要运行 kinit
    • 注:为了在本地开发时测试您的应用程序,可以在 /etc/hosts 中添加指向 localhost 的假域名:
    127.0.0.1 www.mydomain.myrealm.lt
    
    1

原文链接 (opens new window)