spring中web项目请求页面权限控制

简介

在web项目中,我们在页面访问的时候,很多页面是需要做权限控制的,那么我们一起来看看我们怎么做权限控制的吧。

实战

1、创建注解类:PermissionManage.java

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * Authoor SHUSONGPING
 *
 * @Date 2019/12/16
 * @Version 1.0
 * @companty IT好帅公司出品
 */
@Retention(RUNTIME)
@Target(METHOD)
public @interface PermissionManage {
    long value() default 0;
}

2、创建页面资源名称处理器

a、接口:PageService.java

public interface PageService {
    String getPageName(String pageName,Long permissionLevel);
}

b、实现类:PageServiceImpl.java

@Service
public class PageServiceImpl implements PageService {

    @Override
    @PermissionManage
    public String getPageName(String pageName,Long permissionLevel){
        return pageName;
    }
}

3、切面拦截:PermissionManageAspect.java

@Component
@Aspect
@Order(value = 5)
public class PermissionManageAspect {

    @Autowired(required = false)
    private PowerService powerService;

    @Around("@annotation(permissionManage)")
    public Object around(ProceedingJoinPoint joinPoint, PermissionManage permissionManage){
        Object obj = null;
        //获取参数 固定两个参数 第一个为
        Object[] args = joinPoint.getArgs();
        long value = permissionManage.value();
        String name = joinPoint.getSignature().getName();
       Long type = Long.valueOf(args[1].toString());
        boolean powerFactory = powerService.powerFactory(type);
        if (!powerFactory)
            return obj = new String("redirect:/power/nopower");
        try {
            obj = joinPoint.proceed();
        } catch (Throwable throwable) {
            //出现问题 则重定向到错误页面
            return obj = new String("redirect:/error");
        }
        return obj;
    }
}

4、访问测试

//页面处理
   //获取组织审核页面
   @RequestMapping("/org")
   public  String doOrganizationAudit(){

       /*
       之前的使用模式,后面更改啦
       //系统用户权限判断
       boolean systemAdmin = powerService.powerFactory(1L);
       if (!systemAdmin)
           return "redirect:/power/nopower";
           */
       return pageService.getPageName("org_audit",1L);
   }

5、我们的权限处理类

a、权限接口:

/ *
 * 功能: 获取用户系统权限
 *
 * 权限级别:
 * 1:代表超级管理里员或系统管理
 * 2:代表组织管理员
 * 3:部门管理员
 * 4:代表普通用户
 *
 */
public interface PowerService {
    /**
     * 权限工厂,使用全向编号获取对应权限
     * 允许更高权限通过
     * 1:代表超级管理里员或系统管理
     * 2:代表组织管理员
     * 3:部门管理员
     * 4:代表普通用户
     *
     * @param powerType
     * @return
     */
    boolean powerFactory(Long powerType);
    /**
     * 根据用户id判断用户是否为超级管理员
     * @param userId 用户id唯一标识
     * @return
     */
    boolean isSuperAdmin(Long userId);
    /**
     * 根据用户id判断用户是否为系统管理员
     * @param userId 用户id唯一标识
     * @return
     */
    boolean isSystemAdmin(Long userId);
    /**
     * 根据用户id判断用户是否为组织管理员
     * @param userId 用户id唯一标识
     * @return
     */
    boolean isOrangeAdmin(Long userId);
    /**
     * 根据用户id判断用户是否为部门管理员
     * @param userId 用户id唯一标识
     * @return
     */
    boolean isDeptAdmin(Long userId);
    /**
     * 根据用户id判断用户是否为普通用户
     * @param userId 用户id唯一标识
     * @return
     */
    boolean isOrdinary(Long userId);

}

b、权限实现:

@Service
public class PowerServiceImpl implements PowerService {

    @Autowired(required = false)
    private SysRoleMapper roleMapper;

    @Autowired(required = false)
    private SysUserRolesMapper userRolesMapper;

    @Override
    public boolean powerFactory(Long powerType) {
        boolean flag = false;
        //1、获取用户信息
        SysUsers user = UserThreadLocal.getUser();
        Long userId = user.getId();
        if (powerType == 1) {
            flag = isSystemAdmin(userId);
        } else if (powerType == 2) {
            flag = isOrangeAdmin(userId) || isSystemAdmin(userId);
        } else if (powerType == 3) {
            flag = isDeptAdmin(userId) || isOrangeAdmin(userId) || isSystemAdmin(userId);
        } else if (powerType == 4) {
            flag = isOrdinary(userId) || isDeptAdmin(userId) || isOrangeAdmin(userId) || isSystemAdmin(userId);
        }
        return flag;
    }

    @Override
    public boolean isSuperAdmin(Long userId) {
        Long roleId = getMaxRoleID(userId);
        Integer permissionLevel = getPermissionLevel(roleId);
        return permissionLevel == 1 ? true : false;
    }

    @Override
    public boolean isSystemAdmin(Long userId) {
        Long roleId = getMaxRoleID(userId);
        Integer permissionLevel = getPermissionLevel(roleId);
        return permissionLevel == 1 ? true : false;
    }

    @Override
    public boolean isOrangeAdmin(Long userId) {
        Long roleId = getMaxRoleID(userId);
        Integer permissionLevel = getPermissionLevel(roleId);
        return permissionLevel == 2 ? true : false;
    }

    @Override
    public boolean isDeptAdmin(Long userId) {
        Long roleId = getMaxRoleID(userId);
        Integer permissionLevel = getPermissionLevel(roleId);
        return permissionLevel == 3 ? true : false;
    }

    @Override
    public boolean isOrdinary(Long userId) {
        Long roleId = getMaxRoleID(userId);
        Integer permissionLevel = getPermissionLevel(roleId);
        return permissionLevel > 3 ? true : false;
    }

    /**
     * 获取用户最高权限
     */
    public Long getMaxRoleID(Long userId) {
        QueryWrapper<SysUserRoles> queryWrapper = new QueryWrapper();
        queryWrapper.eq("user_id", userId);
        queryWrapper.orderByAsc("role_id");
        List<SysUserRoles> userRolesList = userRolesMapper.selectList(queryWrapper);
        return userRolesList.get(0).getRoleId();
    }

    /***
     *
     * 功能: 获取用户权限级别
     *
     * @param id
     * @return
     */
    private Integer getPermissionLevel(Long id) {
        SysRoles roles = roleMapper.selectById(id);
        return roles.getPermissionLevel();
    }
}

6、数据库设计

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值