posts - 23,comments - 12,trackbacks - 0
          JAAS ( Java Authentication and Authorization Service ) 在 JDK 1.4 正式加入 Java 標(biāo)準(zhǔn)的 Security 模塊, 簡(jiǎn)單來說, JAAS 就是讓我們把身份驗(yàn)證與權(quán)限管控使用標(biāo)準(zhǔn)的方法來開發(fā), 由于大家對(duì) JAAS 的陌生度非常的高, 也不太了解 Application Server 的安全性架構(gòu), 所以這一部分往往會(huì)被忽略 ..


          這期先介紹有關(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
          身份驗(yàn)證相關(guān)的對(duì)象
          • LoginContext
          • LoginModule
          • CallbackHandler
          • Callback
          權(quán)限管控相關(guān)的對(duì)象
          • 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
          一般人大多比較熟悉數(shù)據(jù)庫操作, 首先先建立一個(gè) login.config, 內(nèi)容為
          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í)行下面的登陸模塊.
          所以, Login2 的登陸, 首先我們會(huì)先使用 sample.SampleLoginModule 來驗(yàn)證,

          不論成功或失敗都會(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
          * = 不會(huì)被執(zhí)行. 直接回應(yīng)驗(yàn)證成或失敗


          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)的整合 上, 才能具備完整的相容性.
          posted on 2005-08-17 15:48 my java 閱讀(548) 評(píng)論(0)  編輯  收藏 所屬分類: java身份認(rèn)證轉(zhuǎn)帖
          主站蜘蛛池模板: 屏东市| 自贡市| 喀什市| 宿州市| 彰化县| 通山县| 西华县| 灌南县| 贡嘎县| 梁河县| 辉南县| 广东省| 灵寿县| 威海市| 荥经县| 紫阳县| 华亭县| 县级市| 万山特区| 易门县| 同仁县| 祁连县| 清新县| 牟定县| 盘山县| 博客| 桓仁| 元江| 贺兰县| 靖边县| 弥渡县| 昌都县| 新巴尔虎左旗| 宁明县| 黑山县| 株洲县| 安达市| 沙坪坝区| 武邑县| 凯里市| 麻栗坡县|