- 论坛徽章:
- 0
|
翻译水平有限,轻点拍砖
===========================================
refference:http://java.sun.com/security/jaas/doc/api.html
可以将JAAS的类分为三个部分:认证和授权共有的类(Common Classes),认证部分的类(Authentication Classes),授权部分的类(Authorization Classes)。下面就分别介绍一下。
(一) Common Classes
这是认证和授权部分所共有的一些类的集合。核心类有:
1. Subject,是一个代表实体比如人或者服务的一系列信息的类,包含了实体的主特征(Principals),公共凭证(public predentials),私有凭证(private predentials);
2. Principals,和Subject相结合,代表了Subject的身份,实现了java.security.Principal和java.io.Serializable接口。
3. Credentials,公共凭证和私有凭证都不是JAAS核心类库的一部分,可以是任意的java类,开发人员可以开发自己的Credentials类,实现Refreshable和Destroyable接口。
1).Refreshable:提供给一个credential对象刷新能力的接口。比如说:一个credential对象可能有特殊的时间跨度的限制,通过刷新看其是否仍旧有效。该接口有两个方法:isCurrent(),refresh()需要Credentials类实现。
2).Destroyable,该接口提供消毁credential对象的能力,清除该对象的信息。有两个方法:isDestroyed(),destroy().
(二) Authentication Classes
认证身份是否合法时,通常要执行下面的几步:
1. 应用初始化一个LoginContext实例;
2. LoginContext 咨询Configuration获得所有用于该应用的LoginModules;
3. 应用触发LoginContext的login()方法;
4. Login方法触发该应用的所有LoginModules。每个LoginModule都试图去验证Subject的身份。验证成功,LoginModule将把相应的特征(Principals)及凭证关联到该Subject上;
5. LoginContext返回验证的结果给应用;
6. 如果验证成功,应用将从LoginContext得到验证过了的Subject。
介绍Authentication的类库:
1. LoginContext类,提供基本的方法来验证Subjects的身份,并提供了把应用和下层的认证技术分开的方法。LoginContext在认证的时候向Configuration咨询来确定所用的是那种认证服务,或者是哪个LoginModules,这样不同的LoginModules可以堆叠在同一个应用中而不需要对应用进行任何的修改。
下面的代码是如何验证及注销的:
// let the LoginContext instantiate a new Subject
LoginContext lc = new LoginContext("entryFoo");
try {
// authenticate the Subject
lc.login();
System.out.println("authentication successful");
// get the authenticated Subject
Subject subject = lc.getSubject();
...
// all finished -- logout
lc.logout();
} catch (LoginException le) {
System.out.println("authentication unsuccessful"+le.printStackTrace());
}
2. LoginModule接口,使开发者可以把不同的验证技术堆叠在同一应用下。例如,一个LoginModule可以执行基于用户名/密码的表单形式的认证,另一种LoginModule可以基于硬件设备如智能卡等的验证。
3. CallbackHandler接口,LoginModules利用CallbackHandler来和用户交互得到用户的验证信息。LoginModules通过该接口得到用户所输入的信息,也可以提供给用户诸如认证状态的信息。应用可以定制CallbackHandler,例如,用户可以通过图形界面方式提示输入用户名,密码,也可以仅仅通过命令行简单的提示,可以看出LoginModules依旧独立于和用户交互的方式。
4. Callback接口,LoginModules可以传一系列的Callback对象给Callbackhandler的handle()方法,详细的信息请参考Callback API
(三) Authorization Classes
通过认证后,就会根据在一个JAAS Policy文件中设定好的规则进行访问控制。
1. Policy类,是一个抽象类,代表了JAAS架构的访问控制策略。默认情况下,提供了基于对文件级的访问控制。Policy的子类必须实现一下两个方法:
public abstract PermissionCollection getPermissions
(Subject subject,
CodeSource codesource);
public abstract void refresh();
getPermissions方法返回赋予制定Subject的权限。Refresh()方法不断的更新不断的根据策略进行调整。下面给出了一部分代码来看看如何赋予用户Subject权限。
// grant entry syntax for the default JAAS policy
grant CodeBase ["URL"],
Signedby ["signers"],
Principal [Principal_Class] ["Principal_Name"],
Principal ... {
permission Permission_Class ["Target_Name"]
[, "Permission_Actions"]
[, signedBy "SignerName"];
...
};
// example grant entry
grant CodeBase "http://foo.com",
Signedby "foo",
Principal com.sun.security.auth.NTPrincipal "admin" {
permission java.io.FilePermission "c:/user/admin", "read, write";
};
如果Policy中没有指定Principal信息,将会抛出异常信息。CodeBase及Signedby部分是可选的。如果没有出现,任意代码将被匹配,任意的signer将被匹配。
在上面的例子中,grant entry规定了从http://foo.com下载的代码,由foo签名,由Windows NT的用户admin运行,在目录“c:/user/admin”中有读写的权限。多个Principals可在一个grant entry中列出来,并且以合集的形式起作用。
2. AuthPermission类,封装了JAAS所要求的基本的permissions。一个AuthPermission对象包含了一个名字,但没有列出行为。通过该类,要么可以得到一个命名了的permission规则,要么什么也得不到。
3. PrivateCredentialPermiSSion类,对访问Subject的私有凭证提供保护。
以上就是JAAS架构的核心类库。 |
|