Java權限管理(受權與認證)

CRM權限管理html

有興趣的同窗也能夠閱讀我最近分享的:Shiro框架原理分析   (PS : 這篇博客裏面介紹了使用Shiro框架的方式實現權限管理)前端

http://www.javashuo.com/article/p-xxtvtcww-a.html java

若是發現分享的內容有不合理或者的不對地方,請留言,我會及時定位分析,感謝!!!sql

1、概念

權限管理就是管理用戶對於資源的操做。本 CRM 系統的權限(也稱做資源)是基於角色操做權限來實現的,即RBAC(Role-Based Access Control,基於角色的訪問控制),就是用戶經過角色與權限進行關聯。簡單地說,一個用戶擁有若干角色,每個角色擁有若干權限。這樣,就構形成「用戶-角色-權限」的受權模型。在這種模型中,用戶與角色之間,角色與權限之間都是多對多的關係,爲了實現表之間多對多的關係,必須將一個多對多的關係經過一箇中間表分爲兩個一對多的關係。所以引入中間表,用戶角色表和角色權限表。數據庫

2、數據庫

權限管理模塊一共涉及五張表session

  1. 三張主表

    a)       用戶表(t_user)、框架

    b)       角色表(t_role)、函數

    c)       資源表(t_module)、性能

         2.兩張中間表ui

    a)       用戶角色表(t_user_role)、

    b)       角色—資源表(t_permission)、

 

 

 

3、權限管理實現

 

一、模塊、角色、用戶的單表CRUD

  模塊CRUD:操做t_module表

 

  角色CRUD:操做t_role表

 

  用戶CRUD:操做t_role表

 

二、受權

角色賦予權限

  給角色賦予權限:使用ztree進行權限樹結構的構建

                     a)賦權限

                             一、先把本模塊綁定;

        二、綁定父模塊;

        三、綁定子模塊

                     b)刪權限

                             一、先刪除本模塊;

        二、刪除子模塊;

        三、刪除父模塊(判斷父模塊是否有其餘的子模塊關聯詞角色,若是沒有就取消,若是有就關聯)

 

a)       使用jQuery的插件zTree構建一個資源的樹結構,樹中的內容爲表t_module中的數據

 

 

 

b)       用鼠標點擊zTree中的選擇框操做表t_permission(角色資源表)實現給角色賦予權限

 

用戶賦予角色

  給用戶賦予角色:使用的combobox多選

                     a).添加帳號:直接往t_user_role插入記錄

                     b).修改帳號:先刪除,在添加

 

建立用戶或者是修改用戶信息時均可以經過combobox多選框給用戶賦予角色操做t_user_role(用戶角色表)

 

三、認證

思路:

  從t_permission表中獲取權限值(acl_value)與頁面傳來的值或者與註解中明確的權限值比較,下面提供兩種思路:

    1.頁面傳遞過來Request.getParameter(「permission」);比對 根據userId查詢數據庫查到的權限列表  contains

    2.經過註解明確模塊權限值:@requirePermission(permission=」1010」;

後臺認證:Spring AOP和自定義註解實現認證

  獲取用戶權限存入session,而後用戶操做資源時會提交一個資源的權限值,在判斷用戶是否包含有此權限

  使用Spring AOP進行攔截認證

                 第一步:開啓註解驅動<aop:aspectj-autoproxy />

                 第二步:建立一個代理類使用@Aspect @Component註解進行標記

                 第三步:定義一個切入點@Pointcut(" *execution('com.shsxt.controller.*.*((..))')")

                                           public void pointcut() {}

                 第四步:編寫一個加強:@Around(value="pointcut()")

                        1.斷定用戶是否登陸

                        2.獲取用戶權限

                        3.將權限存入session--》給前端頁面判斷

                        4.後臺的權限校驗

                        5.返回

 

  1. 自定義註解

 

 

         2.編寫切面類

定義切入點point:自攔截有權限註解的方法,更能提高性能

//@Pointcut("execution(* com.shsxt.controller.*.*(..))")

    @Pointcut("@annotation(com.shsxt.annotation.RequirePermissions)")

    public void pointcut() {

      

    }

 

經過前臺傳遞permission參數實現: 

List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, roleIds.lastIndexOf(",")));

       String permissioFront = request.getParameter("permission"); // 後臺權限認證

       AssertUtil.isTrue(!permissions.contains(permissioFront), "您無權操做此模塊");

 

經過註解實現

 

List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, roleIds.lastIndexOf(",")));

       if (requirePermissions != null) {

           String permission = requirePermissions.permission(); // 後臺權限認證

           throw new UnAuthPermissionException(permission, "您無權操做此模塊");

       }

 

 

        3.引入AOP的namepsace並開啓AOP註解驅動

 

 

 

<!-- 啓用@Aspect註解 -->

<aop:aspectj-autoproxy />

 

        4.在須要權限認證的方法上啓用註解 

 

 

Permission應該和module表中的act_value保持一致

 

前臺認證:Freemarker 內建函數判斷

獲取用戶權限後在前端的freemarker中利用freemarker語法去判斷用戶是否可以操做此資源(list?seq_contains('權限值'))

 

1.SQL:

SELECT

       DISTINCT p.acl_value

FROM

       t_permission p

-- LEFT JOIN t_role r ON r.id = ur.role_id

left JOIN t_user_role ur on p.role_id = ur.role_id

WHERE

       ur.user_id = 10;


2.在AOP切面類中查詢permission取出權限值列表、放入Session

 

3.前臺頁面判斷: 解釋:利用freemarker 內建函數sql_contains判斷序列是否包含參數值,包含返回true

相似於java中集合hashmap.contains(value);

 

相關文章
相關標籤/搜索