JAAS:Java Authentication and Authorization Service Java認證和授權服務,從jdk1.4開始就集成JAAS。
目前流行的Acegi中也提供了JAAS
JAAS的幾個核心類和接口:
1.Subject: 實際被認證的人或者服務
2.Principal (interface): Subject的唯一標識。一個Subject含有一個或多個Pricipal,比如一個人有身份證、護照等Pricipal
3.LoginContext
4.LoginModule (interface)
5.CallbackHandler (interface)
還有兩個配置文件:×××.conf(或config) 和 ×××..policy
JAAS首先使用一個LoginContext類來查找配置文件中的內容,這些內容可以用來對LoginModules進行初始化。所有
LoginContext沒有指定的初始化參數都會包含在配置文件中。LoginContext向LoginModule傳遞一個CallbackHandler對象和一個Subject,如果LoginModule還需要其他認證信息,它就會用CallbackHandler回調適當的應用程序,從而獲得這些信息。
在應用程序中,一般這樣使用LoginContext:
try {
LoginContext loginContext = new LoginContext("Sample", callbackHandler ); //"Sample"定義在相關的conf文件中; callbackHandler見下面
loginContext.login(); //如果認證失敗,則拋出異常
} catch (LoginException e) {
//do sth.
}
我們要使用JAAS,就需要實現上述接口,以及配置好文件
上面的代碼,只是在應用時,這樣寫就夠了。當然,在這之前,還需要設置callbackHandler:
SampleCallbackHandler callbackHandler = new SampleCallbackHandler();
// 設置用戶名、密碼等需要驗證的信息到callbackHandler里。具體怎么設,看自己的SampleCallbackHandler怎么設計了
......
舉例:
public class SampleCallbackHandler implements CallbackHandler {
protected String username;
protected String password;
public void handle(Callback[] callbacks)
throws UnsupportedCallbackException { //這個方法是必須實現的,用來設置username和password到對應的Callback變量中
for (int index = 0; index < callbacks.length; index++) {
if (callbacks[index] instanceof NameCallback) {
NameCallback ncb = (NameCallback) callbacks[index];
ncb.setName(username);
} else if (callbacks[index] instanceof PasswordCallback) {
PasswordCallback pcb = (PasswordCallback) callbacks[index];
pcb.setPassword(password.toCharArray());
} else if() { //如果還有其他需要驗證的信息
...
}
}
//其他方法,諸如設置username和password
}
然后來說前面的"Sample"。這里的"Sample"對應一個Sample.conf文件,這個文件的具體位置可以自己設置。conf文件中配置了對應的LoginModule類,可以是一個或多個,用來做不同的驗證。
public class SampleLoginModule implements LoginModule {
....
}
LoginModule有5個方法需要實現,簡單點寫個方法名得了:
public void initialize(Subject subject, CallbackHandler callbackHandler, Map arg2, Map arg3);
public boolean login() throws LoginException;
public boolean commit() throws LoginException;
public boolean abort() throws LoginException;
public boolean logout() throws LoginException;
業務邏輯主要在login()中實現,步驟包括了從callbackHandler中讀取用戶名密碼,然后該從數據庫驗證就從數據庫驗證,該從配置文件驗證就從配置文件驗證,該從其他系統中驗證就從其他系統中驗證...
Pricipal的實現就不寫了,下面鏈接中的例子寫得很詳細。我的只是給自己理一個大概步驟,以后回顧起來也方便
不過Subject和Pricipal應該有更重要的用處,比如在Authorization中,把pricipal和要可以執行的相關操作對應起來。這個還沒看下去,接觸的代碼中也沒用到。放到以后補充
更多內容,可直接查看sun的JDK文檔http://java.sun.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html
實例:http://www.tkk7.com/fastunit/archive/2008/01/28/178204.html