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