一個實現RBAC的SQL腳本(二)

原本我想實現用RBAC做一個通用的用戶/角色/權限管理組件,在RBAC中可以實現權限的有無,但不能解決權限的範圍,而在解決權限

範圍的問題,我在RBAC中添加了一些參數字段,試圖用這些東西來解決範圍問題。在設想了幾個應用場景之後,發現我的想法事錯誤

的,在對相同類型的資源實現不同的權限管理(如,論壇的版主等等)不是RBAC的長處,這是ACL的用武之地。補充一句用RBAC也可

以實現,你用一下JForum,看一下它的權限管理,對比一下,你就知道爲什麼大多數的論壇都沒有采用RBAC了。

 

實現一個通用的RBAC組件或許是可行的,但可能會付出很大的代價(開發的難度和運行時的效率)。也許隨着我對更多系統架構和權

限的研究,我會改變我的看法。

 

作爲一個使用主義的程序員,我重新修改了RBAC的數據庫腳本,該腳本僅僅實現了用戶管理和角色管理。這樣在系統中,可以根據需

要組合使用RBACACL了。(RBAC還是很好用的哦)。該腳本也沒有把permission加入在內。這樣主系統有更大的權利來決定權限的

形式了。這個腳本事MSMemberShip的簡化。也是在參考了MSAsp.net Forums論壇系統後,才決定簡化到如此的地步。

 

本腳本也沒有把權限的繼承和互斥納入其中。最爲使用主義的程序員,我現在還沒有足夠的理由來說服我應該是以何種形式把他們加

入其中(本腳本的前一版本包含他們: http://blog.csdn.net/enjoyo/archive/2007/07/17/1694580.aspx)。

 

 

/**********************************************************************/

/* Membership SQL For Mysql                                           */

/*                                                                    */

/* Installs the tables and initialize the membership data             */

/* supporting the Java Project and Hibernate                          */

/*                                                                    */

/* AuthorKevin Yin                                                      */

/* http://blog.csdn.net/enjoyo/                                       */

/* 歡迎對此腳本提出建議,也歡迎使用本腳本構建您的系統,               */

/* 但本人不對你的系統進行任何明示的或暗示的擔保                       */

/* 轉載請保留此聲名                                                   */

/**********************************************************************/

 

/*角色表*/

CREATE TABLE `mbs_roles_t` (

       `nRoleID`              INT NOT NULL

                            AUTO_INCREMENT PRIMARY KEY ,       /*角色ID*/

       `szRoleName`               VARCHAR( 128 ) NOT NULL ,    /*角色名*/

       `szLoRoleName`           VARCHAR( 128 ) NOT NULL ,    /*角色名(小寫)*/

       `bIsSysDef`          INT NOT NULL DEFAULT '0',    /*是系統角色(1)

                                                        還是用戶添加的角色(0)*/   

       `bIsLockedOut`            int not null,                   /*是否被鎖定 0 1鎖定*/

       `szDescription`      VARCHAR( 255 ) NOT NULL ,    /*角色描述*/

       UNIQUE ( `szLoRoleName` )

) ENGINE = MYISAM ;

 

/*用戶表*/

CREATE TABLE `mbs_users_t` (

       `nUserID`             INT NOT NULL

                            AUTO_INCREMENT PRIMARY KEY ,       /*用戶ID*/

       `szUserName`               VARCHAR( 128 ) NOT NULL ,    /*用戶名*/

       `szLoUserName`           VARCHAR( 128 ) NOT NULL ,    /*用戶名(小寫)*/

       `szNickName`              VARCHAR( 128 ) NOT NULL ,    /*用戶暱稱*/

       `bIsAnonymous`           int not null,                   /*是否是匿名用戶 0 不是 1 */

       `szPassword`               varchar(128) not null,           /*Password ,plaintext, hashed,

                                                        or encrypted; base-64-encoded

                                                        if hashed or encrypted*/

       `szPasswordFormat`     int not null,                  /*密碼的加密方式

                                                        0=Plaintext, 1=Hashed, 2=Encrypted*/

       `szPasswordSalt`   varchar(128) not null,          /*Randomly generated 128-bit value

                                                        used to salt password hashes; stored in

                                                        base-64-encoded form*/

       `szEMail`              varchar(128) not null,           /*用戶EMail*/

       `szLoEMail`           varchar(128) not null,           /*用戶EMail(小寫)*/

       `szMobilePIN`              varchar(16) null,           /*用戶手機號*/

       `bIsApproved`              int not null,                   /*審覈 0 未審覈通過,1審覈通過*/

       `bIsLockedOut`            int not null,                   /*是否被鎖定 0 1鎖定*/

       `dtCreate`              datetime not null,           /*帳戶創建時間*/

       `dtLastLogin`         datetime not null,           /*最後一次登錄的時間*/

       `nFailedPwdCount`       int not null default 0,             /*輸入密碼錯誤的次數*/

       `nFailedPQACount` int not null default 0,             /*密碼問題錯誤次數*/

       `nLoginTimes`              int not null default 0,             /*登錄次數*/               

       UNIQUE ( `szLoUserName`, `szLoEMail` )

) ENGINE = MYISAM ;

 

/*用戶配置表*/

CREATE TABLE `mbs_userprofile_t` (

       `nUserID`             INT NOT NULL,                 /*用戶ID*/

       `szProfileKey`        VARCHAR( 128 ) NOT NULL ,    /*用戶配置項鍵值*/

       `szProfileValue`      VARCHAR( 255 ) NOT NULL ,    /*用戶配置項屬性值*/

       PRIMARY key(`nUserID`,`szProfileKey`)    

) ENGINE = MYISAM ;

 

 

/*角色與權限對應表*/

CREATE TABLE `mbs_user2role_t` (

       `nRoleID`              INT NOT NULL ,                /*角色ID*/

       `nUserID`             INT NOT NULL ,                /*權限值*/    

       PRIMARY KEY ( `nRoleID` , `nUserID` )

) ENGINE = MYISAM ;

 

/*插入系統預定義用戶角色*/

INSERT INTO `mbs_roles_t` (`nRoleID`, `szRoleName`, `szLoRoleName`, `bIsSysDef`, `bIsLockedOut`,

        `szDescription`) VALUES

(1, 'Administrators', 'administrators', 1, 0, '管理員用戶組,管理員對系統有不受限制的完全訪問權'),

(2, 'Registered Users', 'registered users', 1, 0, '註冊用戶組,可以執行系統中屬於會員的權限'),

(3, 'Guests', 'guests', 1, 1, '來賓用戶組,按默認值,來賓跟用戶組的成員有同等訪問權,但來賓帳戶的限制更多'),

(4, 'Anonymous', 'anonymous', 1, 0, '匿名用戶組,比來賓用戶的限制更多'),

(5, 'Denial Users', 'denial users', 1, 0, '黑名單用戶組,系統將拒絕此用戶組中的用戶的任何操作,此用戶組的優先級最高');

 

/*插入超級用戶*/

INSERT INTO `mbs_users_t` ( `nUserID`, `szUserName`, `szLoUserName`, `szNickName`, `bIsAnonymous`,

 `szPassword`, `szPasswordFormat`, `szPasswordSalt`, `szEMail`, `szLoEMail`, `szMobilePIN`,

 `bIsApproved`, `bIsLockedOut`,  `dtCreate`, `dtLastLogin`, `nFailedPwdCount`, `nFailedPQACount`,

 `nLoginTimes` ) VALUES(1, 'Admin', 'admin', 'admin', 0, '123456', 0, '', '[email protected]',

 '[email protected]', '',1,0,now(),now(),0,0,0);

 

INSERT INTO `mbs_userprofile_t` (`nUserID`, `szProfileKey`, `szProfileValue`) VALUES

(1,'real name', 'admin'),

(1,'msn', '[email protected]'),

(1,'password question', 'admin'),

(1,'password answer', 'admin'),

(1,'last password change date', now()),

(1,'last lock out date', now()),

(1,'comment', '');

 

INSERT INTO `mbs_user2role_t` (`nRoleID`, `nUserID`) VALUES(1,1);

 

該腳本在Mysql 5.0上調試通過。歡迎大家討論,也歡迎有建設型意見的板磚。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章