IT精英俱樂部

          方便自己查閱,僅此而已!

          統(tǒng)計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          2010年5月7日 #

          RBAC用戶角色權(quán)限設(shè)計方案

          http://www.iteye.com/topic/930648

          RBAC(Role-Based Access Control,基于角色的訪問控制),就是用戶通過角色與權(quán)限進行關(guān)聯(lián)。簡單地說,一個用戶擁有若干角色,每一個角色擁有若干權(quán)限。這樣,就構(gòu)造成“用戶-角色-權(quán)限”的授權(quán)模型。在這種模型中,用戶與角色之間,角色與權(quán)限之間,一般者是多對多的關(guān)系。(如下圖)



          角色是什么?可以理解為一定數(shù)量的權(quán)限的集合,權(quán)限的載體。例如:一個論壇系統(tǒng),“超級管理員”、“版主”都是角色。版主可管理版內(nèi)的帖子、可管理版內(nèi)的用戶等,這些是權(quán)限。要給某個用戶授予這些權(quán)限,不需要直接將權(quán)限授予用戶,可將“版主”這個角色賦予該用戶。 

           

          當用戶的數(shù)量非常大時,要給系統(tǒng)每個用戶逐一授權(quán)(授角色),是件非常煩瑣的事情。這時,就需要給用戶分組,每個用戶組內(nèi)有多個用戶。除了可給用戶授權(quán)外,還可以給用戶組授權(quán)。這樣一來,用戶擁有的所有權(quán)限,就是用戶個人擁有的權(quán)限與該用戶所在用戶組擁有的權(quán)限之和。(下圖為用戶組、用戶與角色三者的關(guān)聯(lián)關(guān)系)

          在應用系統(tǒng)中,權(quán)限表現(xiàn)成什么?對功能模塊的操作,對上傳文件的刪改,菜單的訪問,甚至頁面上某個按鈕、某個圖片的可見性控制,都可屬于權(quán)限的范疇。有些權(quán)限設(shè)計,會把功能操作作為一類,而把文件、菜單、頁面元素等作為另一類,這樣構(gòu)成“用戶-角色-權(quán)限-資源”的授權(quán)模型。而在做數(shù)據(jù)表建模時,可把功能操作和資源統(tǒng)一管理,也就是都直接與權(quán)限表進行關(guān)聯(lián),這樣可能更具便捷性和易擴展性。(見下圖)



          請留意權(quán)限表中有一列“權(quán)限類型”,我們根據(jù)它的取值來區(qū)分是哪一類權(quán)限,如“MENU”表示菜單的訪問權(quán)限、“OPERATION”表示功能模塊的操作權(quán)限、“FILE”表示文件的修改權(quán)限、“ELEMENT”表示頁面元素的可見性控制等。

           

          這樣設(shè)計的好處有二。其一,不需要區(qū)分哪些是權(quán)限操作,哪些是資源,(實際上,有時候也不好區(qū)分,如菜單,把它理解為資源呢還是功能模塊權(quán)限呢?)。其二,方便擴展,當系統(tǒng)要對新的東西進行權(quán)限控制時,我只需要建立一個新的關(guān)聯(lián)表“權(quán)限XX關(guān)聯(lián)表”,并確定這類權(quán)限的權(quán)限類型字符串。

           

          這里要注意的是,權(quán)限表與權(quán)限菜單關(guān)聯(lián)表、權(quán)限菜單關(guān)聯(lián)表與菜單表都是一對一的關(guān)系。(文件、頁面權(quán)限點、功能操作等同理)。也就是每添加一個菜單,就得同時往這三個表中各插入一條記錄。這樣,可以不需要權(quán)限菜單關(guān)聯(lián)表,讓權(quán)限表與菜單表直接關(guān)聯(lián),此時,須在權(quán)限表中新增一列用來保存菜單的ID,權(quán)限表通過“權(quán)限類型”和這個ID來區(qū)分是種類型下的哪條記錄。

           

          到這里,RBAC權(quán)限模型的擴展模型的完整設(shè)計圖如下:



          隨著系統(tǒng)的日益龐大,為了方便管理,可引入角色組對角色進行分類管理,跟用戶組不同,角色組不參與授權(quán)。例如:某電網(wǎng)系統(tǒng)的權(quán)限管理模塊中,角色就是掛在區(qū)局下,而區(qū)局在這里可當作角色組,它不參于權(quán)限分配。另外,為方便上面各主表自身的管理與查找,可采用樹型結(jié)構(gòu),如菜單樹、功能樹等,當然這些可不需要參于權(quán)限分配。

          posted @ 2011-07-30 16:36 suplayer 閱讀(1012) | 評論 (0)編輯 收藏

          iBATIS操作Blob與Clob淺析

          http://developer.51cto.com/art/200907/136668.htm


          spring 中已經(jīng)提供了很好的實現(xiàn),所以這又省去了很多的功夫,接下來看看iBATIS是如何支持Clob和blob的。

          iBATIS提供了TypeHandler接口,用于處理數(shù)據(jù)類型,基本的實現(xiàn)類為BaseTypeHandler

          在spring 中,提供了AbstractLobTypeHandler作為基礎(chǔ)類,并且提供了相應的模版方法,所有的工作由LobHandler處理。

          BlobByteArrayTypeHandler 主要用于處理blob類型數(shù)據(jù),使用byte[]來映射相應的Blob

          ClobStringTypeHandler 用于處理Clob類型數(shù)據(jù),使用字符串來映射Clob

          有一點需要注意的是,AbstractLobTypeHandler中實現(xiàn)了事務支持,需要用來釋放相應的資源,所以一定需要在事務環(huán)境中進行。

          下面是一個簡單的例子:

          1. public class Food {   
          2. private String content;   
          3.  
          4. private String id;   
          5.  
          6. private byte[] image;   
          7.  
          8. private String name;     
          9.     ...   
          10. }  

          xml如下:說明一下,在resultMap中可以通過typeHandler來指定具體的handler.在inline變量中,可以通過handler來定義相應的typeHandler

          1. ﹤sqlMap namespace="Food"﹥   
          2.      
          3.    ﹤typeAlias alias="Food" type="org.esoft.hdb.bo.Food"/﹥   
          4.    ﹤resultMap id="foodResult" class="Food"﹥   
          5.   ﹤result property="id" column="C_ID"/﹥   
          6.   ﹤result property="name" column="C_NAME"/﹥   
          7.   ﹤result property="content" column="C_content"   
          8.  typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/﹥   
          9.   ﹤result property="image" column="C_image"   
          10.  typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/﹥   
          11.    ﹤/resultMap﹥   
          12.    ﹤sql id="foodFragment"﹥select C_ID,C_NAME,C_CONTENT,C_IMAGE from T_FOOD﹤/sql﹥   
          13.   ﹤select id="getAll" resultMap="foodResult"﹥   
          14.   ﹤include refid="foodFragment"/﹥   
          15.    ﹤/select﹥   
          16.    ﹤select id="selectById" parameterClass="string" resultMap="foodResult"﹥   
          17.   ﹤include refid="foodFragment"/﹥ where C_ID=#id#﹤/select﹥   
          18.      
          19.    ﹤insert id="insert" parameterClass="Food"﹥ insert into T_FOOD ( C_ID,   
          20.   C_NAME,C_CONTENT, C_IMAGE) values ( #id#,   
          21.   #name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,   
          22.   #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)   
          23.   ﹤/insert﹥   
          24.      
          25.    ﹤update id="update" parameterClass="Food"﹥ update T_FOOD set C_NAME = #name#,   
          26.   C_CONTENT =   
          27.   #content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,   
          28.   C_IMAGE =   
          29.   #image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#   
          30.   where C_ID = #id# ﹤/update﹥   
          31.      
          32.    ﹤delete id="deleteById" parameterClass="string"﹥ delete from T_FOOD where C_ID = #id#   
          33.   ﹤/delete﹥   
          34.      
          35. ﹤/sqlMap﹥   
          36.  
          37.  
          38. public interface FoodService {   
          39.  
          40.      
          41. void save(Food food);   
          42. Food get(String id);   
          43. /**   
          44. * @param food   
          45. */   
          46. void update(Food food);   
          47. }   
          48.  
          49. public class FoodServiceImpl implements FoodService {   
          50. private FoodDAO foodDAO;   
          51.  
          52. private DaoCreator creator;   
          53.  
          54. public void setCreator(DaoCreator creator) {   
          55.     this.creator = creator;   
          56. }   
          57.  
          58. protected FoodDAO getFoodDAO() {   
          59.     if (foodDAO == null) {   
          60.    foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);   
          61.     }   
          62.     return foodDAO;   
          63. }   
          64.  
          65. public Food get(String id) {   
          66.     return getFoodDAO().get(id);   
          67. }   
          68. public void save(Food food) {   
          69.     getFoodDAO().save(food);   
          70. }   
          71. public void update(Food food) {   
          72.     getFoodDAO().update(food);   
          73. }   
          74.  
          75. }   
          76.  
          77. spring xml 配置:  
          78.    
          79. 。。。   
          80.  ﹤bean id="lobHandler"   
          81.   class="org.springframework.jdbc.support.lob.DefaultLobHandler"/﹥   
          82.      
          83.    ﹤bean id="transactionManager"   
          84.   class="org.springframework.jdbc.datasource.DataSourceTransactionManager"﹥   
          85.   ﹤property name="dataSource" ref="dataSource"/﹥   
          86.    ﹤/bean﹥   
          87.      
          88.    ﹤bean id="sqlMapClient"   
          89.   class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"﹥   
          90.   ﹤property name="dataSource" ref="dataSource"/﹥   
          91.   ﹤property name="configLocation"﹥   
          92.  ﹤value﹥SqlMapConfig.xml﹤/value﹥   
          93.   ﹤/property﹥   
          94.   ﹤property name="lobHandler" ref="lobHandler"/﹥   
          95.    ﹤/bean﹥   
          96.      
          97.    ﹤bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator"﹥   
          98.   ﹤property name="sqlMapClient" ref="sqlMapClient"/﹥   
          99.    ﹤/bean﹥   
          100.      
          101.    ﹤bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl"﹥   
          102.   ﹤property name="creator" ref="daoCreate"/﹥   
          103.    ﹤/bean﹥   
          104.      
          105.      
          106.    ﹤aop:config﹥   
          107.   ﹤aop:pointcut id="foodServiceMethods"   
          108.  expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/﹥   
          109.   ﹤aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/﹥   
          110.    ﹤/aop:config﹥   
          111.    ﹤tx:advice id="txAdvice" transaction-manager="transactionManager"﹥   
          112.   ﹤tx:attributes﹥   
          113.  ﹤tx:method name="*" propagation="REQUIRED"/﹥   
          114.   ﹤/tx:attributes﹥   
          115.    ﹤/tx:advice﹥  

          簡單的測試:

          1. save :   
          2.     Food food = new Food();   
          3.     food.setPk("1");   
          4.     food.setName("food1");   
          5.     BufferedInputStream in = new BufferedInputStream(getClass()   
          6.   .getResourceAsStream("/1.gif"));   
          7.     byte[] b = FileCopyUtils.copyToByteArray(in);   
          8.     food.setImage(b);   
          9.   in = new BufferedInputStream(getClass().getResourceAsStream(   
          10.   "/hibernate.cfg.xml"));   
          11.     b = FileCopyUtils.copyToByteArray(in);   
          12.     food.setContent(new String(b));   
          13.     foodService.save(food);   
          14. update:   
          15. Food food = foodService.get("1");   
          16.     BufferedInputStream in = new BufferedInputStream(getClass()   
          17.   .getResourceAsStream("/jdbc.properties"));   
          18.     byte[] b = FileCopyUtils.copyToByteArray(in);   
          19.     food.setContent(new String(b));   
          20.     foodService.update(food);   
          21.     food = foodService.get("1");   
          22.     assertNotNull(food.getImage());  

          posted @ 2011-07-30 16:35 suplayer 閱讀(327) | 評論 (0)編輯 收藏

          ORACLE表解鎖

          select sess.sid,
             sess.serial#,
             lo.oracle_username,
             lo.os_user_name,
             ao.
          object_name,
             lo.locked_mode
             
          from v$locked_object lo,
             dba_objects ao,
             v$session sess
          where ao.object_id = lo.object_id and lo.session_id = sess.SID;
          獲得未提交的事物的列表和基礎(chǔ)信息
          然后根據(jù) sessionID和serial#號強制關(guān)閉事物:

          ALTER SYSTEM KILL SESSION '9,108';
          --'9,108'為sessionID和serial#號,逗號分開


          posted @ 2011-07-30 16:33 suplayer 閱讀(123) | 評論 (0)編輯 收藏

          UML類與類之間的關(guān)系

          http://www.javaeye.com/topic/37302

          類與類之間的關(guān)系對于理解面向?qū)ο缶哂泻苤匾淖饔茫郧霸诿嬖嚨臅r候也經(jīng)常被問到這個問題,在這里我就介紹一下。
          類與類之間存在以下關(guān)系:
          (1)泛化(Generalization)
          (2)關(guān)聯(lián)(Association)
          (3)依賴(Dependency)
          (4)聚合(Aggregation)

          UML圖與應用代碼例子:
          1.泛化(Generalization)
          [泛化]
          表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對接口的實現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。
          [具體表現(xiàn)]
          父類 父類實例=new 子類()
          [UML圖](圖1.1)

          圖1.1 Animal類與Tiger類,Dog類的泛化關(guān)系

          [代碼表現(xiàn)]

          1. class Animal{}   
          2. class Tiger extends Animal{}   
          3. public class Test   
          4. {   
          5.     public void test()   
          6.     {   
          7.         Animal a=new Tiger();   
          8.     }   
          9. }  

          2.依賴(Dependency)
          [依賴]
          對于兩個相對獨立的對象,當一個對象負責構(gòu)造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現(xiàn)為依賴關(guān)系。
          [具體表現(xiàn)]
          依賴關(guān)系表現(xiàn)在局部變量方法的參數(shù),以及對靜態(tài)方法的調(diào)用
          [現(xiàn)實例子]
          比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
          [UML表現(xiàn)](圖1.2)


          圖1.2 Person類與Screwdriver類的依賴關(guān)系

          [代碼表現(xiàn)]

          1. public class Person{   
          2.     /** 擰螺絲 */  
          3.     public void screw(Screwdriver screwdriver){   
          4.         screwdriver.screw();   
          5.     }   
          6. }  

          3.關(guān)聯(lián)(Association)
          [關(guān)聯(lián)]
          對于兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應關(guān)系時,這兩個對象之間為關(guān)聯(lián)關(guān)系。
          [具體表現(xiàn)]
          關(guān)聯(lián)關(guān)系是使用實例變量來實現(xiàn)
          [現(xiàn)實例子]
          比如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單;再例如公司和員工,每個公司對應一些特定的員工,每個員工對應一特定的公司
          [UML圖] (圖1.3)

          圖1.3 公司和員工的關(guān)聯(lián)關(guān)系


          [代碼表現(xiàn)]
          1. public class Company{   
          2.     private Employee employee;   
          3.     public Employee getEmployee(){   
          4.         return employee;   
          5.     }   
          6.     public void setEmployee(Employee employee){   
          7.         this.employee=employee;   
          8.     }   
          9.     //公司運作   
          10.     public void run(){   
          11.         employee.startWorking();   
          12.     }   
          13. }  
          (4)聚合(Aggregation)
          [聚合]
          當對象A被加入到對象B中,成為對象B的組成部分時,對象B和對象A之間為聚集關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強的關(guān)聯(lián)關(guān)系,強調(diào)的是整體部分之間的關(guān)系。
          [具體表現(xiàn)]
          與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實例變量來實現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
          [關(guān)聯(lián)與聚合的區(qū)別]
          (1)關(guān)聯(lián)關(guān)系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因為人不是由自行車組成的。
          聚合關(guān)系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內(nèi)存就是聚集關(guān)系,因為主板是電腦的組成部分。
          (2)對于具有聚集關(guān)系(尤其是強聚集關(guān)系)的兩個對象,整體對象會制約它的組成對象的生命周期。部分類的對象不能單獨存在,它的生命周期依賴于整體類的對象的生命周期,當整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內(nèi)存)拆了下來。
          [UML圖](圖1.4)

          圖1.3 電腦和組件的聚合關(guān)系

          [代碼表現(xiàn)]
          1. public class Computer{   
          2.     private CPU cpu;   
          3.     public CPU getCPU(){   
          4.         return cpu;   
          5.     }   
          6.     public void setCPU(CPU cpu){   
          7.         this.cpu=cpu;   
          8.     }   
          9.     //開啟電腦   
          10.     public void start(){   
          11.         //cpu運作   
          12.         cpu.run();   
          13.     }   
          14. }  

          posted @ 2010-05-07 12:47 suplayer 閱讀(115) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 竹山县| 若尔盖县| 高淳县| 闻喜县| 江华| 西城区| 若尔盖县| 日喀则市| 元氏县| 渝中区| 大埔区| 恩平市| 七台河市| 疏附县| 华坪县| 贵溪市| 神池县| 延川县| 全椒县| 湾仔区| 黎川县| 探索| 贵港市| 宁晋县| 海口市| 繁峙县| 万载县| 南丹县| 阿鲁科尔沁旗| 平和县| 唐河县| 连南| 寿阳县| 巴彦县| 泰安市| 大悟县| 偃师市| 玉环县| 新河县| 靖远县| 昌吉市|