第一個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點擊修改和查詢按鈕

在這裏插入圖片描述

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