Os cenários usados pela AOP em projetos reais são principalmente gerenciamento de autoridade, gerenciamento de transações, gerenciamento de segurança, log e depuração.
O problema decorre do desenvolvimento do projeto
Recentemente, é necessário um módulo de gerenciamento de permissão no projeto. De acordo com a abordagem do colega anterior, é para fazer julgamentos lógicos antes de cada interface na chamada da camada do controlador. Não há nada de errado em fazer isso, mas a taxa de repetição de código é muito alta e é trabalho físico. Assim, como mencionado no título, use o Spring AOP para fazer um ponto de fenda para alcançar o gerenciamento de permissão das funções gerais, o que reduz a escalabilidade do desenvolvimento posterior do projeto.
Implementação de código e arquivos de configuração para gerenciamento de permissão
Com o grau mínimo da modificação do código, a AOP é sem dúvida a escolha ideal. Existem várias permissões no projeto, e a complexidade lógica é relativamente alta, por isso o levaremos passo a passo. Como as permissões envolvem chamadas para a interface de back -end, o autor escolhe fazer uma seção no código da camada do controlador, e o ponto tangente são os vários bloqueios de método no controlador. Para permissões de acesso geral, usamos a expressão de execução para excluí -las.
Implementação de permissões de administrador somente leitura e seleção de pontos de ponto
Para o controlador que implementa a exclusão geral, o autor usa operação lógica de expressão de execução. Como o administrador somente leitura possui permissões de leitura global e, para as permissões de adição, exclusão e modificação, o autor usa o método de adicionar, excluir e modificar usando o corte de pontos. Portanto, a nomeação do método padronizado é muito importante no momento. Para vários administradores compostos com administradores somente leitura, podemos fazer julgamentos especiais no código. A seguir, é apresentado o método de configuração do arquivo de configuração da Spring AOP.
<bean id = "userspermissionsadvice" /> <aOP: config> <!-define a seção-> <aOP: aspecto id = "authaspect" ref = "userspermissionsadvice"> <!-define o ponto de entrada (configurado sob com.thundersoft.metadata.web.Contoller. com.thundersoft.metadata.web.controller.*. Edit*(..)) ou execução (*com.thundersoft.metadata.web.controller. com.thundersoft.metadata.web.controller.*. update*(..)) ou execução (*com.thundersoft.metadata.web.Controller. com.thundersoft.metadata.web.controller.*. Down*(..))))) e (! com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) e! com.thundersoft.metadata.web.controller.userstatuscontroller.*(..)) e! com.thundersoft.metadata.web.controller.dashboardcontroller.*(..)) e! Pointcut-ref = "AuthPointCut"/> </AOP: Aspect> </AOP: config>
Implementação de código de gerenciamento de permissão apenas para leitura
Eu disse muito acima e não vou dizer muita bobagem. Abaixo está uma implementação de código seccional que controla as permissões somente leitura e várias permissões compostas.
/*** O julgamento da interceptação da AOP é realizado em administradores somente leitura e seus administradores compostos. * Ponto de entrada do ponto de junta @param. * @THOWS IOException * / public void readOnly (juntpoint junçãoint) lança ioexception { / ** * Obtenha o método interceptado. */ String methodName = junçãoPoint.getSignature (). GetName (); /*** Obtenha o objeto interceptado. */ Objeto objeto = jun juntpoint.getTarget (); Logger.info ("Gerenciamento de permissão AOP, nome do método" + MethodName); HttpServletRequest request = ((servletRequestAttributes) requestContextholder.getRequestAttributes ()). GetRequest (); HttpServletResponse Response = ((servletRequestattributes) requestContextholder.getRequestAttributes ()). GetResponse (); String roleflag = getLoginUserinfor.getLoginUserrole (solicitação); / *** Super Administrator*/ if (PermissionsLabeled.super_admin.equals (RoleFlag)) {return; } / *** O julgamento dos administradores somente leitura para fazer alterações de dados nas permissões* / if (permissionslabeled.reader_admin.equals (funçãoflag)) {Logger.error ("Administrador ReadOnly não tem permissão de operação!"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); } / ** * Administrador do departamento e é um administrador somente leitura, * / if (permissionslabeled.dept_reader_admin.equals (roleflag)) {if (object instanceof departmentController) {return; } if (Instância do objeto de 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"); } if (MethodName.Contains ("Updateadmin")) {Response.SendRedirect (request.getContextPath () + "/auth/readOnly"); } if (MethodName.Contains ("Updateadmin")) {Response.SendRedirect (request.getContextPath () + "/auth/readOnly"); } retornar; } if (object instânciaof groupController) {return; } Logger.error ("Administrador do departamento e nenhuma permissões de operação para administrador somente leitura!"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); } / *** Administrador de aplicativos e administrador somente leitura* / if (permissionslabeled.app_reader_admin.equals (roleflag)) {if (object instanceof appController) {return; } if (instância do objeto de apppolicyController) {return; } Logger.error ("Administrador de aplicativos e nenhuma permissões de operação para administrador somente leitura!"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); } / *** Administrador de departamento e administrador de aplicativos e administrador somente leitura* / if (PermissionsLabeled.Dept_App_Reader_ADmin.equals (RoleFlag)) {if (objeto de departamentoController) {return; } if (Instância do objeto de UserController) {return; } if (object instânciaof groupController) {return; } if (instância do objeto de appController) {return; } if (instância do objeto de apppolicyController) {return; } Logger.error ("Administrador de departamento, administrador de aplicativos e administrador somente leitura não têm permissões de operação"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); }}Seleção de corte de pontos com controle de privilégio de administrador dedicado
Como é bastante especial ter direitos de administrador especiais, o autor usa o controlador, além dos direitos gerais de acesso. Em circunstâncias especiais, ele pode ser implementado na lógica do código. O código do arquivo de configuração é o seguinte:
<AoP: config> <!-Defina a seção-> <AOP: aspecto id = "authAspect" ref = "userspermissionsAdvice"> <!-Defina o ponto de entrada (configurado em com.thundersoft.metadata.web.controller é interceptado antes de ser chamado)-> <aop: pointcut. com.thundersoft.metadata.web.controller.*.*(..)) e (! ! com.thundersoft.metadata.web.controller.dashboardcontroller.*(..)) e! com.thundersoft.metadata.web.controller.dashboardcontroller.*(..)))) e! Method = "AppDeptauth" Pointcut-ref = "AppauthpointCut"/> </AOP: Aspect> </AOP: Config>
## Endereço Código Implementação do gerenciamento de permissão
/*** Faça julgamento de interceptação arbitrária sobre o administrador do aplicativo e o administrador do departamento. * Ponto de entrada do ponto de junta @param. * @THOWS IOException * / public void AppDeptauth (JOUNPOINTIONPOint) lança IoException { / ** * Obtenha o método interceptado. */ String methodName = junçãoPoint.getSignature (). GetName (); /*** Obtenha o objeto interceptado. */ Objeto objeto = jun juntpoint.getTarget (); Logger.info ("Gerenciamento de permissão AOP, nome do método", MethodName); HttpServletRequest request = ((servletRequestAttributes) requestContextholder.getRequestAttributes ()). GetRequest (); HttpServletResponse Response = ((servletRequestattributes) requestContextholder.getRequestAttributes ()). GetResponse (); String roleflag = getLoginUserinfor.getLoginUserrole (solicitação); / *** Super Administrator*/ if (PermissionsLabeled.super_admin.equals (RoleFlag)) {return; } / *** O julgamento dos administradores de aplicativos para fazer alterações de dados permissões* / if (PermissionsLabeled.app_admin.equals (roleflag)) {if (object instânciaof appController) {return; } if (instância do objeto de apppolicyController) {return; } logger.error ("Administrador de aplicativos não tem permissões de operação"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); } else if (permissionslabeled.dept_admin.equals (roleflag)) {if (object instanceof DepartmentController) {return; } if (Instância do objeto de UserController) {return; } if (object instânciaof groupController) {return; } if ("getAllDepartments" .equals (MethodName)) {return; } logger.error ("Administrador de aplicativos não tem permissões de operação"); Response.sendRedirect (request.getContextPath () + "/auth/readonly"); } else {return; }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.