今天在项目中遇到了JAAS的问题,由于是第一次听这个概念,所以感到一脸茫然。通过看别的人博客以及逛论坛学习,现在终于可以说是知道点皮毛了,现分享给大家。
JAAS(Java Authentication Authorization Service)强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中。
JAAS验证的步骤:
1、首先需要创建一个LoginContext的实例;
2、将一个CallBackHandler对象作为参数传给LoginContext;
3、调用LoginContext的login()方法,进行验证;
4、假如验证成功之后,可以选择LoginContext的getSubject()方法得到Subject做特殊处理。
来个直观点的:
LoginContext lc = new LoginContext("sampleModule.properties");
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());
旁白:LoginContext首先读取sampleModule.properties,然后通过读取的数据决定加载哪个LoginModule对象;在登录时,LoginContext调用LoginModule对象的login()方法验证登录;每个login()方法进行验证操作或获得一个CallbackHandle对象;
CallbackHandle对象通过使用一个或多个CallBack方法同用户进行交互,获得用户输入。
下面列出了在LoginContext中经常使用的三个方法:
login () 进行登录操作。该方法激活了配置中制定的所有LoginModule对
象。如果成功,它将创建一个经过了验证的Subject对象;否则抛出LoginException
异常。
getSubject () 返回经过验证的Subject对象
logout () 注销Subject对象,删除与之相关的Principal对象和凭证
验证:LoginModule
LoginModule是调用特定验证机制的接口。J2EE 1.4中包含了下面几种LoginModule
的实现类:
JndiLoginModule 用于验证在JNDI中配置的目录服务
Krb5LoginModule 使用Kerberos协议进行验证
NTLoginModul 使用当前用户在NT中的用户信息进行验证
UnixLoginModule 使用当前用户在Unix中的用户信息进行验证
同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal
和UnixPrincipal。这些类在com.sun.security.auth包中。
LoginModule接口中包含了五个方法:
initialize () 当创建一LoginModule实例时会被构造函数调用
login () 进行验证
commit () 当LgoninContext对象接受所有LoginModule对象传回的结果后
将调用该方法。该方法将Principal对象和凭证赋给Subject对象。
abort () 当任何一个LoginModule对象验证失败时都会调用该方法。此时
没有任何Principal对象或凭证关联到Subject对象上。
logout () 删除与Subject对象关联的Principal对象和凭证。
在应用程序的代码中,程序员通常不会直接调用上面列出的方法,而是通
过LigonContext间接调用这些方法。
验证:CallbackHandler和Callback
CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那
里收集必要的验证信息,同时独立于实际的收集信息时发生的交互过程。