Junky's IT Notebook

          統計

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評論排行榜

          14.2 實施保護領域對象的重要步驟

          14.2  實施保護領域對象的重要步驟

          在熟悉Acegi中ACL子系統的各個術語及基本概念后,我們需要通過實際企業應用驗證它們,從而加深對它們的理解。

          14.2.1  RDBMS表的建立

          為了實施基于Acegi ACL領域對象授權支持的企業應用,開發者必須建立好同ACL相關的4張RDBMS表。它們的名字和含義如下。

          l  acl_class:用于存儲領域對象對應的全限定名,比如sample.contact.Contact。

          l  acl_sid:用于存儲ACL授權對象,或者是用戶名,或者是角色名。比如,marissa用戶、ROLE_USER角色。

          l  acl_object_identity:用于存儲領域對象對應的Acl信息。

          l  acl_entry:用于存儲Acl(acl_object_identity)對應的AccessControlEntry信息。默認時,acl_object_identity同acl_entry構成了主從表關系,并以1:N關系存在。

          圖14-8展示了這4張表間的具體關系,這是采用Hibernate Tools獲得的圖形化表示,此外,圖中還展示了Acegi contacts示例存儲領域對象的contacts表、存儲用戶和角色信息的users和authorities表。值得開發者注意的是,contacts、users、authorities表與ACL對應的4張表并無直接聯系。接下來,我們來一一研究這些表的設計和內容。由于Acegi contacts示例采用了HSQLDB RDBMS,因此這些表對應的SQL DDL語句不能夠直接用于其他生產數據庫,比如Oracle 10g、SQL Server 2005。在領會Acegi ACL的思想后,開發者能夠很輕松地給出特定數據庫版本的ACL表定義。

          圖14-8  contacts示例設計的RDBMS表

          其一,users表的定義如下:username列用于存儲用戶名,password列用于存儲密碼,enabled列用于存儲啟用標志位。

          create table users(

                username varchar_ignorecase(50) not null primary key,

                password varchar_ignorecase(50) not null,

                enabled boolean not null

          );

          圖14-9給出了users表中已存儲的示例數據。這里的password列的內容經過了MD5加密處理。

          圖14-9  users表已存儲的示例數據

          其二,authorities表的定義如下:username列用于存儲用戶名,authority列用于存儲角色名。

          create table authorities(

                username varchar_ignorecase(50) not null,

                authority varchar_ignorecase(50) not null,

                constraint fk_authorities_users foreign key(username) references users(username)

          );

          create unique index ix_auth_username on authorities(username,authority);

          圖14-10給出了authorities表中已存儲的示例數據,其中的username列數據引用到users表中username列的數據。默認時,users和authorities表處于1:N的關系。

          圖14-10  authorities表已存儲的示例數據

          其三,contacts表的定義如下:id列用于標識領域對象,contact_name列存儲聯系人的姓名,而email列用于存儲聯系人的郵件地址。

          create table contacts(

                id bigint not null primary key,

                contact_name varchar_ignorecase(50) not null,

                email varchar_ignorecase(50) not null

          );

          圖14-11給出了contacts表中已存儲的示例數據。

          圖14-11  contacts表已存儲的示例數據

          在實際企業應用中,存在大量的領域對象,因而會存在大量的RDBMS表來存儲它們。類似地,實際企業應用存儲用戶、角色信息的RDBMS表也不一定是users、authorities表,相信仔細閱讀過本書相關章節的開發者都知道如何自定義它們。好了,再來研究4張ACL表的SQL DDL語句及相應的示例數據。

          其四,acl_class表的定義如下:id列用于標識領域對象對應的全限定名,而class列用于存儲領域對象對應的全限定名。

          create table acl_class(

                id bigint generated by default as identity(start with 100) not null primary key,

                class varchar_ignorecase(100) not null,

                constraint unique_uk_2 unique(class)

          );

          圖14-12給出了acl_class表中已存儲的示例數據。由于Acegi contacts示例僅僅存在單個Contact領域對象類型,因此這一表僅僅存在單條記錄。

          圖14-12  acl_class表已存儲的示例數據

          其五,acl_sid表的定義如下:principal列用于給定sid列的類型,即同一記錄中存儲了用戶名還是角色名。相比之下,sid列存儲用戶名或者角色名。如果sid列存儲了用戶名,則principal列取值為true;如果sid列存儲了角色名,則principal列取值為false。

          create table acl_sid(

                id bigint generated by default as identity(start with 100) not null primary key,

                principal boolean not null,

                sid varchar_ignorecase(100) not null,

                constraint unique_uk_1 unique(sid,principal)

          );

          圖14-13給出了acl_sid表中已存儲的示例數據。由于sid列存儲的數據都是用戶名,因此principal列取值都為true。在某種程度上,acl_sid對應于Sid對象。

          圖14-13  acl_sid表已存儲的示例數據

          其六,acl_object_identity表的定義如下:id列為主鍵。其中,object_id_class引用到acl_class中的id列取值,圖14-14中的object_id_class列取值都是100,即Contact領域對象類型。類似地,object_id_identity列的內容起到綁定特定領域對象的作用。比如,在contacts示例應用中,object_id_identity列的內容同contacts表中id列的內容保持一致。注意,開發者也可以通過其他策略維護object_id_identity列同特定領域對象間的綁定關系。默認時,我們建議領域對象都能夠含有id屬性,因為ObjectIdentityImpl可能會通過反射機制調用到領域對象的getId()方法,并將返回結果存儲到object_id_identity列。最后,parent_object列用于指定當前ACL的父ACL,而own_sid列用于存儲當前ACL的主人,entries_inheriting列用于指定當前ACL是否繼承父ACL(含有的ACE集合)。可以看出,owner_sid列取值引用到acl_sid中id列取值。

          create table acl_object_identity(

                id bigint generated by default as identity(start with 100) not null primary key,

                object_id_class bigint not null,

                object_id_identity bigint not null,

                parent_object bigint,

                owner_sid bigint,

                entries_inheriting boolean not null,

                constraint unique_uk_3 unique(object_id_class,object_id_identity),

                constraint foreign_fk_1 foreign key(parent_object)references acl_object_identity(id),

                constraint foreign_fk_2 foreign key(object_id_class)references acl_class(id),

                constraint foreign_fk_3 foreign key(owner_sid)references acl_sid(id)

          );

          圖14-14給出了RDBMS acl_object_identity表中已存儲的示例數據。在某種程度上,acl_object_identity對應于Acl對象。

          圖14-14  acl_object_identity表已存儲的示例數據

          其七,acl_entry表的定義如下:id列是主鍵。其中,acl_object_identity表指定當前ACE所屬的ACL,即對應到acl_object_identity表中的id列。類似地,sid列用于存儲當前ACE所屬的授權對象,它對應于acl_sid表中的id列;ace_order列對ACE集合進行排序;mask列存儲ACE權限信息,具體情況請參考BasePermission和CumulativePermission類;granting列表明當前的ACE權限是否已經授給了同一記錄持有的sid列(用戶名或角色);audit_success和audit_failure列用于審計目的,供各種基于Acegi ACL的管理工具在審計ACL(ACE)時使用。開發者可以借助于Acegi暴露的API開發出相應的審計(管理)工具。

          create table acl_entry(

                id bigint generated by default as identity(start with 100) not null primary key,

                acl_object_identity bigint not null,

                ace_order int not null,

                sid bigint not null,

                mask integer not null,

                granting boolean not null,

                audit_success boolean not null,

                audit_failure boolean not null,

                constraint unique_uk_4 unique(acl_object_identity,ace_order),

                constraint foreign_fk_4 foreign key(acl_object_identity) references acl_object_identity(id),

                constraint foreign_fk_5 foreign key(sid) references acl_sid(id)

          );

          圖14-15給出了RDBMS acl_entry表中已存儲的示例數據。在某種程度上,acl_entry對應于AccessControlEntry對象。

          圖14-15  acl_entry表已存儲的示例數據

          posted on 2007-07-03 19:21 junky 閱讀(1021) 評論(0)  編輯  收藏 所屬分類: security

          主站蜘蛛池模板: 贵阳市| 五家渠市| 孝义市| 临城县| 呼和浩特市| 锡林郭勒盟| 鄢陵县| 娄烦县| 手机| 铜川市| 嘉义县| 大关县| 巴塘县| 平远县| 阳曲县| 谢通门县| 桃源县| 平度市| 彰化县| 永昌县| 明水县| 湟中县| 张家港市| 易门县| 中超| 缙云县| 双牌县| 巴马| 陵水| 新河县| 五原县| 虎林市| 盖州市| 台前县| 株洲县| 连江县| 滁州市| 彰武县| 宜川县| 旺苍县| 嘉兴市|