Сценарии, используемые AOP в реальных проектах, в основном являются авторитетным управлением, управлением транзакциями, управлением безопасностью, ведением журнала и отладкой.
Проблема связана с разработкой проекта
Недавно в проекте необходим модуль управления разрешениями. Согласно подходу предыдущего коллеги, он должен сделать логические суждения перед каждым интерфейсом в вызове уровня контроллера. В этом нет ничего плохого, но частота повторения кода слишком высока, и это физический труд. Таким образом, как упомянуто в заголовке, используйте Spring AOP, чтобы сделать точку щели для достижения разрешения управления общими функциями, что снижает масштабируемость более поздней разработки проекта.
Файлы реализации и конфигурации кода для управления разрешением
С минимальной степенью модификации кода AOP, несомненно, является идеальным выбором. В проекте существуют различные разрешения, и логическая сложность относительно высока, поэтому мы сделаем это шаг за шагом. Поскольку разрешения включают вызовы в бэкэнд -интерфейс, автор предпочитает создать раздел в коде уровня контроллера, а точка касательной - это различные блоки метода в контроллере. Для общих разрешений на доступ мы используем выражение выполнения, чтобы исключить их.
Внедрение разрешений администратора только для чтения и выбора точек
Для контроллера, который реализует общее исключение, автор использует операцию логики выражения. Поскольку администратор только для чтения имеет глобальные разрешения на чтение, а также для разрешений на добавление, удаление и изменение, автор использует метод добавления, удаления и изменения с использованием точечного выреза. Таким образом, в настоящее время стандартизированное именование метода очень важно. Для различных администраторов, которые сочетаются с администраторами только для чтения, мы можем вынести специальные суждения в Кодексе. Ниже приведен метод конфигурации файла конфигурации Spring AOP.
<bean id = "userspermissionsadvice" /> <aop: config> <!-Определите раздел-> <aop: аспект идентификатор = "authaspect" ref = "userpermissionsadvice"> <!-Определите точку входа (настроено в Com.thundersoft.metadata.web.controler.*. com.thundersoft.metadata.web.controller.*. edit*(..) или execution (*com.thundersoft.metadata.web.controller.*. edit*(..))) или исполнение (*com.thundersoft.metadata.web.controler. com.thundersoft.metadata.web.controller.*. Update*(..) или выполнение (*com.thundersoft.metadata.web.controller.*. Insert*(..) или выполнение (*com.thundersoft.metadata.web.controller.*. Modif*(..)) com.thundersoft.metadata.web.controller.*. Down*(..))) и (! execution (*com.thundersoft.metadata.web.controller.findpasswordController.*(..)) и! Execution (*com.thundersoft.mebadata.web.controller.selfecr com.thundersoft.metadata.web.controller.homecontroller.*(..) и! выполнение (*com.thundersoft.metadata.web.controller.userstatusController.*(..)) и! ! execution (* com.thundersoft.metadata.web.controller.dashboardcontroller.* (..)) и! execution (* com.thundersoft.metadata.web.controller.maincontroller.* (..)))) "id =" Authpointcut "/> <! pointcut-ref = "authpointcut"/> </aop: аспект> </aop: config>
Реализация кода управления разрешениями только для чтения.
Я так много сказал выше, и я не скажу много чепухи. Ниже приведена реализация кода секции, которая управляет разрешениями только для чтения и различным составным разрешениями.
/*** AOP перехват выполняется на администраторах только для чтения и их составных администраторам. * @param joinpoint point. * @Throws ioException * / public void readonly (joinpoint joinpoint) бросает ioexception { / ** * Получить перехваченный метод. */ String methodname = joinpoint.getSignature (). GetName (); /*** Получите перехваченный объект. */ Object Object = joinPoint.getTarget (); logger.info ("Управление разрешением AOP, имя метода" + methodname); Httpservlectrequest request = ((servletrequestattributes) requestContextholder.getRequestattributes ()). GetRequest (); Httpservletresponse response = ((servlectrequestattributes) requestContextholder.getRequestattributes ()). GetResponse (); String roleflag = getLoginuserInfor.getLoginUserrole (запрос); / *** Super Administrator*/ if (permissionsLabled.super_admin.equals (roleflag)) {return; } / *** Суждение администраторов только для чтения для внесения изменений данных в разрешениях* / if (permissionsLabled.reader_admin.equals (roleflag)) {logger.error («У администратора readonly нет разрешения на операцию!»); response.sendredirect (request.getContextPath () + "/auth/readonly"); } / ** * Администратор департамента и является администратором только для чтения, * / if (permissionslabeled.dept_reader_admin.equals (roleflag)) {if (exance incessionof departntroller) {return; } if (exante -ancementof usercontroller) {if (methodname.contains ("addadmin")) {response.sendreedirect (request.getContextPath () + "/auth/readonly"); } if (methodname.contains ("deleteadmin")) {response.sendreedirect (request.getContextPath () + "/auth/readonly"); } if (methodname.contains ("UpdateAdmin")) {response.sendreedIrect (request.getContextPath () + "/auth/readonly"); } if (methodname.contains ("UpdateAdmin")) {response.sendreedIrect (request.getContextPath () + "/auth/readonly"); } if (methodname.contains ("UpdateAdmin")) {response.sendreedIrect (request.getContextPath () + "/auth/readonly"); } возвращаться; } if (exanceOf instanceOf GroupController) {return; } logger.error ("Администратор департамента, и нет разрешений на операцию для администратора только для чтения!"); response.sendredirect (request.getContextPath () + "/auth/readonly"); } / *** Администратор приложения и администратор только для чтения* / if (permissionsLabeled.app_reader_admin.equals (roleflag)) {if (exanceof appcontroller) {return; } if (extance ObjectOf AppPolicyController) {return; } logger.Error ("Администратор приложения, и нет разрешений на операцию для администратора только для чтения!"); response.sendredirect (request.getContextPath () + "/auth/readonly"); } / *** Администратор департамента и администратор приложения и администратор только для чтения* / if (permissionslabeled.dept_app_reader_admin.equals (roleflag)) {if (объект объекта DepartmentOntroller) {return; } if (экземпляр объекта usercontroller) {return; } if (exanceOf instanceOf GroupController) {return; } if (extance ObjectOf AppController) {return; } if (extance ObjectOf AppPolicyController) {return; } logger.Error ("Администратор департамента и администратор приложения, а только администратор только для чтения не имеют разрешений на эксплуатацию"); response.sendredirect (request.getContextPath () + "/auth/readonly"); }}Выбор точечного выреза с управлением привилегией специализированного администратора
Поскольку это очень особенно иметь права на специальные администраторы, автор использует контроллер в дополнение к общим правам доступа. В особых обстоятельствах это может быть реализовано в логике кода. Код файла конфигурации следующим образом:
<aop: config> <!-определить раздел-> <aop: аспект идентификатор = "authaspect" ref = "userspermissionsadvice"> <!-определить точку входа (настраивается в соответствии с com.thundersoft.metadata.web.controller перехватывается до называться) com.thundersoft.metadata.web.controller.*.*(..)) и (! execution (*com.thundersoft.metadata.web.controller.findpasswordController.*(..) и! И выполнение (*com.thundersoft.metadata.web.controller.findpasswordcroller. com.thundersoft.metadata.web.controller.selfserviceController.*(..) и! выполнение (*com.thundersoft.metadata.web.controller.homecontroller.*(..) и! ! выполнение (* com.thundersoft.metadata.web.controller.dashboardcontroller.* (..))) и! выполнение (* com.thundersoft.metadata.web.controller.dashboardcontroller.* (..)) и! com.thundersoft.metadata.web.controller.maincontroller.*(..)))) "id =" appauthpointcut "/> <!-Выполнить перед методом-> <aop: перед методом =" appdeptauth "pointcut-ref =" appauthpointcut "/> </aop: appect> </aop ref =" appauthpointcut "/> </aop: Appoy>
## Внедрение кода адреса управления разрешением
/*** Вынести произвольное решение перехвата администратора заявки и администратора департамента. * @param joinpoint point. * @Throws ioException * / public void appdeptAuth (joinpoint joinpoint) бросает ioexception { / ** * Получить перехваченный метод. */ String methodname = joinpoint.getSignature (). GetName (); /*** Получите перехваченный объект. */ Object Object = joinPoint.getTarget (); logger.info («Управление разрешением AOP, имя метода», MethodName); Httpservlectrequest request = ((servletrequestattributes) requestContextholder.getRequestattributes ()). GetRequest (); Httpservletresponse response = ((servlectrequestattributes) requestContextholder.getRequestattributes ()). GetResponse (); String roleflag = getLoginuserInfor.getLoginUserrole (запрос); / *** Super Administrator*/ if (permissionsLabled.super_admin.equals (roleflag)) {return; } / *** Суждение администраторов приложения для внесения данных об изменении данных* / if (permissionslabeled.app_admin.equals (roleflag)) {if (exactionof appcontroller) {return; } if (extance ObjectOf AppPolicyController) {return; } logger.error ("Администратор приложения не имеет разрешений на операцию"); response.sendredirect (request.getContextPath () + "/auth/readonly"); } else if (permissionslabeled.dept_admin.equals (roleflag)) {if (exance instanceof departscontroller) {return; } if (экземпляр объекта usercontroller) {return; } if (exanceOf instanceOf GroupController) {return; } if ("getAlldepartments" .equals (methodname)) {return; } logger.error ("Администратор приложения не имеет разрешений на операцию"); response.sendredirect (request.getContextPath () + "/auth/readonly"); } else {return; }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.