Les scénarios utilisés par AOP dans les projets réels sont principalement la gestion des autorités, la gestion des transactions, la gestion de la sécurité, l'exploitation forestière et le débogage.
Le problème découle du développement du projet
Récemment, un module de gestion des autorisations est nécessaire dans le projet. Selon l'approche du collègue précédent, il s'agit de porter des jugements logiques avant chaque interface de l'appel de couche de contrôleur. Il n'y a rien de mal à faire cela, mais le taux de répétition du code est trop élevé, et c'est un travail physique. Ainsi, comme mentionné dans le titre, utilisez Spring AOP pour faire un point de fente pour réaliser la gestion de l'autorisation des fonctions générales, ce qui réduit l'évolutivité du développement ultérieur du projet.
Fichiers d'implémentation et de configuration du code pour la gestion de l'autorisation
Avec le degré minimum de modification du code, AOP est sans aucun doute le choix idéal. Il existe diverses autorisations dans le projet, et la complexité logique est relativement élevée, nous allons donc le faire étape par étape. Étant donné que les autorisations impliquent des appels à l'interface backend, l'auteur choisit de faire une section dans le code de couche du contrôleur, et le point tangent est les différents blocs de méthode dans le contrôleur. Pour les autorisations d'accès général, nous utilisons l'expression d'exécution pour les exclure.
Implémentation des autorisations administratrices en lecture seule et sélection de points
Pour le contrôleur qui implémente l'exclusion générale, l'auteur utilise l'opération de logique d'expression d'exécution. Étant donné que l'administrateur en lecture seule a des autorisations de lecture globales et que pour les autorisations d'ajout, de supprimer et de modifier, l'auteur utilise la méthode d'ajout, de supprimer et de modifier à l'aide de coupe ponctuelle. Ainsi, la dénomination de la méthode standardisée est très importante pour le moment. Pour divers administrateurs qui sont aggravés par des administrateurs en lecture seule, nous pouvons porter des jugements spéciaux dans le code. Ce qui suit est la méthode de configuration du fichier de configuration de Spring AOP.
<bean id = "UsersPerMissionsAdvice" /> <aop: config> <! - Définissez la section -> <aop: aspect id = "Authaspect" ref = "UsersperMissionsAdvice"> <! - Définissez le point d'entrée (configuré sous com.thundersoft.metadata.web.controller. *. Edit * (..) ou exécution (* *. com.thundersoft.metadata.web.controller. *. Edit * (..) ou exécution (* com.thundersoft.metadata.web.controller. *. Edit * (..)) ou exécution (* com.thundersoft.metadata.web.Controller. *. del * (..) ou exécution (* * * com.thundersoft.metadata.web.controller. *. Update * (..)) ou exécution (* com.thundersoft.metadata.web.controller. *. INSERT * (..) ou exécution (* com.thundersoft.metadata.web.contreller. *. Modif * (..))) ou l'exécution (* com.thundersoft.metadata.web.controller. *. Down * (..)))) et (! Execution (* com.thundersoft.metadata.web.controller.findpasswordController. * (..)) et! Execution (* com.thundersoft.metadata) et controller. ! EXÉCUTION (* com.thundersoft.metadata.web.controller.homeController. * (..)) et! EXECUTION (* com.thundersoft.metadata.web.controller.userstatusController. * (..) et! EXÉMUTION (* com.thundersoft.metadata.web.controller.userstatusController. * (..))) et! Execution (* com.thundersoft.metadata.web.Controller.DashboardController. * (..) et! Execution (* com.thundersoft.Metadata.web.Controller id = "authpointcut" /> <! - Exécution avant que la méthode ne soit appelée -> <aop: avant méthode = "readonly" Pointcut-ref = "AuthPointcut" /> </aop: aspect> </ aop: config>
Implémentation du code de gestion de l'autorisation administratrice en lecture seule
J'ai dit tellement de choses ci-dessus, et je ne dirai pas grand-chose de non-sens. Vous trouverez ci-dessous une implémentation de code sectionnelle qui contrôle les autorisations en lecture seule et diverses autorisations composées.
/ ** * Le jugement d'interception AOP est effectué sur les administrateurs en lecture seule et leurs administrateurs composés. * @param joinpoint Point d'entrée. * @throws ioException * / public void readonly (joinpoint joinpoint) lève ioException {/ ** * obtenir la méthode interceptée. * / String MethodName = joinpoint.getSignature (). GetName (); / ** * Obtenez l'objet intercepté. * / Objet objet = joinpoint.getTarget (); Logger.info ("Gestion de la permission AOP, nom de la méthode" + méthode); HttpServLetRequest request = ((servLetRequestAttributes) requestContexTholder.getRequestAttributes ()). GetRequest (); HttpServletResponse Response = ((servLetRequestAttributes) requestContexTholder.getRequestAttributes ()). GetResponse (); String RoleFlag = getLoginUserRfor.getLoginUserrole (demande); / ** * super administrateur * / if (permissionsLabeled.super_admin.equals (roleFlag)) {return; } / ** * Le jugement des administrateurs en lecture uniquement pour apporter des modifications aux données aux autorisations * / if (autorisation ennabeled.reader_admin.equals (RoleFlag)) {Logger.Error ("L'administrateur ReadOnly n'a pas d'autorisation d'opération!"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } / ** * Administrateur de département, et est un administrateur en lecture seule, * / if (PermisessionsLabeled.dept_reader_admin.equals (RoleFlag)) {if (objet instance Of DepartmentController) {return; } if (objet instanceof userController) {if (methodName.Contains ("addadmin")) {réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } if (methodName.Contains ("Deleleadmin")) {réponse.SenDredirect (request.getContextPath () + "/ auth / readonly"); } if (méthodyName.Contains ("updateAdmin")) {réponse.SenDredirect (request.getContextPath () + "/ auth / readonly"); } if (méthodyName.Contains ("updateAdmin")) {réponse.SenDredirect (request.getContextPath () + "/ auth / readonly"); } if (méthodyName.Contains ("updateAdmin")) {réponse.SenDredirect (request.getContextPath () + "/ auth / readonly"); } retour; } if (objet instanceof groupController) {return; } logger.error ("Administrateur de département, et aucune autorisation d'opération pour l'administrateur en lecture seule!"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } / ** * Administrateur d'application et administrateur en lecture seule * / if (permissionsLabeled.app_reader_admin.equals (roleFlag)) {if (objet instanceof appController) {return; } if (objet instanceof AppPolicyController) {return; } logger.error ("Administrateur d'application, et aucune autorisation d'opération pour l'administrateur en lecture seule!"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } / ** * Administrateur du département, et administrateur de demande, et administrateur en lecture seule * / if (PermissionsLabeled.dept_app_reader_admin.equals (RoleFlag)) {if (objet instanceof DepartmentController) {return; } if (instance d'objet Of UserController) {return; } if (objet instanceof groupController) {return; } if (objet instanceof AppController) {return; } if (objet instanceof AppPolicyController) {return; } logger.error ("L'administrateur du département et l'administrateur de la demande et l'administrateur en lecture seule n'ont pas d'autorisations d'opération"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); }}Sélection ponctuelle avec contrôle du privilège administrateur dédié
Parce qu'il est assez spécial d'avoir des droits d'administrateur spéciaux, l'auteur utilise le contrôleur en plus des droits d'accès général. Dans des circonstances particulières, il peut être implémenté dans la logique du code. Le code de fichier de configuration est le suivant:
<aop: config> <! - Définissez la section -> <aop: aspect id = "authaspect" ref = "UsersperMissionsAdvice"> <! - Définissez le point d'entrée (configuré sous com.thundersoft.metadata.web.Controller est intercepté avant d'être appelé) -> <aop: Pointcut Expression = "(Exécution (* com.thundersoft.metadata.web.controller. *. * (..)) et (! Execution (* com.thundersoft.metadata.web.controller.findpasswordController. * (..)) et! EXECUTION (* com.thundersoft.Metadata.web.Controller.FindPasswordController. ! EXÉCUTION (* com.thundersoft.metadata.web.controller.selfserviceController. * (..)) et! Execution (* com.thundersoft.metadata.web.controller.homecontroller. * (..) et! Exécution (* com.thundersoft.metadata.web.controller.dashboardController. * (..)) et! Execution (* com.thundersoft.metadata.web.controller.dashboardController. * (..)) et! Execution (* com.thundersoft.metadata.web.Controller ! Execution (* com.thundersoft.metadata.web.controller.mainController. * (..)))) "id =" AppAuthPointcut "/> <! - Exécuter avant que la méthode ne soit appelée -> <aop: avant méthode =" AppDeptAuth "Pointcut-Ref =" AppAuthPoint "/> </ APPORT: Aspect>
## Code d'adresse Implémentation de la gestion de l'autorisation
/ ** * rendre un jugement d'interception arbitraire sur l'administrateur de la demande et l'administrateur du département. * @param joinpoint Point d'entrée. * @throws ioException * / public void appdeptAuth (joinpoint joinpoint) lève ioException {/ ** * obtenir la méthode interceptée. * / String MethodName = joinpoint.getSignature (). GetName (); / ** * Obtenez l'objet intercepté. * / Objet objet = joinpoint.getTarget (); Logger.info ("Gestion de la permission AOP, Nom de la méthode", MethodName); HttpServLetRequest request = ((servLetRequestAttributes) requestContexTholder.getRequestAttributes ()). GetRequest (); HttpServletResponse Response = ((servLetRequestAttributes) requestContexTholder.getRequestAttributes ()). GetResponse (); String RoleFlag = getLoginUserRfor.getLoginUserrole (demande); / ** * super administrateur * / if (permissionsLabeled.super_admin.equals (roleFlag)) {return; } / ** * Le jugement des administrateurs d'application pour effectuer des modifications de données Autorisations * / if (PermissionsLabeled.App_admin.equals (RoleFlag)) {if (instance d'objet AppController) {return; } if (objet instanceof AppPolicyController) {return; } logger.error ("L'administrateur d'application n'a aucune autorisation d'opération"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } else if (permissionsLabeled.dept_admin.equals (RoleFlag)) {if (objet instance Of DepartmentController) {return; } if (instance d'objet Of UserController) {return; } if (objet instanceof groupController) {return; } if ("getAllDepartments" .Equals (méthodyName)) {return; } logger.error ("L'administrateur d'application n'a aucune autorisation d'opération"); réponse.SendRedirect (request.getContextPath () + "/ auth / readonly"); } else {return; }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.