隨筆 - 37  文章 - 29  trackbacks - 0


          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          最新評論

          閱讀排行榜

          評論排行榜

          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.aygfsteel.com/fastunit/archive/2008/01/28/178204.html




          posted on 2008-08-02 13:52 EvanLiu 閱讀(797) 評論(0)  編輯  收藏 所屬分類: Java基礎
          主站蜘蛛池模板: 大安市| 铜川市| 定襄县| 明光市| 司法| 宝山区| 西和县| 河池市| 乌鲁木齐县| 上蔡县| 远安县| 商城县| 阜阳市| 交城县| 渝北区| 武清区| 白银市| 长寿区| 石狮市| 乡宁县| 盐津县| 阿克| 盐城市| 班玛县| 农安县| 株洲县| 蓬安县| 津南区| 鄂托克旗| 东莞市| 眉山市| 宣汉县| 五指山市| 彰化市| 朝阳市| 镇沅| 甘泉县| 晴隆县| 洛阳市| 洮南市| 黔西|