做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權限資源的導入功能已完成!
如果你覺得該文章有用,麻煩請點贊或打賞,謝謝!