自定义后端URL访问权限控制(注解方式)

一、背景

该文章将记录本人在项目中遇到的一个小问题和解决方案。
项目中使用Spring Security做认证和授权,权限只在前端做了按钮控制,若没有权限的用户直接通过URL也能访问,该文章主要记录通过注解方式控制后端URL访问权限。

二、数据库建表

权限控制标配的五张表(关联关系如下图所示):
用户表、角色表、菜单表、用户与角色关联表、角色与菜单关联表

在这里插入图片描述

三、后台代码实现

1. 创建权限控制注解(注解类名自定义)

@Target({
    
    ElementType.TYPE, ElementType.METHOD}) // 注解的参数可以根据自己的需要设置
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestPermissions {
    
    
    String value() default "";
}

2. 获取注解

private RequestPermissions getAnnotationLog(JoinPoint joinPoint) {
    
    
    Signature signature = joinPoint.getSignature();
    MethodSignature methodSignature = (MethodSignature) signature;
    Method method = methodSignature.getMethod();
    if (null != method) {
    
    
    	// 返回自定义的注解
        return method.getAnnotation(RequestPermissions.class);
    }
    return null;
}

3. 请求权限业务处理

@Aspect // 标记为一个切面,让容器读取
@Component
public class RequestPermissionsAspect {
    
    

	// @annotation的值为自定义注解类全限定名
    @Pointcut("@annotation(com.dome.test.RequestPermissions)")
    public void permissionsPointCut() {
    
    }

    @Before("permissionsPointCut()")
    public void doBefore(JoinPoint joinPoint) {
    
    
        this.handleRequestPermissions(joinPoint);
    }

    private void handleRequestPermissions(final JoinPoint joinPoint) {
    
    
        // 获取注解
        RequestPermissions request= this.getAnnotationLog(joinPoint);
        // 获取注解值(权限名)
        String value = requestPermissions.value(); // value="home:menu:list"
        // 此处可通过Shiro或者Spring Security获取用户拥有的权限(权限标识)
        List<String> userRoleList = getUserRoleList();
        // 权限业务逻辑处理
        TODO
        // 权限业务逻辑处理,例如:判断用户拥有的权限里是否包含注解value权限标识
        if(!userRoelList.contains(value)){
    
    
            throw new AnnotationException("您没有访问权限,请联系管理员添加");
        }
    }
}

4. 使用:在需要做权限控制的接口方法或在类上贴上该注解,注解值为权限标识

@RequestPermissions("home:menu:list")
@ApiOperation("菜单列表")
@GetMapping("/menu/list")
public ResultVO findMenuList(String name) {
    
    
    return ResultVO.ofSuccess(menuService.findMenuList(name));
}

到这一步后端URL权限控制的代码就完成了,权限控制有很多种方式,Shiro和Spring Security也有动态权限控制,由于项目迭代,为了不影响项目原有业务,本人采用了灵活注解的方式控制。

最后,第一次分享技术文章的程序媛,文章如有不合之处欢迎指出,与大家共同进步。

猜你喜欢

转载自blog.csdn.net/qq_37887542/article/details/108732121