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 密碼:任意值