這期先介紹有關(guān) Authentication 的部分, JAAS 提供了 PAM ( Pluggable Authentication Module ) 的模塊, 可 以通過標(biāo)準(zhǔn)的 API 建立屬于自己的 LoginModule, 根據(jù) stackable 原理, 進(jìn)而相關(guān)相關(guān)的身份驗(yàn)證程序, 達(dá)到 SSO ( Single Sign-On ) 的 目的.
SECTION 02 JAAS 中幾個(gè)比較常見的 classes
本節(jié)詳細(xì)解說請(qǐng)參考 http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html
普通對(duì)象
- Subject
- Principals
- Credentials
- LoginContext
- LoginModule
- CallbackHandler
- Callback
- Policy
- AuthPermission
- PrivateCredentialPermission
SECTION 03 Tagish.net 的 LoginModules
現(xiàn)在地點(diǎn) http://free.tagish.net/jaas/
最新版本 1.0.3
目前 tagish.net 提供了幾種 LoginModules, 包含了
- com.tagish.auth.DBLogin
- com.tagish.auth.FileLogin
- com.tagish.auth.win32.NTSystemLogin
JAASLogin { com.tagish.auth.DBLogin required dbDriver="sun.jdbc.odbc.JdbcOdbcDriver" dbURL="jdbc:odbc:DBLogin"; };將 Principal 設(shè)置為 com.tagish.auth.TypedPrincipal ( 如果是 NTSystemLogin 則設(shè)置為 com.tagish.auth.win32.NTPrincipal ). 接著, 你的數(shù)據(jù)庫需要一些表,

分別在數(shù)據(jù)庫內(nèi)設(shè)置完成. 當(dāng)你啟動(dòng)你的程序的時(shí)候, 你需要在 classpath 中設(shè)置相關(guān)的 JDBC Driver, 讓 SecurityManager 參考 login.config, 去調(diào)用 DBLogin api, 取得合法或不合法的狀態(tài).
SECTION 04 關(guān)于 PAM stack
Login2 { sample.SampleLoginModule required; com.sun.security.auth.module.NTLoginModule sufficient; com.foo.SmartCard requisite debug=true; com.foo.Kerberos optional debug=true; };假如我們用 Login2 的這種登陸stack, 可以設(shè)置 required, sufficient, requisite, optional 四種狀態(tài).
- required : 驗(yàn)證必須成功, 但是不論成功或失敗都繼續(xù)執(zhí)行下面的登陸模塊, 執(zhí)行所有之后才丟出驗(yàn)證失敗.
- requisite : 驗(yàn)證必須成功, 但是失敗就馬上回去不做其他驗(yàn)證, 必須成功才繼續(xù)執(zhí)行下面的登陸模塊.
- sufficient : 驗(yàn)證可以不要成功, 但是成功了就馬上回去不做其他驗(yàn)證, 失敗可以繼續(xù)執(zhí)行其他的登陸模塊.
- optional : 驗(yàn)證可以不要成功, 但是不論成功或失敗都繼續(xù)執(zhí)行下面的登陸模塊.
不論成功或失敗都會(huì)執(zhí)行 com.sun.security.auth.module.NTLoginModule,
如果 NTLoginModule 驗(yàn)證成功, 因?yàn)槭?sufficient, 系統(tǒng)就認(rèn)定這個(gè)人是合法的使用者,
當(dāng) NTLoginModule 驗(yàn)證失敗, 就會(huì)進(jìn)行 com.foo.SmartCard 的驗(yàn)證,
如果 SmartCard 驗(yàn)證失敗, 就直接宣告你不是合法的使用者,
如果 SmartCard 驗(yàn)證成功, 就繼續(xù)到 Kerberos 的驗(yàn)證模塊,
因?yàn)?Kerberos 是屬于 optional, 所以根本對(duì)身份驗(yàn)證的結(jié)果沒有影響.
Login2 驗(yàn)證的各種狀況列表 | |||||||||
---|---|---|---|---|---|---|---|---|---|
SampleLoginModule | required | pass | pass | pass | pass | fail | fail | fail | fail |
NTLoginModule | sufficient | pass | fail | fail | fail | pass | fail | fail | fail |
SmartCard | requisite | * | pass | pass | fail | * | pass | pass | fail |
Kerberos | optional | * | pass | fail | * | * | pass | fail | * |
Overall Authentication | pass | pass | pass | fail | fail | fail | fail | fail |
SECTION 05 套用 Tomcat 4/5 的 JAASRealm
建立 login.config 放到 $CATALINA_HOME/conf/ 之中, 范例采用 MS SQLServer, jTds.sf.net 的 jdbc driver
JAASLoginModule { com.tagish.auth.DBLogin required dbDriver="net.sourceforge.jtds.jdbc.Driver" dbURL="jdbc:jtds:sqlserver://localhost:1433/JAASDB" dbUser="sa" dbPassword="sa_password" userTable="Users" roleTable="Roles" roleMapTable="RoleMap"; };在 tomcat 啟動(dòng)腳本中加入
JAVA_OPTS=-Djava.security.auth.login.config==C:\tomcat4\conf\login.config 并且修改 server.xml, 讓 appName 去對(duì)應(yīng) login.config 中的 JAASLoginModule, 以及設(shè)置 User/Group 相關(guān)的 Principal
<Realm className="org.apache.catalina.realm.JAASRealm" appName="JAASLoginModule" userClassNames="com.tagish.auth.TypedPrincipal" roleClassNames="com.tagish.auth.TypedPrincipal" debug="99"/>最后設(shè)置 web.xml 中的 login-config 以及要保護(hù)的數(shù)據(jù), 例如
<security-constraint> <web-resource-collection> <web-resource-name>User Protected</web-resource-name> <url-pattern>/protected/*</url-pattern> <url-pattern>/protected.jsp</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>MyJAASRealm</realm-name> </login-config>SECTION 06 結(jié)論
JAAS 除了在一般 Desktop Application 應(yīng)用之外, 對(duì) J2EE 支持將會(huì)是一個(gè)主流, 無論是 JSR 196: Java Authentication Service Provider Interface for Containers 還 是 JSR 115: Java Authorization Contract for Containers ( 已經(jīng)納入 J2EE 1.4 之中 ) 都是對(duì) container 提供者要求標(biāo)準(zhǔn)的 provider 界面, 因此, 將來開發(fā)相關(guān)的程序最好能夠遵循 JAAS, 在異構(gòu)平臺(tái)的整合 上, 才能具備完整的相容性.