[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();//执行目标方法
    }
}
相关文章
|
14小时前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
11 2
|
1天前
|
XML Java API
Spring AOP切点和通知机制的深度解析
Spring AOP切点和通知机制的深度解析
12 4
|
2天前
|
设计模式 SQL Java
Spring框架第四章(AOP概念及相关术语)
Spring框架第四章(AOP概念及相关术语)
|
2天前
|
存储 Java 数据安全/隐私保护
Spring Boot中实现邮箱登录/注册接口
Spring Boot中实现邮箱登录/注册接口
|
3天前
|
设计模式 网络安全 开发工具
|
4天前
|
XML 安全 Java
Spring高手之路19——Spring AOP注解指南
在本文中,我们将深入探索Spring AOP(面向切面编程)的核心概念及其在现代Spring应用中的实际应用。从基本的注解使用到复杂的切面配置,本文将一步步指导你如何利用Spring AOP提升代码的模块化,帮助你在Spring开发路上更进一步。
16 3
Spring高手之路19——Spring AOP注解指南
|
6天前
|
Java Maven 数据安全/隐私保护
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
18 1
|
6天前
|
缓存 Java uml
Spring压轴题:当循环依赖遇上Spring AOP
Spring压轴题:当循环依赖遇上Spring AOP
14 1
|
7天前
|
XML 监控 Java
Java一分钟之-Spring AOP:基于Spring的AOP
【6月更文挑战第13天】Spring框架集成AOP支持,便于实现如日志、监控和事务管理等关注点的集中管理。本文探讨Spring AOP的核心概念(切面、切入点、通知和代理),常见问题(代理对象理解不清、切入点表达式错误、通知类型混淆和事务管理配置不当)及其对策,并提供注解式日志记录代码示例。通过学习和实践,开发者能更好地运用Spring AOP提升代码质量。
16 2
|
9天前
|
Java Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之Web函数启动的Spring Boot项目可以通过什么方式配置Nginx
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。