IT精英俱樂部

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

          統計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          2010年4月13日 #

          RBAC用戶角色權限設計方案

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

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



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

           

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

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



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

           

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

           

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

           

          到這里,RBAC權限模型的擴展模型的完整設計圖如下:



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

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

          iBATIS操作Blob與Clob淺析

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


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

          iBATIS提供了TypeHandler接口,用于處理數據類型,基本的實現類為BaseTypeHandler

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

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

          ClobStringTypeHandler 用于處理Clob類型數據,使用字符串來映射Clob

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

          下面是一個簡單的例子:

          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 閱讀(328) | 評論 (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;
          獲得未提交的事物的列表和基礎信息
          然后根據 sessionID和serial#號強制關閉事物:

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


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

          UML類與類之間的關系

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

          類與類之間的關系對于理解面向對象具有很重要的作用,以前在面試的時候也經常被問到這個問題,在這里我就介紹一下。
          類與類之間存在以下關系:
          (1)泛化(Generalization)
          (2)關聯(Association)
          (3)依賴(Dependency)
          (4)聚合(Aggregation)

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

          圖1.1 Animal類與Tiger類,Dog類的泛化關系

          [代碼表現]

          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)
          [依賴]
          對于兩個相對獨立的對象,當一個對象負責構造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現為依賴關系。
          [具體表現]
          依賴關系表現在局部變量方法的參數,以及對靜態方法的調用
          [現實例子]
          比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
          [UML表現](圖1.2)


          圖1.2 Person類與Screwdriver類的依賴關系

          [代碼表現]

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

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

          圖1.3 公司和員工的關聯關系


          [代碼表現]
          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之間為聚集關系。聚合是關聯關系的一種,是較強的關聯關系,強調的是整體部分之間的關系。
          [具體表現]
          與關聯關系一樣,聚合關系也是通過實例變量來實現這樣關系的。關聯關系和聚合關系來語法上是沒辦法區分的,從語義上才能更好的區分兩者的區別。
          [關聯與聚合的區別]
          (1)關聯關系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關聯關系,而不是聚合關系,因為人不是由自行車組成的。
          聚合關系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內存就是聚集關系,因為主板是電腦的組成部分。
          (2)對于具有聚集關系(尤其是強聚集關系)的兩個對象,整體對象會制約它的組成對象的生命周期。部分類的對象不能單獨存在,它的生命周期依賴于整體類的對象的生命周期,當整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內存)拆了下來。
          [UML圖](圖1.4)

          圖1.3 電腦和組件的聚合關系

          [代碼表現]
          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)編輯 收藏

          解決eclipse與360啟動沖突

          在快捷方式屬性-目標里加入 -vm "%JAVA_HOME%/jre/bin/javaw.exe"

          posted @ 2010-04-13 08:45 suplayer 閱讀(188) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 祁东县| 讷河市| 龙岩市| 永清县| 宾川县| 荔浦县| 枞阳县| 绥宁县| 西盟| 芜湖市| 伊宁县| 江陵县| 新津县| 达拉特旗| 洞口县| 中山市| 雷州市| 呼图壁县| 桦川县| 萝北县| 辽阳市| 桦甸市| 视频| 塘沽区| 会理县| 海南省| 北海市| 余江县| 尼勒克县| 黔西县| 上杭县| 府谷县| 宁波市| 温宿县| 高邮市| 大竹县| 榆树市| 兴安县| 山丹县| 大同市| 阜新市|