关于springboot自定义权限配置操作

之前做了一个项目,在做这个项目之前自己在网上买了关于权限的教程,springsecurity,shiro等。学完了才发现,这两个权限框架各有千秋,但是如果你想自己的项目能够完全适用还是自己写一个自定义权限模块比较好。

千万别粘贴代码,千万别粘贴代码,千万别粘贴代码 重要的事情说三遍!!!这里只是提供一个参考的思路!

OK

首先,我们先新建一个springboot项目,这里就不多做示范了。

接着,我们创建一个一个annotation文件夹,用于存放我们的自定义注解文件。然后创建一个annotation文件TestFilter。

关于springboot自定义权限配置操作_第1张图片

关于springboot自定义权限配置操作_第2张图片

说明一下,现在的权限一般都分为菜单权限和功能权限(按键权限)两块,而菜单权限中又包含了功能权限。所有这里我建了两个属性,一个用于区分是菜单还是权限,第二个则是特定的标识符,用于代表当前权限的值。

这里插一句,如果看不懂这些注解的话,去看看这篇帖子https://blog.csdn.net/javazejian/article/details/71860633(大神写的,通俗易懂)

然后,我们创建一个aspect文件夹,用于存放我们创建的切面文件。

关于springboot自定义权限配置操作_第3张图片

这是对应代码

@Component
@Aspect
@Order(2)//优先级
public class TestFilterAspect {


    @Around("@annotation(testFilter)")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint, TestFilter testFilter) throws Throwable
    {
        //获取request信息
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        sra.getResponse().setContentType("application/json;charset=UTF-8");
        //根据request获取session
        String sessionId = request.getParameter("sessionId");
        if (StringUtil.isEmpty(sessionId)) {
            sessionId = request.getHeader("user-sessionid");
        }
        // 根据SessionId获取用户主键id
        //这里是从redis拿到对应的信息
        Integer userInfoId = userCache.getUserBySessionID(sessionId);
        //对应的权限判断
        boolean auth = dealAuthority(userInfoId, testFilter);
        if (!auth) {
           //返回无对应权限操作
        }
        // result的值就是被拦截方法的返回值 
        Object result = proceedingJoinPoint.proceed();
        return result;
    }

    /**
     * 用来判断是否有对应的权限
     * @author
     * @dateTime
     * @param userInfoId 用户id
     * @param authority 权限信息
     * @return       boolean true:通过,false:不通过
     * @description
     **/
    private boolean dealAuthority(Integer userInfoId, TestFilter authority) {
        String type = authority.type();
        String key = authority.key();
        //验证类型或资源key为空,返回false
        if (StringUtil.isEmpty(type) || StringUtil.isEmpty(key)) {
            return false;
        }
        //  自定义返回是否有对应权限!!!  返回值是去判断是否有所对应的菜单,功能权限
        if (ResTypeConstants.RES_MENU.equals(type)) {
            return xx
        } else if (ResTypeConstants.RES_FUNC.equals(type)) {
            return xx;
        } else {
            return false;
        }
    }

}

这是对应得type类

public class ResTypeConstants {

    /**
     * 菜单
     **/
    public static final String RES_MENU = "Menu";

    /**
     * 功能
     **/
    public static final String RES_FUNC = "Func";

}

对应的key类

public class ResCodeConstants {

    /**
     * 选项位置
     */
    public static final String OPTION_SETTING = "OptionSetting";

    /**
     * 合同管理
     */
    public static final String CONTRACT_MANAGEMENT = "ContractManagement";

    /**
     * 资源配置
     */
    public static final String RESOURCE_CONFIG = "ResourceConfig";
}

这里说明一下,数据库中对应的key值必须和这里的key值一致。通常来说这个key值,用来前端隐藏,后台判断,数据库存储 三个地方必须一致。

 

ok,然后在我们对应的控制层加入对应的注解

关于springboot自定义权限配置操作_第4张图片

Object result = proceedingJoinPoint.proceed();返回的值就是这个controller层方法的返回值!

最后,我们需要在对应的application类加入@ComponentScan 

大功告成!

我也是接触这个自定义注解不久,希望大家共同进步

你可能感兴趣的:(java,springboot,Java,springboot)