第一个github开源项目 权限控制+数据过滤框架

1.项目简介

项目实现的思想和shiro框架类似,并在此基础之上扩展了数据过滤的功能
>有碰到和作者一样问题的人欢迎交流 <

1.1功能点

  • @ExtRequiresPermissions注解进行权限验证
  • 注解中的filterCondition参数进行数据过滤
  • 都可以单独使用

2.项目背景

  • 项目中需要做权限控制,到接口级别
  • 更加喜欢注解方式的控制,简单直观
  • 集成shiro不成功,项目环境复杂(springcloud+前后端分离项目+sso单点登录项目)
  • shiro和spring-security框架,中功能点比较多,而项目中只需要用到接口权限控制一个功能
  • 项目中还需要增加权限过滤功能,及不同权限的用户看到同一接口返回的数据都不一样(不想通过sql实现)

3.开源地址

https://github.com/huajiexiewenfeng/eval-shiro

4.项目设计图

sso版本(原项目为单点登录+前后端分离)
在这里插入图片描述
数据过滤
在这里插入图片描述

5.使用方法

5.1权限验证

登录时将权限存放在redis中
securityManager.login(subject);

    @PostMapping("/loginValida")
    @ResponseBody
    public ResponseBase valida(HttpServletRequest request, String username, String password) {
        HttpSession session = request.getSession();
        EvalUser user = this.ckeckUser(username, password);
        if (user == null) {
            return setResultFail("用户不存在");
        }
        session.setAttribute("user", user);

        List<String> permissons = iLoginService.getPermissonsById(user.getUserid());
        Subject subject = new Subject();
        subject.setPermissions(permissons);
        subject.setKeyId(user.getUserid());
        securityManager.login(subject);

        return setResultSuccess("成功");
    }

获取用户权限getPermissonsById中的代码,可以将此代码修改从数据库中获取

  @Override
    public List<String> getPermissonsById(String userid) {

        List<String> listPermissons = new ArrayList();
        //增加机构模块的增删改查权限
        listPermissons.add("org:add");
        listPermissons.add("org:delete");
//        listPermissons.add("org:update");
//        listPermissons.add("org:query");

        return listPermissons;
    }

1.在相关接口的代码上增加@ExtRequiresPermissions("xxx")
2.接口参数中包含request

    @PostMapping("/query")
    @ExtRequiresPermissions("org:query")
    @ResponseBody
    public ResponseBase query(HttpServletRequest request) {
        return setResultSuccess("查询成功");
    }

    @PostMapping("/add")
    @ExtRequiresPermissions("org:add")
    @ResponseBody
    public ResponseBase add(HttpServletRequest request) {
        return setResultSuccess("添加成功");
    }

    @PostMapping("/update")
    @ExtRequiresPermissions("org:update")
    @ResponseBody
    public ResponseBase update(HttpServletRequest request) {
        return setResultSuccess("更新成功");
    }

    @PostMapping("/delete")
    @ExtRequiresPermissions("org:delete")
    @ResponseBody
    public ResponseBase delete(HttpServletRequest request) {
        return setResultSuccess("删除成功");
    }

5.2数据过滤

user表示当前用户 res表示返回结果
用user中的type字段与res中的type字段进行对比 过滤需要的数据
‘->’ 表示推导关系 由前面的条件推导后面的过滤条件
’ = ’ 表示匹配关系 过滤前面的字段和res结果中的字段进行对比
’ | ’ 多条件兼容
1. res结果中带有value(固定值)的过滤条件 配合‘=’使用
2. 多个条件 res和user中的字段进行匹配

这块的例子还没有时间写,只能先用实际项目中的代码

 @ExtRequiresPermissions(value = "quotaTable:list",
            filterCondition = {"user:defaultType=1->res:defaultType=1",
                               "user:defaultType=0->res:defaultType=all",
                               "user:fdTestevalCenterId=res:fdTestevalCenterId|res:fdTestevalCenterId=null"})
  • 字段匹配过滤
    user:fdTestevalCenterId=res:fdTestevalCenterId
    表示当前登录用户的测试中心编号与返回结果中测试中心编号相同,用户只能查看这部分数据
  • 字段匹配过滤+兼容条件
    "user:fdTestevalCenterId=res:fdTestevalCenterId|res:fdTestevalCenterId=null"
    |res:fdTestevalCenterId=null的这个条件
    表示当前用户也能查看返回结果中测试中心编号为null的数据
  • 字段推导过滤
    "user:defaultType=1->res:defaultType=1"
    表示当前用户默认类型为1是->可以查看返回结果中默认类型的值
    all表示查看全部

6.项目测试

6.1登录

浏览器地址:127.0.0.1:8080
用户名:eval 密码:任意值
在这里插入图片描述

6.2点击新增和删除按钮

在这里插入图片描述

6.3点击修改和查询按钮

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章