接口权限配置 === **目录索引:** - 功能介绍 - 权限接口定义 - 接口管理 1.配置接口权限 2.增加数据规则权限 - 创建接口角色 - 接口开发实现 - 接口测试 # 接口权限配置讲解 ## 一、功能介绍 通过接口配置实现,对接口的访问权限控制和数据权限控制, 接口时REST接口,接口权限认证机制使用Json web token (JWT) 接口权限调用流程: (1)通过接口用户的用户名密码,调用鉴权token接口获取接口用户的token 该token,2个小时内有效 (2)把获取的token作为参数,调用接口的时候,会根据token去鉴权 (3)鉴权通过,接口会根据接口定义的编码,检验是否有访问权限 有则可以继续访问,无则提示访问受限 (4)有访问权限,则获取接口的数据权限规则,根据授权的数据权限规则返回需要的数据 实现一个新的接口,无需关注token的鉴权机制,需要实现以下步骤: (1)开发一个rest接口 (2)枚举类InterfaceEnum中定义接口编码 (3)调用InterfaceUtil工具类getInterfaceRuleDto获取接口权限,验证是否有访问权限,并获取数据权限 (4)根据获取的数据权限,组装查询条件返回接口数据 ## 二、权限接口定义 开发一个接口rest接口, ``` public enum InterfaceEnum 类中定义接口编码 blacklist_list("blacklist_list", "黑名单分页查询", "/rest/tsBlackListController", "GET", 1) blacklist_list 为接口编码 ``` ## 三、接口管理 ### 1.配置接口权限 接口权限管理--接口权限录入, ![输入图片说明](https://static.oschina.net/uploads/img/201804/16134956_c0M5.png "在这里输入图片标题") 接口添加: ![输入图片说明](https://static.oschina.net/uploads/img/201804/16135003_DWNn.png "在这里输入图片标题") 说明: 接口权限编码:该编码比较重要,每个接口一个编码,不能重复。该编码由开发者制定 (见接口权限开发,接口编码定义) 接口权限名称:定义名称 接口权限等级:一级权限,下级权限区分 父级接口:上下级关系维护(父子关系) 接口权限地址:接口请求地址 请求方式:GET、POST、PUT、DELETE 接口权限排序:树形列表展示的顺序 以上信息:接口权限编码字段比较重要,其他的字段与权限控制无关,只做说明使用 ### 2.增加数据规则权限 ![输入图片说明](https://static.oschina.net/uploads/img/201804/16135024_mgIY.png "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/201804/16135033_yj8M.png "在这里输入图片标题") ## 四、创建接口角色 (1)创建接口角色,进行角色授权,然后分配角色给接口用户 接口权限---接口角色管理 创建接口角色 ![输入图片说明](https://static.oschina.net/uploads/img/201804/16135126_sO6D.png "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/201804/16135132_nYzo.png "在这里输入图片标题") ## 五、接口开发实现 接口中增加业务逻辑: (1)校验接口访问权限 ``` InterfaceRuleDto interfaceRuleDto = InterfaceUtil.getInterfaceRuleDto(request, InterfaceEnum.blacklist_list); if(interfaceRuleDto==null){ return Result.error("您没有该接口的权限!"); } ``` (2)接口权限规则注入 方案一: 查询器处理 ``` CriteriaQuery cq = new CriteriaQuery(TsBlackListEntity.class, dataGrid); InterfaceUtil.installCriteriaQuery(cq, interfaceRuleDto, InterfaceEnum.blacklist_list); ``` 方案二: Sql和hql 处理 ``` String qlStr = InterfaceUtil.getQL(interfaceRuleDto, InterfaceEnum.blacklist_list); ``` 把组装的qlStr 追加到查询语句中 ## 六、接口测试 ``` //获取token public static String getToken(String userName,String password){ String url = "http://localhost:8888/jeecg-bpm/rest/tokens?username="+userName+"&password="+password; String token= JwtHttpUtil.httpRequest(url, "POST", null); return token; } ``` ``` //获取黑名单列表 public static JSONObject getBlackList(String token){ String url = "http://localhost:8888/jeecg-bpm/rest/tsBlackListController"; JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token); return resp; } ``` ``` public static void main(String[] args) { //接口角色授权的用户账号密码 String token = getToken("interfaceuser","123456"); //获取黑名单列表 System.out.println("======获取黑名单列表======="+getBlackList(token)); } ```