亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

spring aop實現用戶權限管理的示例

2024-07-13 10:14:16
字體:
來源:轉載
供稿:網友

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

問題源于項目開發

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

權限管理的代碼實現與配置文件

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

只讀管理員權限的實現及切點選擇

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

<bean id="usersPermissionsAdvice"     class="com.thundersoft.metadata.aop.UsersPermissionsAdvice"/>  <aop:config>    <!--定義切面 -->    <aop:aspect id="authAspect" ref="usersPermissionsAdvice">      <!-- 定義切入點 (配置在com.thundersoft.metadata.web.controller下所有的類在調用之前都會被攔截) -->      <aop:pointcut          expression="(execution(* com.thundersoft.metadata.web.controller.*.add*(..)) or          execution(* com.thundersoft.metadata.web.controller.*.edit*(..)) or          execution(* com.thundersoft.metadata.web.controller.*.del*(..)) or          execution(* com.thundersoft.metadata.web.controller.*.update*(..)) or          execution(* com.thundersoft.metadata.web.controller.*.insert*(..)) or          execution(* com.thundersoft.metadata.web.controller.*.modif*(..))) or          execution(* com.thundersoft.metadata.web.controller.*.down*(..))) and (          !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))"          id="authPointCut"/>      <!--方法被調用之前執行的 -->      <aop:before method="readOnly"            pointcut-ref="authPointCut"/>    </aop:aspect>  </aop:config>

只讀管理員權限管理代碼實現

上面說了那么多,廢話不多說了,下面是對只讀權限與各種復合權限進行控制的切面代碼實現。

/**   * 對只讀管理員以及其復合管理員進行aop攔截判斷.   * @param joinPoint 切入點.   * @throws IOException   */  public void readOnly(JoinPoint joinPoint) throws IOException {    /**     * 獲取被攔截的方法.     */    String methodName = joinPoint.getSignature().getName();    /**     * 獲取被攔截的對象.     */    Object object = joinPoint.getTarget();    logger.info("權限管理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;    }    /**     * 只讀管理員做數據更改權限的判斷     */    if (PermissionsLabeled.reader_Admin.equals(roleFlag)) {      logger.error("只讀管理員無操作權限!");      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("部門管理員,且為只讀管理員無操作權限!");      response.sendRedirect(request.getContextPath() + "/auth/readOnly");    }    /**     * 應用管理員,且為只讀管理員     */    if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) {      if (object instanceof AppController) {        return;      }      if (object instanceof AppPolicyController) {        return;      }      logger.error("應用管理員,且為只讀管理員無操作權限!");      response.sendRedirect(request.getContextPath() + "/auth/readOnly");    }    /**     * 部門管理員,且為應用管理員,且為只讀管理員     */    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("部門管理員,且為應用管理員,且為只讀管理員無操作權限");      response.sendRedirect(request.getContextPath() + "/auth/readOnly");    }  }

具有專門功能的管理員權限控制的切點選擇

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

<aop:config>    <!--定義切面 -->    <aop:aspect id="authAspect" ref="usersPermissionsAdvice">      <!-- 定義切入點 (配置在com.thundersoft.metadata.web.controller下所有的類在調用之前都會被攔截) -->      <aop:pointcut          expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and (          !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and          !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))"          id="appAuthPointCut"/>      <!--方法被調用之前執行的 -->      <aop:before method="appDeptAuth"            pointcut-ref="appAuthPointCut"/>    </aop:aspect>  </aop:config>

##權限管理的切面代碼實現

/**   * 對應用管理員以及部門管理員進行aop攔截判斷.   * @param joinPoint 切入點.   * @throws IOException   */  public void appDeptAuth(JoinPoint joinPoint) throws IOException {    /**     * 獲取被攔截的方法.     */    String methodName = joinPoint.getSignature().getName();    /**     * 獲取被攔截的對象.     */    Object object = joinPoint.getTarget();    logger.info("權限管理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;    }    /**     * 應用管理員做數據更改權限的判斷     */    if (PermissionsLabeled.app_Admin.equals(roleFlag)) {      if (object instanceof AppController) {        return;      }      if (object instanceof AppPolicyController) {        return;      }      logger.error("應用管理員無操作權限");      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("應用管理員無操作權限");      response.sendRedirect(request.getContextPath() + "/auth/readOnly");    } else {      return;    }  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
爽爽爽爽爽爽爽成人免费观看| 日韩精品在线观看一区二区| 欧美激情精品久久久| 亚洲成人激情在线观看| 成人久久久久久| 亚洲黄色在线看| 亚洲桃花岛网站| 日韩经典第一页| 中文字幕欧美日韩| 国产日韩欧美黄色| 成人久久久久久久| 国产精品成人免费视频| 51精品国产黑色丝袜高跟鞋| 久久久久久久97| 欧美自拍大量在线观看| 欧美裸身视频免费观看| 久久精品成人一区二区三区| 日韩精品视频在线播放| 日韩av最新在线观看| 亚洲丁香久久久| 欧美成人午夜免费视在线看片| 中文字幕日韩精品在线| 成人国产精品一区二区| 川上优av一区二区线观看| 日本精品久久久久影院| 亚洲精品久久久久国产| 中文字幕精品一区二区精品| 一二美女精品欧洲| 亚洲欧洲av一区二区| 国产91网红主播在线观看| 亚洲精品一区二区在线| 欧美专区日韩视频| 亚洲天堂av综合网| 亚洲精品自产拍| 欧美多人爱爱视频网站| 日韩大陆毛片av| 91久久精品在线| 亚洲国产精品小视频| 成人久久一区二区| 精品精品国产国产自在线| 欧美黑人性猛交| 欧美在线www| 日韩成人av网| 日韩美女av在线| 国产精品私拍pans大尺度在线| 夜夜嗨av色一区二区不卡| 久久视频免费在线播放| 成人性生交大片免费看视频直播| 国产精品久久久久久久久| 欧美在线视频免费播放| 久久久久久久久久久亚洲| 中文字幕亚洲国产| 国产视频久久久| 国模精品一区二区三区色天香| 国产精品视频网址| 国产不卡在线观看| 日韩亚洲在线观看| 亚洲黄色成人网| 亚洲天堂av电影| 欧美猛男性生活免费| 日韩性生活视频| 国产亚洲成av人片在线观看桃| 国产精品色悠悠| 亚洲一区免费网站| 中文字幕久热精品在线视频| 色视频www在线播放国产成人| 亚洲精品动漫100p| 欧美电影电视剧在线观看| 琪琪亚洲精品午夜在线| 亚洲字幕在线观看| 亚洲精品久久久久久久久| 在线一区二区日韩| 国产精品视频一区国模私拍| 欧美一区二区色| 国产欧美婷婷中文| 欧美主播福利视频| 久久91超碰青草是什么| 欧美成人精品一区| 亚洲天堂av在线免费| 美女999久久久精品视频| 欧美插天视频在线播放| 亚洲人成77777在线观看网| 色www亚洲国产张柏芝| 亚洲国产婷婷香蕉久久久久久| 日韩福利在线播放| 国产精品久久9| 欧美一级淫片aaaaaaa视频| 国产精品入口免费视| 欧美国产日韩一区二区在线观看| 中文字幕日韩综合av| 国产一区二区三区在线观看网站| **欧美日韩vr在线| 欧美在线视频一区二区| 欧美激情va永久在线播放| 欧美亚洲午夜视频在线观看| 亚洲激情在线观看| 狠狠躁夜夜躁人人躁婷婷91| 日日骚久久av| 欧美大片免费观看在线观看网站推荐| 国产美女久久精品| 91精品久久久久久久久| 亚洲国产欧美自拍| 亚洲精品99999| 成人免费在线视频网址| 中日韩美女免费视频网站在线观看| 国产精品一区二区av影院萌芽| 日韩美女在线观看一区| 亚洲国产精品小视频| 日韩中文在线中文网三级| 欧美性做爰毛片| 久久久久国色av免费观看性色| 国产精品久久久久久av下载红粉| 成人精品久久av网站| 91精品国产99久久久久久| 成人国产在线视频| 欧美亚洲另类视频| 精品美女永久免费视频| 久久躁狠狠躁夜夜爽| 亚洲黄页视频免费观看| 欧美另类69精品久久久久9999| 亚洲国产欧美自拍| 色综合久久88色综合天天看泰| 亚洲精品日韩欧美| 中文字幕视频在线免费欧美日韩综合在线看| 日韩福利视频在线观看| 97国产精品久久| 久久久久久久久中文字幕| 国产免费观看久久黄| 日韩av在线导航| 成人妇女免费播放久久久| 国产精品久久久91| 亚洲综合中文字幕在线| 久久国产精品偷| 91久久国产综合久久91精品网站| 亚洲一区二区三区四区视频| 国产亚洲精品美女久久久| 亚洲天堂av在线免费观看| 欧美性xxxx极品高清hd直播| 久久91精品国产91久久久| 日韩色av导航| 久久久亚洲天堂| 日本成人精品在线| 91精品啪aⅴ在线观看国产| 在线成人中文字幕| 91免费版网站入口| 亚洲高清一二三区| 国产中文字幕日韩| 欧美成人亚洲成人日韩成人| 国模视频一区二区| 国产欧美日韩专区发布| 美乳少妇欧美精品| 97人人模人人爽人人喊中文字| 中文字幕在线日韩| 日本精品一区二区三区在线| 欧美一级视频免费在线观看| 日韩在线视频播放| 91wwwcom在线观看| 亚洲性xxxx| 国产精品人人做人人爽| 亚洲va欧美va国产综合剧情| 欧美另类99xxxxx| 青草成人免费视频| 国产精品美乳在线观看| 欧美激情视频在线免费观看 欧美视频免费一|