posts - 23,comments - 12,trackbacks - 0

          摘要
            Realm是一個用戶數(shù)據(jù)庫的概念,類似于Unix中的用戶群組,它通過用戶名和密碼來標識一個用戶,這個用戶屬于一定的角色(role)。而一個特殊的web應(yīng)用資源,可以限定某個角色的用戶才被許可訪問。這種許可策略,使得web應(yīng)用的整體權(quán)限控制與應(yīng)用細節(jié)相剝離,從而獲得更好的可配置性。下面我們通過比較常見的基于數(shù)據(jù)庫,使用直接JDBC連接的Realm的配置使用情況,看看它是如何實現(xiàn)粗粒度的ACL的。(2004-03-13 11:21:34)

          --------------------------------------------------------------------------------
          By lanf

          應(yīng)用TOMCAT基于JDBC的的Realm (1)
          作(譯)者:Lanf From LinuxAID

          Realm是一個用戶數(shù)據(jù)庫的概念,類似于Unix中的用戶群組,它通過用戶名和密碼來標識一個用戶,這個用戶屬于一定的角色(role)。而一個特殊的web應(yīng)用資源,可以限定某個角色的用戶才被許可訪問。這種許可策略,使得web應(yīng)用的整體權(quán)限控制與應(yīng)用細節(jié)相剝離,從而獲得更好的可配置性。下面我們通過比較常見的基于數(shù)據(jù)庫,使用直接JDBC連接的Realm的配置使用情況,看看它是如何實現(xiàn)粗粒度的ACL的。

          JDBCRealm

          JDBCRealm是使用JDBC連接關(guān)系數(shù)據(jù)庫的一個Tomcat 4 Realm接口的實現(xiàn)。它可以直接使用你現(xiàn)有的用戶數(shù)據(jù)庫表,來獲取角色用戶的信息,完成驗證。你必須滿足以下條件:

          必須有個有效的數(shù)據(jù)表,里面有所有你需要通過Realm來認證的用戶。這張表必須至少有兩個字段,可以用來標示用戶名和密碼。
          需要有一張表來標明用戶與角色的對應(yīng)關(guān)系,用戶可以有任意個角色,沒有角色也是合法的,這是和UNIX用戶群組的不同之處。同樣這個表也需要兩個字段,來映射用戶名與角色名的對應(yīng)關(guān)系。
          數(shù)據(jù)庫準備

          在我們的例子中,我們建兩張新表來處理realm的認證。
          create table users (
            user_name         varchar(15) not null primary key,
            user_pass         varchar(15) not null
          );

          create table user_roles (
            user_name         varchar(15) not null,
            role_name         varchar(15) not null,
            primary key (user_name, role_name)
          );
           


          JDBC驅(qū)動

          你需要將你的JDBC啟動包放在 $CATALINA_HOME/server/lib 目錄或者 $CATALINA_HOME/common/lib 目錄下,確保Tomcat能通過CLASSPATH找到它。使用mysql數(shù)據(jù)庫的話,你可以使用類似 mm.mysql-2.0.4-bin.jar 的驅(qū)動包;Oracle 9i你可以使用ojdbc14.jar等Oracle自帶的驅(qū)動;PostgreSQL可以在http://jdbc.postgresql.org/ 取得合適的驅(qū)動程序。

          編輯server.xml

          編輯$CATALINA_HOME/conf/server.xml文件,在host里添加如下片段(以MySQL為例)
           <Realm className = 'org.apache.catalina.realm.JDBCRealm' debug='0'
                driverName = 'org.gjt.mm.mysql.Driver'
          connectionURL = 'jdbc:mysql://localhost/authority?user=dbuser&password=dbpass'
                 userTable='users' userNameCol='user_name' userCredCol='user_pass'
             userRoleTable='user_roles' roleNameCol='role_name'/>

           


          其中 jdbc:mysql://localhost/authority?user=dbuser&password=dbpass 是Mysql的連接串,你可以根據(jù)你的需要進行修改。其有關(guān)屬性介紹如下: 屬性 描述
          className Realm的實現(xiàn)類,這里必須是 'org.apache.catalina.realm.JDBCRealm'
           
          connectionName 數(shù)據(jù)庫用戶名
           
          connectionPassword 數(shù)據(jù)庫用戶的密碼
           
          connectionURL 數(shù)據(jù)庫的JDBC連接串
           
          debug Debug的程度,它和Logger相關(guān)配置配合使用,值越高信息越詳細,缺省為0
           
          digest 存儲密碼的加密方式,如果不指定則是明文存儲。指定為 java.security.MessageDigest 之類的類名則要看數(shù)據(jù)庫里表中用戶密碼的存放格式。
           
          driverName 數(shù)據(jù)庫驅(qū)動程序類
           
          roleNameCol 角色表的存放角色名的字段名.
           
          userCredCol 用戶表里存放密碼的字段名
           
          userNameCol 用戶表中存放用戶名的字段名
           
          userRoleTable 角色表的表名(類似/etc/group)
           
          userTable 用戶表的表名
           


          注意點

          如果你對用戶表進行了新增操作和修改操作,那么會實時作用于正要進行登陸操作的用戶;
          用戶已經(jīng)完成登陸后,你對它進行的刪除修改操作,并不能實時作用于用戶的當(dāng)前狀態(tài),只能在此用戶下次登陸的時候生效;(如果是基于表單認證的用戶,是在會話結(jié)束或者他注銷后當(dāng)前認證失效;如果是基礎(chǔ)認證的用戶則需要等到當(dāng)前窗口關(guān)閉)
          對數(shù)據(jù)庫里那兩個表的增刪改管理,你需要自行編寫合適的業(yè)務(wù)代碼,Tomcat并沒有提供標準的實現(xiàn),這是沒有意義的。
          編譯者注:這部分內(nèi)容是幫助newbie理解Realm而直接從Realm Configuration HOW-TO中摘譯的,是我們完整例子所必須要了解并正確配置的部分,不過似乎沒有看到類似的譯文,就做了這件累贅的事情。這系列文章對熟手基本沒有什么幫助,請見諒。

           

          posted on 2005-08-17 09:41 my java 閱讀(550) 評論(0)  編輯  收藏 所屬分類: java身份認證轉(zhuǎn)帖
          主站蜘蛛池模板: 齐齐哈尔市| 南部县| 库尔勒市| 如东县| 陈巴尔虎旗| 鲜城| 九江市| 黄陵县| 高阳县| 军事| 汾阳市| 鄄城县| 普陀区| 牡丹江市| 明光市| 克什克腾旗| 闽侯县| 顺平县| 四会市| 舞阳县| 灵丘县| 武鸣县| 通河县| 宝鸡市| 龙游县| 金川县| 交口县| 武胜县| 中超| 休宁县| 师宗县| 翁牛特旗| 天柱县| 南投县| 林甸县| 闽侯县| 资溪县| 文昌市| 双流县| 保靖县| 德化县|