[Spring] Web层AOP方式处理登录和权限问题

简介: 参考: [Spring] Web层AOP方式进行参数校验方法一样,只是把原来登陆和权限校验放在了AOP方法里。用户权限是存放在session里的。另外,如果登录时需要在注解里传入角色字段,可以用@Around("aopMethod() && @annotation(loginRequired)")实现。

参考: [Spring] Web层AOP方式进行参数校验

方法一样,只是把原来登陆和权限校验放在了AOP方法里。
用户权限是存放在session里的。
另外,如果登录时需要在注解里传入角色字段,可以用@Around("aopMethod() && @annotation(loginRequired)")实现。
其中,loginRequired是自定义的注解,如下:

package com.zp.haveplace.annotation;

import com.zp.haveplace.common.RoleConst;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * 有此注解的方法必须检查是否登录管理员,且是否具备value所指定的权限
 * @author zp
 * @date 2018/4/20
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
    String value() default RoleConst.ADMIN + "";//默认值为管理员权限
}

AOP部分代码

package com.zp.haveplace.aop;

import com.zp.haveplace.annotation.LoginRequired;
import com.zp.haveplace.bean.LoggerBean;
import com.zp.haveplace.bean.ResponseBean;
import com.zp.haveplace.common.ResponseBeanCode;
import com.zp.haveplace.common.ResponseBeanType;
import com.zp.haveplace.common.RoleConst;
import com.zp.haveplace.common.SessionConstant;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.net.ResponseCache;

/**
 * 对有 @LoginRequired 注解的web方法检查是否登录,并检查是否具有value所指定的权限
 * AOP方式
 * @author zp
 * @date 2018/4/20
 */
@Component
@Aspect
public class LoginRequiredAop {

    /**
     * 切入点
     * 设置切入点为web层
     * AspectJ支持命名切入点,方法必须是返回void类型
     */
    @Pointcut("execution(* com.zp.haveplace.web..*.*(..))")
    public void aopMethod(){}

    /**
     * 检查是否已经登录
     * web层方法且方法上有 '@LoginRequired' 注解
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("aopMethod() && @annotation(loginRequired)")
    public Object around(ProceedingJoinPoint joinPoint, LoginRequired loginRequired) throws Throwable{
        HttpServletRequest request = null;

        for(Object arg:joinPoint.getArgs()){//遍历被通知方法的参数列表
            if(arg instanceof HttpServletRequest){
                request = (HttpServletRequest) arg;
            }
        }

        // 没有找到request参数,无法检查权限
        if(request == null){
            LoggerBean.SYSTEM.error("检查权限时未找到HttpServletRequest参数,可能绑定失败");
            return new ResponseBean().setErrorResponse("系统出现错误,检查权限时未找到HttpServletRequest参数");
        }

        // 检查登录
        if(request.getSession().getAttribute(SessionConstant.LOGIN_ADMIN_ACCOUNT_SESSION_KEY) == null){
            return new ResponseBean().setResponse(ResponseBeanType.ERROR,
                    ResponseBeanCode.NO_LOGIN,
                    "您未登录");
        }

        // 检查权限
        Integer role = (Integer)request.getSession().getAttribute(SessionConstant.LOGIN_ADMIN_ROLE_SESSION_KEY);
        if(role > Integer.valueOf(loginRequired.value())){
            return new ResponseBean().setResponse(ResponseBeanType.ERROR,
                    ResponseBeanCode.NO_POWER,
                    "您没有权限,需要" +
                            RoleConst.ROLE_INFO[Integer.valueOf(loginRequired.value())] +
                            "权限");
        }

        return joinPoint.proceed();//执行目标方法
    }
}
相关文章
|
5天前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
13天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
56 8
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
80 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
96 5
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
91 8
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
53 5
|
2月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
59 4
|
2月前
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
94 0