jaas是一种安全机制,即验证和授权。
LoginContext Ic=new LoginContext("MyExample");
1.当初始化的时候,logincontext对象首先在JAAS配置文件中找到MyExample项,然后根据该项的内容决定加载哪个loginMoudle对象。
2.在登录的时候LoginContext对象调用每个LoginMoudle对象的login()方法。
3.每个login()进行验证操作或获得一个CallBackHandle对象。
4.CallBackHandle对象通过使用一个或者多个CallBack方法同用户进行交互,获得用户输入。
向一个新的subject对象中填入验证信息。
核心的JAAS类和接口。这些类可以被分为三种类型:
普听类型subject,principal凭证
验证LoginContext,LoginModele,CallBackHandle,Callback
授权Policy,AuthPermission,PrivateCredentialPermission
subject类代表一个验证实体,它可以是用户、管理员、Web服务。设备或者其他的过程。该类包含三种类型的安全信息:
身份(Identities):由一个或多个Principal对象表示
公共凭证(public credentials):例如名称或公共秘钥。
私有凭证(Private credentials):例如口令或私有秘钥。
principal对象代表了Subject对象的身份。他们实现了java.security.Principal和java.io.Serializzble接口。在subject类中,最重要的方法是getName()。该方法返回一个身份名称。在subject对象中包含了多个Principal对象,因此它可以拥有多个名称,由于登录名称、身份证号和Email地址都可以作为用户的身份标识,可见用于多个身份名称的情况在实际应用中试一种普遍的情况
subject对象中维护者一组特定的私有和公有的凭证,这些凭证可以通过getPrivateCredentials()和getPublicCredentials()方法获得。这些方法同城在应用程序层中的安全子系统被调用。
LoginContext中经常使用的三个方法:
login()进行登录操作。该方法激活了配置中制定的所有所有LoginModule对象。如果成功,它将创建一个经过验证的subject对象;否则抛出LoginException异常。
getSubject()返回记过验证的Subject对象。
logout()Z注销Subject对象,删除与之相关的Principal对象和凭证。
验证::LoginMoudle
LoginModule是调用特定验证机制的接口。将J2EE 1.4中包含了下面几种LoginMoudle的实现类:
jndiLoginModule用于验证在JNDI中配置的目录服务
KrbLoginModule使用Kerberos协议进行验证
NTLoginModule使用当前用户在NT中的用户信息进行验证。
UnixLoginModule使用当前用户在Unix中的用户信息进行验证。
同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中。
LoginModule接口包含了五个方法:
initialize()当创建一LoginModule实例时会构造函数调用
login()进行验证。
commit()当LoginContext对象接受所有LoginModule对象传回的结果后将调用该方法。该方法将Principal对象和凭证赋给subject对象。
abort()当任何一个LoginModule对象验证失败时会调用该方法。此时没有任何Principal对象或凭证关联到Subject对象上。
logout()删除与Subject对象关联的Principal对象和凭证。
在应用策划年供需代码中,程序员通常不会直接调用上面列出的方法,而是通过loginContext间接调用这些方法。
验证:CallbackHandle和Callback对象可以使LoginModule对象从系统和与用户那里收集必要的验证信息,同时独立于实际的手机信息时放生的交互过程。
当你的代码构造一个LoginContext对象的时候,你需要把配置文件中申请的名称传递给它。LoginModule将会根据申请中的信息决定激活哪些LoginModule对象,按照什么顺序激活以及使用什么规则激活。
配置文件的结构
Application{
ModuleClass Flag ModuleOptions;
ModuleClass Flag ModuleOptions;
}
下面是一个名称为Sample的申请
Sample{
com.sun.security.auth,module.NTLoginModule Rquired
debug=true;
}
上面这个简单的申请指定了LoginContext对象应该使用NTLoginModule进行验证。类的名称在ModuleClass中指定。
Flag控制当前申请中包含了多个LoginModule时进行登录时的行为:Required、sufficient、requisite和Optional。最常用的是required,使用它意味着对应的LoginModule对象必须被调用,并且必须需要通过所有的验证。
配置文件可以被任意命名,并且可以被放在任何位置,JAAS框架通过使用java.security.auth.long.config属性类确定配置文件的位置。假如当你的应用程序是JaasTest,配置文件时当前目录下的jaas.config,你需要在命令行中输入java-Djava.security.auth.login.config=jass.config JaasTest