天天看點

結合swagger,實作shiro權限資源的導入功能

做shiro權限控制時,shiro的權限RequiresPermissions都寫在Controller的方法内,如果做動态的權限管理時,每個shiro的權限資源都要手動錄入,太麻煩了。

有沒有一種比較簡單的方法,能實作權限資源的自動錄入,而不需要一條條的錄入呢?

答:有的,應用啟動時,會掃描各個Controller的方法,擷取該結果,即可,另外權限資源的注解名稱,可以通過擷取swagger的注解來擷取.

  • 設計權限資源表的腳本如下:
CREATE TABLE `sys_auth_resource` (
  `id` bigint(16) NOT NULL COMMENT '主鍵',
  `code` varchar(200) DEFAULT NULL COMMENT '編碼',
  `name` varchar(200) DEFAULT NULL COMMENT '名稱',
  `path` varchar(500) DEFAULT NULL COMMENT '路徑',
  `resource_type` varchar(16) DEFAULT NULL COMMENT '資源類型',
  `parent_id` bigint(16) DEFAULT NULL COMMENT '父ID',
  `sequence` int(11) DEFAULT NULL COMMENT '排序号',
  `update_by` bigint(16) DEFAULT NULL COMMENT '修改人ID',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '修改時間',
  `create_by` bigint(16) DEFAULT NULL COMMENT '建立人ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

           
  • Controller的普通方法示例:
@PostMapping
    @ApiOperation(value = "新增角色")
    @RequiresPermissions("sys:org:sysAuthRole:add")
    public Object add(@RequestBody SysAuthRole param) {
            return super.add(param);
        }
           

上述該方法,表明了一個名字叫“新增角色”的權限資源,資源編碼CODE為ys:org:sysAuthRole:add

  • 實作權限資源的導入功能代碼如下:
@Autowired
    private RequestMappingHandlerMapping requestMappingHandlerMapping;
    
      @GetMapping(value = "/importResource")
    @ApiOperation(value = "導入系統權限資源")
    @RequiresPermissions("sys:org:sysAuthResource:import")
    public void importResource() {
        //擷取所有Controller的方法
        Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
        List<SysAuthResource> resourceList = new ArrayList<>();
        for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) {
            RequestMappingInfo info = m.getKey();
            HandlerMethod method = m.getValue();
            PatternsRequestCondition p = info.getPatternsCondition();
            //掃描Shiro的權限資源标簽
            RequiresPermissions requiresPermissions = method.getMethod().getAnnotation(RequiresPermissions.class);
            if (requiresPermissions != null) {
                SysAuthResource sysAuthResource = new SysAuthResource();
                String[] str = requiresPermissions.value();
                for (String s : str) {
                    sysAuthResource.setCode(s);
                }
                //掃描Swagger注解
                ApiOperation apiOperation = method.getMethod().getAnnotation(ApiOperation.class);
                if (apiOperation != null) {
                    sysAuthResource.setName(apiOperation.value());
                    for (String url : p.getPatterns()) {
                        sysAuthResource.setPath(url);
                    }
                }
                resourceList.add(sysAuthResource);
            }
        }
        //批量插入資源
        baseService.insertBatch(resourceList);
    }
           

至此,結合swagger,實作shiro權限資源的導入功能已完成!

如果你覺得該文章有用,麻煩請點贊或打賞,謝謝!

繼續閱讀