數據庫,如何分角色權限建表?

使用人員:
1.教務系統的超級管理員!
2.教學祕書!
3.老師!
4.樓長!
5.樓管!
要求:超級管理員可以管理教學祕書,老師,樓長,樓管!
一個系一個教學祕書,教學祕書只可以管理本系的老師!
一個樓長可能管理一個或多個樓!樓長管理各樓內的樓管!
一個樓層管理員可能管理一層或多層樓!




首先,設置三種要素:用戶、羣組、角色。
用戶爲登錄用,對應到人。羣組對應爲用戶的集合,是一種特殊的用戶。角色爲一組權限項的集合,用戶(羣組)都有各自的角色。
權限的實現通過Permission類和Rule類來實現。 Permission供外部調用,Rule爲一個接口,爲權限判斷規則。
Permission是一個抽象類,有以下方法
Java代碼
public boolean hasPermission(User user,HashMap oldData,Input input);;  
public String getPermissionName();;  
public abstract Rule[] getDenyRule();;  
public abstract Rule[] getAcceptRule();;

public boolean hasPermission(User user,HashMap oldData,Input input);;
public String getPermissionName();;
public abstract Rule[] getDenyRule();;
public abstract Rule[] getAcceptRule();;
hasPermission方法供外部調用,已實現,實現方法爲:
先根據getDenyRule()得到的規則判斷權限是否被阻攔,
再根據getAcceptRule()來判斷是否有權限。
而Rule接口的接品則由用戶自行定義,隨包附帶了一個已實現的Rule,實現的功能如下:
先尋找User的所有角色,然後判斷角色是否有權限,如果無權限則尋找其父級羣組,再取父級羣組的所有角色進行判斷是否有權限,如果無權限則再往上級羣組找,直到找最上一級還是無權限才判斷爲無權限。
現實現判斷權限有無權限的方式已可以達成的有以下三種:
1、 是否有操作的權限。
2、 是否有操作的子操作的權限。
3、 在數據爲某條件時有操作(子操作)的權限。
在進行程序開發時,
第一步,編寫User,Group,Role的實現類,已提供了一套XML的實現類。
第二步,寫配置文件,進行權限項的配置。
第三步,在程序中要進行權限判斷的地方調用Permission.hasPermission方法即可。

用戶組件
首先,我定義了一個用戶接口,可以從其中取出其的各種屬性.代碼如後面所示.用戶除了各種不同的屬性以外,還必須設置其角色以及所屬的羣組.然後 定義一個AbstractUser把User共性的東西進行處理.所有的取屬性的方法都已實現.用戶只要根據實現情況繼承AbstractUser把自己 要定義的屬性進行處理即可.(因爲每個系統的用戶都會有不同的屬性,所以留成抽象類供使用者自己擴展). 只要初始化變量description, name ,group ,id, prop,role,propMap即可.最後定義了一個類UserImpl來實現具體的User作隨包的一個User供一般使用者使用.不建議直接使用 UserImpl,因爲以後的版本可能會重寫該類.如果要使用的話可以把該類改名爲自己的類即可.這部分涉及到了一個ResourceLib類,該類中存 是我自己定義的存儲各種資源配置用的類,可以直接使用.
========================XML格式=====================
Java代碼
<User id="U01">  
<Name>Swan</Name>  
<Description>方誌文</Description>  
<ParentGroup id="G01"/>  
<Property name="SEX" value="male"/>  
<Property name="AGE" value="20"/>  
</User>

<User id="U01">
<Name>Swan</Name>
<Description>方誌文</Description>
<ParentGroup id="G01"/>
<Property name="SEX" value="male"/>
<Property name="AGE" value="20"/>
</User>========================XML描述文件==================
Java代碼
<xs:complexType name="User">  
<xs:annotation>  
<xs:documentation>用戶名</xs:documentation>  
</xs:annotation>  
<xs:sequence>  
<xs:element name="Name"/>  
<xs:element name="Description"/>  
<xs:element name="ParentGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="Role" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded">  
<xs:complexType>  
<xs:attribute name="name" use="required"/>  
<xs:attribute name="value" use="required"/>  
</xs:complexType>  
</xs:element>  
</xs:sequence>  
<xs:attribute name="id" use="required"/>  
</xs:complexType>

<xs:complexType name="User">
<xs:annotation>
<xs:documentation>用戶名</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Name"/>
<xs:element name="Description"/>
<xs:element name="ParentGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Role" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" use="required"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" use="required"/>
</xs:complexType>羣組組件
首先,我定義了一個羣組接口,除了繼承用戶的方法以外還有兩個方法,getUsers,getSubGroup.代碼如後面所示.用戶除了各種不 同的屬性以外還必須設置其角色以及所屬的羣組.然後定義一個AbstractGroup,他繼承了Group以及AbstractUser,並實現了 Group接口定義的兩個方法.用戶只要根據實現情況繼承AbstractGroup把自己要定義的屬性進行處理即可.(因爲每個系統的用戶都會有不同的 屬性,所以留成抽象類供使用者自己擴展). 只要初始化變量description, name ,group ,id, prop,role,propMap,subGroup,user即可.最後定義了一個類XMLGroup來實現具體的Group作隨包的一個Group 供一般使用者使用.不建議直接使用XMLGroup,因爲以後的版本可能會重寫該類.如果要使用的話可以把該類改名爲自己的類即可.這部分涉及到了一個 ResourceLib類,該類中存是我自己定義的存儲各種資源配置用的類,可以直接使用.
========================XML格式=====================
Java代碼
<Group id="G01">  
<Name>系統部</Name>  
<Description>系統部</Description>  
</Group>

<Group id="G01">
<Name>系統部</Name>
<Description>系統部</Description>
</Group>
========================XML描述文件==================
Java代碼
<xs:complexType name="Group">  
<xs:annotation>  
<xs:documentation>羣組</xs:documentation>  
</xs:annotation>  
<xs:complexContent>  
<xs:extension base="User">  
<xs:sequence>  
<xs:element name="SubGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="User" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
</xs:sequence>  
</xs:extension>  
</xs:complexContent>  
</xs:complexType>

<xs:complexType name="Group">
<xs:annotation>
<xs:documentation>羣組</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="User">
<xs:sequence>
<xs:element name="SubGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="User" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>首先,我定義了一個角色接口,可以從其中取出其的各種屬性.代碼如後面所示.然後定義一個 AbstractRole把Role共性的東西進行處理.所有的取屬性的方法都已實現.用戶只要根據實現情況繼承AbstractRole把自己要定義的 屬性進行處理即可.(因爲每個系統的用戶都會有不同的屬性,所以留成抽象類供使用者自己擴展). 只要初始化變量description, name ,id, prop,users(可能是羣組), permissionMap即可.最後定義了一個類XMLRole來實現具體的Role作隨包的一個Role供一般使用者使用.不建議直接使用 XMLRole,因爲以後的版本可能會重寫該類.如果要使用的話可以把該類改名爲自己的類即可.這部分涉及到了一個ResourceLib類,該類中存是 我自己定義的存儲各種資源配置用的類,可以直接使用.
========================XML格式=====================
Java代碼
<Role id="R01">  
<Name>系統管理員</Name>  
<Description>系統管理員</Description>  
</Role>

<Role id="R01">
<Name>系統管理員</Name>
<Description>系統管理員</Description>
</Role>
========================XML描述文件==================
Java代碼
<xs:complexType name="Role">  
<xs:annotation>  
<xs:documentation>角色名</xs:documentation>  
</xs:annotation>  
<xs:sequence>  
<xs:element name="Name"/>  
<xs:element name="Description"/>  
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded"/>  
</xs:sequence>  
<xs:attribute name="id" use="required"/>  
</xs:complexType>

<xs:complexType name="Role">
<xs:annotation>
<xs:documentation>角色名</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Name"/>
<xs:element name="Description"/>
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" use="required"/>
</xs:complexType>規則
定義好User,Group,Role了以後,下面我定義了權限判斷的規則.首先定義Rule接口,見Rule.java.Rule只做一件事判斷User是否有權限.
然後我實現了一個Rule,見RuleImpl.java.這部分涉及到了一個Input類,這個類是一個輸入的類,接口如Input.java.這個通過繼承該接口可以使用各種方式數據(HTTP,XML,SOAP……)作爲輸入數據.
Permission爲權限類,下面一篇會介紹.
權限
最後,我定義了一個Permission類把所有的元素連接起來形成一個完整權限判斷組件。代碼如下。用戶繼承該類時要完兩個方法 getDenyRule,getAcceptRule即可。 當我們進行權限判斷時只要調用hasPermission(User user,HashMap oldData,Input input)即可。其後三個參數分別爲用戶,數據,輸入。用戶爲在判斷的人,數據爲原有數據,比較進行更新操作時,oldData爲老數據,input在 前一部分有介紹,爲一個通用的輸入方式。比如WEB輸入Post或Get方式等,可以轉換成一個Input類,也可以手動新建一個Input.爲操作以及 其數據的集合。 在Permission類中進行了DenyRule和AcceptRule的判斷,只要有一個DenyRule規則符合要求,則認爲該用戶無權限進行操 作,如果用戶的沒被DenyRule排除則進行AcceptRule的判斷,只要有一個規則符合要求則認爲該用戶有權限。 因爲本人比較懶所以Permission的實現還沒有寫出一個通用的。 綜上所述,使用此權限組件要進行以下幾項工作:
1、 編寫User的實現。
2、 編寫Group的實現。
3、 編寫Role的實現。
4、 編寫Permission的實現。(過段時間我會擺個通用的上來)
5、 編寫N個Rule(同你的系統要進行權限判斷相對應)。
6、 在程序中調用Permission.hasPermission判斷。

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