关于小项目权限功能的设计和权限表的维护

说到权限的时候首先要了解RBAC,用户 角色 权限之前的关系,方便系统维护 大数据量的用户

1.实现步骤

设计表 因为是小项目用到四张就可以了  用户表  权限表 和角色表就行了

因为角色和权限是一对多的关系,所以permission字段是String类型就可以了

 

 2.切权限注解@Aspect注解去切注解 如果不知道Aspect的含义建议去百度一下

根据实际业务去选择注解切割 这里我用的是around环绕通知去切,利用  Annotation的反射机制去切到value值,他执行方法是会去调这个类,这里去比对是否符合权限

  1. 使用 ProceedingJoinPoint 获取参数信息
  2. 使用joinPoint.proceed()方法调用方法。
  3. 只有调用上面的方法才能够执行方法
@Aspect
@Component
public class PreAuthorizeAspect {

    @Autowired
    private PermissionService permissionService;
    //@Pointcut("execution(* cn.abtu.controller.*.*(..))")
    @Pointcut("@annotation(cn.abtu.security.Permission)")
    public void acpectMethod(){

    }


    @Around("acpectMethod()&&@annotation(permission)")
    public Object doAround(ProceedingJoinPoint joinPoint, Permission permission) throws Throwable {
        // 接收到请求,记录请求内容
        String value = permission.value();
        LoginUser loginUser = SecurityUtils.getLoginUser();
        System.err.println(permissionService.hasPermi(value));
        if(!loginUser.getIsSupper()&&!permissionService.hasPermi(value)){
            // 如果不是超级管理员并且没有权限
            throw new BusinessException(HttpStatus.UNAUTHORIZED, "暂无权限,请联系管理员!");
        }
        return joinPoint.proceed();
    }


}

 3.简单的看一个方法权限注解放置的位置

/**
 * 获取管理员列表
 *
 * @param role 角色id,0表示超级管理员
 * @param nick 昵称(可模糊)
 * @param account 账号(可模糊)
 * @param pageNum 页码
 * @param pageSize 页码大小
 * @return
 */
@GetMapping("/list")
@Permission("admin:get")
public AjaxResult list(
        @RequestParam Integer role,
        @RequestParam(required = false) String nick,
        @RequestParam(required = false) String account,
        @RequestParam Integer pageNum,
        @RequestParam Integer pageSize

) {
    startPage();
    Admin admin=new Admin();
    admin.setNick(nick);
    admin.setRole(role);
    admin.setAccount(account);
    QueryWrapper<Admin> queryWrapper = new QueryWrapper<>(admin);
    return getDataTable(adminService.list(queryWrapper));
}

 4.自定义权限类

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Permission {

    /**
     * @return the Spring-EL expression to be evaluated before invoking the protected
     * method
     */
    String value();

}

5. permissionService.hasPermi(value)校验用户是否有权限

/**
 * 验证用户是否具备某权限
 * 
 * @param permission 权限字符串
 * @return 用户是否具备某权限
 */
public boolean hasPermi(String permission)
{
    if (StringUtils.isEmpty(permission))
    {
        return false;
    }
    LoginUser loginUser = SecurityUtils.getLoginUser();
    if (StringUtils.isNull(loginUser))
    {
        return false;
    }
    // 超级管理员放行
    if(loginUser.getIsSupper()){
        return true;
    }
    if(CollectionUtils.isEmpty(loginUser.getPermissions())){
        return false;
    }
    //PermissionContextHolder.setContext(permission);
    return hasPermissions(loginUser.getPermissions(), permission);
    //return true;
}

 

6. 后续只有根据具体业务需求去对应角色加权限就行了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值