Los escenarios utilizados por AOP en proyectos reales son principalmente gestión de autoridad, gestión de transacciones, gestión de seguridad, registro y depuración.
El problema proviene del desarrollo del proyecto
Recientemente, se necesita un módulo de gestión de permisos en el proyecto. Según el enfoque del colega anterior, es hacer juicios lógicos antes de cada interfaz en la llamada de la capa del controlador. No hay nada de malo en hacer esto, pero la tasa de repetición del código es demasiado alta, y es trabajo físico. Entonces, como se menciona en el título, use AOP Spring para hacer un punto de hendidura para lograr la gestión de permisos de las funciones generales, lo que reduce la escalabilidad del desarrollo posterior del proyecto.
ALIMENTOS DE IMPLEMENTA DE CÓDIGO Y ARCHIVOS DE CONFIGURACIÓN PARA LA GRAJE DE PERMISO
Con el grado mínimo de modificación del código, AOP es, sin duda, la opción ideal. Hay varios permisos en el proyecto, y la complejidad lógica es relativamente alta, por lo que lo tomaremos paso a paso. Debido a que los permisos implican llamadas a la interfaz de backend, el autor elige hacer una sección en el código de la capa del controlador, y el punto Tangent son los diversos bloques de métodos en el controlador. Para los permisos de acceso general, utilizamos la expresión de ejecución para excluirlos.
Implementación de permisos de administrador de solo lectura y selección de corte de puntos
Para el controlador que implementa la exclusión general, el autor utiliza la operación de lógica de expresión de ejecución. Debido a que el administrador de solo lectura tiene permisos de lectura globales, y para los permisos de agregar, eliminar y modificar, el autor utiliza el método de agregar, eliminar y modificar el uso de puntos. Por lo tanto, el nombre de método estandarizado es muy importante en este momento. Para varios administradores que están compuestos con administradores de solo lectura, podemos emitir juicios especiales en el código. El siguiente es el método de configuración del archivo de configuración de Spring AOP.
<bean id = "userserPermissionSAdVice" /> <aop: config> <!-Define la sección-> <aop: aspecto id = "autaspect" ref = "usersPermissionSAdVice"> <!-Define el punto de entrada (configurado en com.thundersoft.metadata.web.controller.*. edit*(...)) o la ejecución (* com.thundersoft.metadata.web.controller.*. edit*(..)) o ejecución (*com.thundersoft.metadata.web.controller.*. edit*(..))) o ejecución (*com.thundersoft.metadata.web.controller.*. del*(..) o ejecución (** com.thundersoft.metadata.web.controller.*. update*(..)) o ejecución (*com.thundersoft.metadata.web.controller.*. insert*(..)) o ejecución (*com.thundersoft.metadata.web.controller.*. modif*(..)) o ejecución (* com.thundersoft.metadata.web.controller.*. Down*(..)))) y (! Ejecutivo (*com.thundersoft.metadata.web.controller.findpasswordController.*(..)) y! Execution (*com.thundersoft.metadata.web.Controller.selfssservicecontroller.*(...) (*) y! com.thundersoft.metadata.web.controller.homecontroller.*(..)) y! Execution (*com.thundersoft.metadata.web.controller.userstatusController.*(..)) y! Executionsoft.metadata.web.controller.userstatuscontrolncontrolcontrolloncontrolcontrolncontrolloncontrolloncontrollon com.thundersoft.metadata.web.controller.dashboardController.*(..)) y! Ejecutivo (*com.thundersoft.metadata.web.controller.maincontroller.*(..)))) "id =" authpointcut "/> <!-Ejecutivo antes de que se llame al método-> <aop: antes del método =" Readly " PointCut-Ref = "AuthpointCut"/> </aop: aspecto> </aop: config>
Implementación del código de gestión del permiso del administrador de solo lectura
He dicho mucho por encima, y no diré muchas tonterías. A continuación se muestra una implementación del código seccional que controla los permisos de solo lectura y varios permisos compuestos.
/*** El juicio de intercepción de AOP se realiza en los administradores de solo lectura y sus administradores compuestos. * @Param Un JoinPoint Punto de entrada. * @throws ioException * / public void Readonly (unión de unión de unión) lanza ioexception { / ** * Obtener el método interceptado. */ String MethodName = JoinPoint.GetSignature (). GetName (); /*** Obtenga el objeto interceptado. */ Object Object = unkenpoint.getTarget (); logger.info ("Managemento de permiso AOP, nombre del método" + MethodName); HttpservletRequest request = ((ServLetRequestAtTributes) requestContexTholder.getRequestatTributes ()). GetRequest (); HttpServletResponse Response = ((ServLetRequestatTributes) requestContexTholder.getRequestatTributes ()). GetResponse (); Cadena rolflag = getLoginUserInfor.getLoginusErrole (solicitud); / *** Super Administrador*/ if (PermissionsLabeled.super_admin.equals (roleFlag)) {return; } / *** El juicio de los administradores de solo lectura para realizar cambios de datos a los permisos* / if (permissionsLabeled.reader_admin.equals (rolflag)) {logger.error ("El administrador de lectura no tiene permiso de operación!"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); } / ** * Administrador del departamento, y es un administrador de solo lectura, * / if (PermissionsLabeled.Dept_Reader_admin.equals (RoleFlag)) {if (Object OnstoneOf DepartmentController) {return; } if (Object OnstoneOf UserController) {if (MethodName.Contains ("AddAdmin")) {Response.Sendedirect (request.getContextPath () + "/auth/readonly"); } if (metodName.Contains ("DeleteAdmin")) {Response.Sendedirect (request.getContextPath () + "/auth/readonly"); } if (metodName.Contains ("updateadmin")) {Response.sendedirect (request.getContextPath () + "/auth/readonly"); } if (metodName.Contains ("updateadmin")) {Response.sendedirect (request.getContextPath () + "/auth/readonly"); } if (metodName.Contains ("updateadmin")) {Response.sendedirect (request.getContextPath () + "/auth/readonly"); } devolver; } if (objeto instanceOf GroupController) {return; } logger.error ("Administrador del departamento, y sin permisos de operación para administrador de solo lectura!"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); } / *** Administrador de aplicaciones, y administrador de solo lectura* / if (PermissionSLabeled.app_reader_admin.equals (rolyFlag)) {if (object OnstoneOf AppController) {return; } if (objeto instanceof apppolicyController) {return; } logger.error ("Administrador de aplicaciones, y sin permisos de operación para administrador de solo lectura!"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); } / *** Administrador del departamento, y administrador de aplicaciones, y administrador de solo lectura* / if (PermissionSLabeled.Dept_App_Reader_admin.equals (rolyFlag)) {if (Object instanceOf DepartmentController) {return; } if (objeto instancia de UserController) {return; } if (objeto instanceOf GroupController) {return; } if (objeto instanceof appController) {return; } if (objeto instanceof apppolicyController) {return; } logger.error ("Administrador del departamento y administrador de aplicaciones, y el administrador de solo lectura no tiene permisos de operación"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); }}Selección de corte de puntos con control de privilegio de administrador dedicado
Debido a que es bastante especial tener derechos especiales de administrador, el autor usa el controlador además de los derechos de acceso general. En circunstancias especiales, se puede implementar en la lógica del código. El código del archivo de configuración es el siguiente:
<aop: config> <!-Define la sección-> <aop: aspecto id = "autaspect" ref = "usersPermissionSAdVice"> <!-Definir el punto de entrada (configurado en com.thundersoft.metadata.web.controller se intercepta antes de ser llamado)-> <aop: puntocut expresión = "(ejecutivo (* (** com.thundersoft.metadata.web.controller.*.*(..)) y (! Ejecutivo (*com.thundersoft.metadata.web.controller.findpasswordController.*(..)) y! Ejecution (*com.thundersoft.metadata.web.controller.findPassWordController. com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) y! Ejecutivo (*com.thundersoft.metadata.web.controller.homecontroller.*(..)) y! ejutuutionsoft.metadata.web.controller.dashboardcontroller.*(...)) com.thundersoft.metadata.web.controller.dashboardController.*(..))) y! Ejecutivo (*com.thundersoft.metadata.web.controller.dashboardController.*(..))) y! Exec.ThunderSoft.metadata.web.Controller.MainController.*(..))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) id = "appAuthpointCut"/> <!-Ejecutar antes de que se llame el método-> <aop: antes del método = "appDepteuth" PointCut-ref = "AppAuthpointCut"/> </aop: aspecto> </aop: config>
## La implementación del código de dirección de la gestión de permisos
/*** Haga un juicio de intercepción arbitraria sobre el administrador de la solicitud y el administrador del departamento. * @Param Un JoinPoint Punto de entrada. * @throws ioException * / public void appDepTauth (unión de unión de unión) lanza ioexception { / ** * Obtener el método interceptado. */ String MethodName = JoinPoint.GetSignature (). GetName (); /*** Obtenga el objeto interceptado. */ Object Object = unkenpoint.getTarget (); logger.info ("AOP de gestión de permisos, nombre del método", MethodName); HttpservletRequest request = ((ServLetRequestAtTributes) requestContexTholder.getRequestatTributes ()). GetRequest (); HttpServletResponse Response = ((ServLetRequestatTributes) requestContexTholder.getRequestatTributes ()). GetResponse (); Cadena rolflag = getLoginUserInfor.getLoginusErrole (solicitud); / *** Super Administrador*/ if (PermissionsLabeled.super_admin.equals (roleFlag)) {return; } / *** El juicio de los administradores de aplicaciones para hacer los cambios de datos permisos* / if (permissionsLabeled.app_admin.equals (rolyFlag)) {if (object OnstoneOf AppController) {return; } if (objeto instanceof apppolicyController) {return; } logger.error ("El administrador de la aplicación no tiene permisos de operación"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); } else if (permissionsLabeled.dept_admin.equals (rolyflag)) {if (object OnstoneOf DepartmentController) {return; } if (objeto instancia de UserController) {return; } if (objeto instanceOf GroupController) {return; } if ("getAllDepartments" .equals (métodeName)) {return; } logger.error ("El administrador de la aplicación no tiene permisos de operación"); respuesta.sendedirect (request.getContextPath () + "/auth/readonly"); } else {return; }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.