这两天根据需要,从Oracle 上阅读了整篇关于Jaas技术的详情,这里对Jaas进行了整理。
Jaas主要负责的是 Authentication 和 Authorization。主要分为三个部分:
Common公共部分,Authentication 部分以及 Authorization 部分。
Common公共部分主要是Subject,Principal,Credential。
Subject :
在授权之前,需要对请求的来源加以认证,Jaas定义了Subject表示请求的来源。一旦Subject认证成功,将会在Subject中增加相关的身份信息或者是Principal。一个Subject会有多个Principal,例如一个人可以有名字的Principal,或者身份的Principal。Subject也有与自己相关的安全属性称之为Credential。加密的私钥被存储在私有证书集合中,而公钥证书存储在公钥证书集合中,访问和修改不同证书的集合需要不同的权限。
Principal :
如上所说,当一个Subject认证成功,Principal将会关联到这个Subject。Principal表示Subject的身份表示,必须要实现 java.security.Principal 和 java.io.Serializable 接口。Subject section 描述了更新Principal关联到subject的方法。
Credential :
并不是主要的Jaas代码,任何类可以表示为Credential,并需要实现Credential的两个接口Refreshable和Destroyable。
Authentication 部分:
验证一个Subject需要如下的步骤:
1.应用程序初始化一个LoginContext实例。
2.LoginContext查阅Configuration以加载为该应用配置的所有LoginModule。
3.应用程序调用LoginContext的login方法。
4.login方法调用所有加载的LoginModule方法,每个LoginModule尝试验证Subject。成功后LoginModule会把Principal和Credential与被验证的Subject关联到一起。
5.LoginContext将认证的状态返回给应用程序。
6.如果认证成功,应用程序将从LoginContext中检索出Subject。
LoginModule :
LoginModule接口为开发人员提供了实现不同种类身份验证技术的能力,这些技术可以在应用程序中插入。
CallbackHandler :
Callback :
Authorization部分:
授予访问控制权限不仅基于哪些代码正在运行,还取决于谁在它下面运行,以下是必须的:
用户必须经过身份验证,如LoginContext部分所述。
如Subject部分所述,身份验证结果的Subject必须与访问控制上下文相关联。
必须在安全策略中配置基于委托人的条目。
以下根据说明文档创建了一个Jaas的示例程序,程序目录如下: