[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();//执行目标方法
    }
}
相关文章
|
30天前
|
Java 数据库连接 数据库
spring--为web(1),富士康java面试题整理
spring--为web(1),富士康java面试题整理
|
1月前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
310 3
|
5天前
|
Java Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之Web函数启动的Spring Boot项目可以通过什么方式配置Nginx
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
9天前
|
JSON 前端开发 API
Apache HttpClient调用Spring3 MVC Restful Web API演示
Apache HttpClient调用Spring3 MVC Restful Web API演示
11 1
|
9天前
|
XML Java 应用服务中间件
在Web Application中集成CAS登录模块
在Web Application中集成CAS登录模块
9 0
|
9天前
|
前端开发 Java BI
Spring3 Web MVC 集成Jasper Report生成PDF例子
Spring3 Web MVC 集成Jasper Report生成PDF例子
26 7
|
9天前
|
移动开发 Java Maven
基于OSGi的Virgo Server最简单Spring web实例
基于OSGi的Virgo Server最简单Spring web实例
12 0
|
12天前
|
JSON 前端开发 Java
Spring Web MVC入门(3)——响应
Spring Web MVC入门(3)——响应
13 1
|
12天前
|
存储 前端开发 Java
Spring Web MVC入门(2)——请求(下)
Spring Web MVC入门(2)——请求
17 0
|
12天前
|
JSON 前端开发 Java
Spring Web MVC入门(2)——请求(上)
Spring Web MVC入门(2)——请求
12 0