IT精英俱樂部

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

          統計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          2011年7月30日 #

          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)編輯 收藏

          主站蜘蛛池模板: 阳山县| 宜宾市| 名山县| 浦东新区| 杭州市| 出国| 鄂伦春自治旗| 北流市| 循化| 保康县| 奉节县| 子长县| 景泰县| 政和县| 和龙市| 分宜县| 北宁市| 银川市| 青海省| 盈江县| 临沂市| 扬州市| 桃园县| 中方县| 安塞县| 高淳县| 九龙坡区| 固安县| 云阳县| 博兴县| 兴仁县| 北票市| 霍山县| 碌曲县| 延庆县| 清河县| 鄂尔多斯市| 荥经县| 张掖市| 隆子县| 雷州市|