缘起
一直被这个三头恶犬欺负,今天我们分析一下它们的实现机制。
一提到kerberos,就会想起来一些概念,keytab, principal, tgt, ticket, KDC, JAAS, subject, credential, UGI, GSS等,概念难懂,代码也很难理解。
kerberos本身的概念这里就不分析了,自行看介绍。主要分析下java代码层面的东西。
初识UGI
首先,这里有个文章不错,大体分析了一下UGI这个对象的一些重要方法。
这里需要对照UGI源码分析。
下面的是一个辅助理解UGI中group如何获得的文章,当然只是辅助,因为只是片面的理解
如果看了代码,就会知道里面很多LoginContext, Subject, LoginModule, Credential之类的对象,其实都是来自于java的JAAS框架,要理清楚头绪,就要看看JAAS庐山真面目
初识JAAS
下面给出2个JAAS代码框架的例子
例子1
Java的安全机制
简单来说,用户首先使用LoginContext的接口进行登录验证。LoginContext可以配置使用不同的验证协议。验证通过后,用户得到一个subject,里面包含凭证,公私钥等。之后,在涉及到需要进行权限认证的地方(例如,资源访问,外部链接校验,协议访问等),使用doAs函数()代替直接执行。
这样,java的权限认证就和用户的业务逻辑分离了。
//一段典型的代码如下
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
例子2
package security;
import java.io.File;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
public class KerberosClient {
public static void main(String[] args) {
String loginModuleName = "KerberosLogin";
Subject subject = new Subject();
<