自定义后端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也有动态权限控制,由于项目迭代,为了不影响项目原有业务,本人采用了灵活注解的方式控制。
最后,第一次分享技术文章的程序媛,文章如有不合之处欢迎指出,与大家共同进步。