Java快速開發(fā)平臺

          www.fastunit.com

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks

          JAAS:Java Authentication and Authorization Service,提供了認(rèn)證和授權(quán)框架。

          本例是認(rèn)證的實現(xiàn),JAAS定義了可插拔的認(rèn)證機制,使認(rèn)證邏輯獨立開來,可通過修改配置文件切換認(rèn)證模塊。

          官方參考:
          http://java.sun.com/products/archive/jaas/
          http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html
          security.pdf

          一、配置文件及設(shè)置

          1. 配置文件(假設(shè)為D:/jaas.conf):

          Sample{
            com.fastunit.samples.jaas.SampleLoginModule required debug
          =false;
          };

          此文件定義了一個“Sample”驗證模塊,使用SampleLoginModule來進(jìn)行驗證。

          2. 啟用配置文件:
          -Djava.security.auth.login.config=D:/jaas.conf

          二、客戶端調(diào)用

          import javax.security.auth.login.LoginContext;
          import javax.security.auth.login.LoginException;
          import javax.servlet.http.HttpServletRequest;

          public class LoginManager {

            
          public static boolean login(HttpServletRequest request) {
              
          try {
                String username 
          = request.getParameter("username");
                String password 
          = request.getParameter("password");
                
          //此處指定了使用配置文件的“Sample”驗證模塊,對應(yīng)的實現(xiàn)類為SampleLoginModule
                LoginContext lc = new LoginContext("Sample"new SampleCallbackHandler(
                    username, password));
                lc.login();
          // 如果驗證失敗會拋出異常
                return true;
              } 
          catch (LoginException e) {
                e.printStackTrace();
                
          return false;
              } 
          catch (SecurityException e) {
                e.printStackTrace();
                
          return false;
              }
            }

          }

           

          import java.io.IOException;

          import javax.security.auth.callback.Callback;
          import javax.security.auth.callback.CallbackHandler;
          import javax.security.auth.callback.NameCallback;
          import javax.security.auth.callback.PasswordCallback;
          import javax.security.auth.callback.UnsupportedCallbackException;

          public class SampleCallbackHandler implements CallbackHandler {
            
          private String username;
            
          private String password;

            
          public SampleCallbackHandler(final String username, final String password) {
              
          this.username = username;
              
          this.password = password;
            }

            
          public void handle(Callback[] callbacks) throws IOException,
                UnsupportedCallbackException {
              
          for (int index = 0; index < callbacks.length; index++) {
                
          if (callbacks[index] instanceof NameCallback) {
                  NameCallback ncb 
          = (NameCallback) callbacks[index];
                  ncb.setName(username);
                }
                
          if (callbacks[index] instanceof PasswordCallback) {
                  PasswordCallback pcb 
          = (PasswordCallback) callbacks[index];
                  pcb.setPassword(password.toCharArray());
                }
              }
            }
          }

          三、驗證實現(xiàn)

          import java.io.IOException;
          import java.util.Map;

          import javax.security.auth.Subject;
          import javax.security.auth.callback.Callback;
          import javax.security.auth.callback.CallbackHandler;
          import javax.security.auth.callback.NameCallback;
          import javax.security.auth.callback.PasswordCallback;
          import javax.security.auth.callback.UnsupportedCallbackException;
          import javax.security.auth.login.LoginException;
          import javax.security.auth.spi.LoginModule;

          public class SampleLoginModule implements LoginModule {
            
          private boolean isAuthenticated = false;
            
          private CallbackHandler callbackHandler;
            
          private Subject subject;
            
          private SamplePrincipal principal;

            
          public void initialize(Subject subject, CallbackHandler callbackHandler,
                Map sharedState, Map options) {
              
          this.subject = subject;
              
          this.callbackHandler = callbackHandler;
            }

            
          public boolean login() throws LoginException {
              
          try {
                NameCallback nameCallback 
          = new NameCallback("username");
                PasswordCallback passwordCallback 
          = new PasswordCallback("password",
                    
          false);
                
          final Callback[] calls = new Callback[] { nameCallback, passwordCallback };

                
          // 獲取用戶數(shù)據(jù)
                callbackHandler.handle(calls);
                String username 
          = nameCallback.getName();
                String password 
          = String.valueOf(passwordCallback.getPassword());

                
          // TODO 驗證,如:查詢數(shù)據(jù)庫、LDAP。。。

                
          if (true) {// 驗證通過
                  principal = new SamplePrincipal(username);
                  isAuthenticated 
          = true;
                } 
          else {
                  
          throw new LoginException("user or password is wrong");
                }

              } 
          catch (IOException e) {
                
          throw new LoginException("no such user");
              } 
          catch (UnsupportedCallbackException e) {
                
          throw new LoginException("login failure");
              }
              
          return isAuthenticated;
            }

            
          /**
             * 驗證后的處理,在Subject中加入用戶對象
             
          */
            
          public boolean commit() throws LoginException {
              
          if (isAuthenticated) {
                subject.getPrincipals().add(principal);
              } 
          else {
                
          throw new LoginException("Authentication failure");
              }
              
          return isAuthenticated;
            }

            
          public boolean abort() throws LoginException {
              
          return false;
            }

            
          public boolean logout() throws LoginException {
              subject.getPrincipals().remove(principal);
              principal 
          = null;
              
          return true;
            }
          }

           


          import java.security.Principal;

          public final class SamplePrincipal implements Principal {

            
          private String name;

            
          public SamplePrincipal(String name) {
              
          this.name = name;
            }

            
          public String getName() {
              
          return name;
            }

            
          public boolean equals(Object o) {
              
          return (o instanceof SamplePrincipal)
                  
          && this.name.equalsIgnoreCase(((SamplePrincipal) o).name);
            }

            
          public int hashCode() {
              
          return name.toUpperCase().hashCode();
            }

          }
          posted on 2008-01-28 16:12 FastUnit 閱讀(20315) 評論(11)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 基于JAAS實現(xiàn)登錄 2008-01-28 21:26 BeanSoft
          收藏 支持了!  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2008-01-30 09:09 loocky
          一般來說不用編程的方式來通過JAAS 實現(xiàn)權(quán)限設(shè)置,可以用可配置方式來實現(xiàn),你可以看看SERVLET EJB都有對JAAS的可配置的方式的支持 ,非常方便  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2008-02-14 13:37 FastUnit
          @loocky
          承教。  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2009-02-08 00:24 YinPSoft
          比較清晰,有參考價值  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2009-05-23 19:15 steeven
          loginModule是給個session一個實例嗎?
          如果在多線程環(huán)境下,成員變量在pricipal在commit()的時候可能已經(jīng)變掉了  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2009-06-06 10:54 lao
          好東西!  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2009-08-30 17:59 jaas
          似乎jaas沒什么實用價值  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄[未登錄] 2009-08-31 15:13 steeven
          jboss安全的基石啊  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2010-06-10 15:57 zone
          http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/GeneralAcnAndAzn.html#RunAzn  回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄 2010-08-26 14:32 啊啊啊
          先圣先師   回復(fù)  更多評論
            

          # re: 基于JAAS實現(xiàn)登錄[未登錄] 2014-12-04 16:51 Abc
          抄來的吧?  回復(fù)  更多評論
            

          主站蜘蛛池模板: 吉安市| 天全县| 隆子县| 崇明县| 嘉兴市| 阿坝县| 承德县| 枝江市| 吴堡县| 晴隆县| 台东市| 拉孜县| 罗山县| 金湖县| 仙游县| 呼图壁县| 喀喇沁旗| 宁乡县| 赤峰市| 师宗县| 凤台县| 马鞍山市| 曲周县| 全州县| 盱眙县| 阳谷县| 什邡市| 滦平县| 双辽市| 崇仁县| 邓州市| 定边县| 岳普湖县| 抚远县| 建湖县| 南宫市| 中西区| 鲜城| 浑源县| 神农架林区| 巍山|