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

   日期:2020-09-23     浏览:141    评论:0    
核心提示:后端URL访问权限控制(注解方式)一、背景二、数据库建表三、后台代码实现1. 创建权限控制注解(注解类名自定义)2. 获取注解3. 请求权限业务处理4. 使用:在需要做权限控制的接口方法或在类上贴上该注解,注解值为权限标识一、背景该文章将记录本人在项目中遇到的一个小问题和解决方案。项目中使用Spring Security做认证和授权,权限只在前端做了按钮控制,若没有权限的用户直接通过URL也能访问,该文章主要记录通过注解方式控制后端URL访问权限。二、数据库建表权限控制标配的五张表(关联关系如下图

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

    • 一、背景
    • 二、数据库建表
    • 三、后台代码实现
      • 1. 创建权限控制注解(注解类名自定义)
      • 2. 获取注解
      • 3. 请求权限业务处理
      • 4. 使用:在需要做权限控制的接口方法或在类上贴上该注解,注解值为权限标识

一、背景

该文章将记录本人在项目中遇到的一个小问题和解决方案。
项目中使用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也有动态权限控制,由于项目迭代,为了不影响项目原有业务,本人采用了灵活注解的方式控制。

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服