真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springaop實現(xiàn)用戶權(quán)限管理的示例

AOP 在實際項目中運用的場景主要有 權(quán)限管理(Authority Management)、事務(wù)管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調(diào)試管理(Debugging) 等。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供汕頭網(wǎng)站建設(shè)、汕頭做網(wǎng)站、汕頭網(wǎng)站設(shè)計、汕頭網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、汕頭企業(yè)網(wǎng)站模板建站服務(wù),十多年汕頭做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

問題源于項目開發(fā)

最近項目中需要做一個權(quán)限管理模塊,按照之前同事的做法是在controller層的每個接口調(diào)用之前上做邏輯判斷,這樣做也沒有不妥,但是代碼重復(fù)率太高,而且是體力勞動,so,便有了如題所說的使用spring aop做一個切點來實現(xiàn)通用功能的權(quán)限管理,這樣也就降低了項目后期開發(fā)的可擴展性。

權(quán)限管理的代碼實現(xiàn)與配置文件

在最小的代碼修改程度上,aop無疑是最理想的選擇。項目中有各種權(quán)限的復(fù)合,相對來說邏輯復(fù)雜度比較高,所以一步步來。因為權(quán)限涉及到的是后端接口的調(diào)用所以樓主選擇在controller層代碼做切面,而切點就是controller中的各個方法塊,對于通用訪問權(quán)限,我們使用execution表達式進行排除。

只讀管理員權(quán)限的實現(xiàn)及切點選擇

對于實現(xiàn)排除通用的controller,樓主采用的是execution表達式邏輯運算。因為只讀管理員擁有全局讀權(quán)限,而對于增刪改權(quán)限,樓主采用的是使用切點切入是增刪改的方法,so,這個時候規(guī)范的方法命名就很重要了。對于各種與只讀管理員進行復(fù)合的各種管理員,我們在代碼中做一下特殊判斷即可。下面是spring aop的配置文件配置方法。


  
    
    
      
      
      
      
    
  

只讀管理員權(quán)限管理代碼實現(xiàn)

上面說了那么多,廢話不多說了,下面是對只讀權(quán)限與各種復(fù)合權(quán)限進行控制的切面代碼實現(xiàn)。

/**
   * 對只讀管理員以及其復(fù)合管理員進行aop攔截判斷.
   * @param joinPoint 切入點.
   * @throws IOException
   */
  public void readOnly(JoinPoint joinPoint) throws IOException {

    /**
     * 獲取被攔截的方法.
     */
    String methodName = joinPoint.getSignature().getName();

    /**
     * 獲取被攔截的對象.
     */
    Object object = joinPoint.getTarget();
    logger.info("權(quán)限管理aop,方法名稱" + methodName);
    HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    String roleFlag = GetLoginUserInfor.getLoginUserRole(request);

    /**
     * 超級管理員
     */
    if (PermissionsLabeled.super_Admin.equals(roleFlag)) {
      return;
    }

    /**
     * 只讀管理員做數(shù)據(jù)更改權(quán)限的判斷
     */
    if (PermissionsLabeled.reader_Admin.equals(roleFlag)) {
      logger.error("只讀管理員無操作權(quán)限!");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    }

    /**
     * 部門管理員,且為只讀管理員,
     */
    if (PermissionsLabeled.dept_reader_Admin.equals(roleFlag)) {
      if (object instanceof DepartmentController) {
        return;
      }
      if (object instanceof UserController) {
        if (methodName.contains("addAdmin")) {
          response.sendRedirect(request.getContextPath() + "/auth/readOnly");
        }
        if (methodName.contains("deleteAdmin")) {
          response.sendRedirect(request.getContextPath() + "/auth/readOnly");
        }
        if (methodName.contains("updateAdmin")) {
          response.sendRedirect(request.getContextPath() + "/auth/readOnly");
        }
        return;
      }
      if (object instanceof GroupController) {
        return;
      }
      logger.error("部門管理員,且為只讀管理員無操作權(quán)限!");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    }

    /**
     * 應(yīng)用管理員,且為只讀管理員
     */
    if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) {
      if (object instanceof AppController) {
        return;
      }
      if (object instanceof AppPolicyController) {
        return;
      }
      logger.error("應(yīng)用管理員,且為只讀管理員無操作權(quán)限!");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    }

    /**
     * 部門管理員,且為應(yīng)用管理員,且為只讀管理員
     */
    if (PermissionsLabeled.dept_app_reader_Admin.equals(roleFlag)) {
      if (object instanceof DepartmentController) {
        return;
      }
      if (object instanceof UserController) {
        return;
      }
      if (object instanceof GroupController) {
        return;
      }
      if (object instanceof AppController) {
        return;
      }
      if (object instanceof AppPolicyController) {
        return;
      }
      logger.error("部門管理員,且為應(yīng)用管理員,且為只讀管理員無操作權(quán)限");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    }
  }

具有專門功能的管理員權(quán)限控制的切點選擇

因為具有專門的管理員權(quán)限比較特殊,樓主采用的方式除了通用訪問權(quán)限之外的controller全切,特殊情況在代碼邏輯里面做實現(xiàn)即可。配置文件代碼如下:


    
    
      
      
      
      
    
  

##權(quán)限管理的切面代碼實現(xiàn)

/**
   * 對應(yīng)用管理員以及部門管理員進行aop攔截判斷.
   * @param joinPoint 切入點.
   * @throws IOException
   */
  public void appDeptAuth(JoinPoint joinPoint) throws IOException {
    /**
     * 獲取被攔截的方法.
     */
    String methodName = joinPoint.getSignature().getName();

    /**
     * 獲取被攔截的對象.
     */
    Object object = joinPoint.getTarget();
    logger.info("權(quán)限管理aop,方法名稱",methodName);
    HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    String roleFlag = GetLoginUserInfor.getLoginUserRole(request);

    /**
     * 超級管理員
     */
    if (PermissionsLabeled.super_Admin.equals(roleFlag)) {
      return;
    }

    /**
     * 應(yīng)用管理員做數(shù)據(jù)更改權(quán)限的判斷
     */
    if (PermissionsLabeled.app_Admin.equals(roleFlag)) {
      if (object instanceof AppController) {
        return;
      }
      if (object instanceof AppPolicyController) {
        return;
      }
      logger.error("應(yīng)用管理員無操作權(quán)限");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) {
      if (object instanceof DepartmentController) {
        return;
      }
      if (object instanceof UserController) {
        return;
      }

      if (object instanceof GroupController) {
        return;
      }
      if ("getAllDepartments".equals(methodName)) {
        return;
      }
      logger.error("應(yīng)用管理員無操作權(quán)限");
      response.sendRedirect(request.getContextPath() + "/auth/readOnly");
    } else {
      return;
    }
  }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章名稱:springaop實現(xiàn)用戶權(quán)限管理的示例
當(dāng)前URL:http://weahome.cn/article/ggigge.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部