工作流工作台无权限排查路径

现象:用户前端自定义跳转工作流审批页面,提示无权限

排查路径:

  1. 5.0版本权限是根据路径进行鉴权的,请求载荷中variables需要携带path路径

    示例:path=/management_center/AuthMenus_RoleAndPermission_SystemPermission
    如果是用户自定义跳转页面,需要配置sessionPath:,值为url中的path路径
    工作流工作台无权限排查路径

  2. 查看debug信息中权限上下文中角色携带的权限是否正确

    复制debug信息中的path路径,去权限上下文中搜索查看该路径下所有的权限

    ~~~
    "getRoleActionPermissionsByViewAction:workbench.WorkBenchWorkflowUserTaskActive:WorkflowMenus_WorkBenchMenu_ActiveUserTaskMenu": {
         "630732547466232342": {
        "/workflow/WorkflowMenus_WorkBenchMenu_ActiveUserTaskMenu/ACTION#workbench.WorkBenchWorkflowUserTaskActive#workflow_write/ACTION#workflow.WorkflowUserTask#workflow_writeturnon": 1,
           "/workflow/WorkflowMenus_WorkBenchMenu_ActiveUserTaskMenu/ACTION#workbench.WorkBenchWorkflowUserTaskActive#workflow_wait/ACTION#workflow.WorkflowUserTask#workflow_agree": 1,
         }
       },
    ~~~

    参数介绍:

    • 630732547466232342:角色630732547466232342拥有的所有权限信息

    • /workflow/WorkflowMenus_WorkBenchMenu_ActiveUserTaskMenu:path路径

    • /ACTION#workbench.WorkBenchWorkflowUserTaskActive#workflow_write:此path路径下面的ACTION,模型为workbench.WorkBenchWorkflowUserTaskActive的workflow_write动作。

    对比无权限页面和以上参数是否对应。可在页面url上查看模型,动作。常见问题有模型不匹配(更换为正常有权限的模型)、角色下无动作权限。

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/wen-ti-zhen-duan/15924.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
yexiuyexiu
上一篇 2024年8月3日 pm1:18
下一篇 2024年8月6日 pm6:34

相关推荐

  • 函数如何跳过权限拦截

    跳过登录直接调用接口 示例: 在yaml文件里面配置上该函数的namespace(模型编码)以及函数名字 pamirs: auth: fun-filter: – namespace: user.PamirsUserTransient fun: login #登录 – namespace: top.PetShop fun: action 不跳过登录直接调用接口 示例: 在yaml文件里面配置上该函数的namespace(模型编码)以及函数名字 pamirs: auth: fun-filter-only-login: #登录后不再校验该函数的权限 – namespace: top.PetShop fun: action 按包设置权限过滤 如何批量跳过权限验证?以上两种方式提供了在yml文件里面配置权限过滤的方式,但如果需要大量过滤权限,配置就变得很繁琐,所以下面主要介绍通过代码扩展的方式去控制权限。 示例: 以下示例通过控制包路径来跳过权限。 继承pro.shushi.pamirs.auth.api.spi.AuthFilterService接口 @Order(88) @Component public class CustomAuthFilterService implements AuthFilterService { public static final String skipClass = "pro.shushi.pamirs.top.core.action"; @Override public Boolean isAccessAction(String model, String name) { //从缓存中取函数 Action cacheAction = PamirsSession.getContext().getExtendCache(ActionCacheApi.class).get(model, name); if (cacheAction instanceof ServerAction) { ServerAction serverAction = (ServerAction) cacheAction; Function function = PamirsSession.getContext().getFunction(serverAction.getModel(), serverAction.getFun()); String clazz = function.getClazz(); //返回true就代表通过验证 if (clazz != null && clazz.startsWith(skipClass)) { return true; } } return null; } } 请求pro.shushi.pamirs.top.core.action路径下的动作可以通过验证。

    2024年8月22日
    00
  • 同步导出时路由新页面问题

    情景复现:界面设计器配置了同步导出,在页面上点击导出之后跳转到首页而没有正常下载文件排查路径: 点击导出之后,查看跳转的页面路径发现,跳转到了127.****/Hfyk/pamirs/page,可知,跳转路径不对,怀疑是Nginx路由配置问题,排查Nginx配置 发现没有配置下载路由,在Nginx中配置下载路由

    2024年7月24日
    00
  • 树表查不到二级目录

    场景:树表结构查不到二级模型内容,联动配置如下 问题:界面只显示部门,不显示岗位。 已知: 自定义部门代理模型继承了PamirsDepartment @Model.model(DepartmentDoc.MODEL_MODEL) @Model.Advanced(type = ModelTypeEnum.PROXY) @Model(displayName = “部门资料代理模型”, summary = “部门资料代理模型”) public class DepartmentDoc extends PamirsDepartment { public static final String MODEL_MODEL = “top.DepartmentDoc”; @Field.many2one @Field(displayName = “上级部门”) private DepartmentDoc parent; @Field.one2many @Field(displayName = “岗位列表”) private List positionLists; } 自定义岗位代理模型继承了PamirsPosition @Model.model(PositionDoc.MODEL_MODEL) @Model(displayName = “岗位代理模型”, summary = “岗位代理模型”) @Model.Advanced(type = ModelTypeEnum.PROXY) public class PositionDoc extends PamirsPosition { public static final String MODEL_MODEL = “top.PositionDoc”; @Field.many2one @Field(displayName = “上级岗位”) private PositionDoc parent; } 首先查看控制台相应请求 找到请求接口进后端debug,pro.shushi.pamirs.boot.web.action.UiTreeAction#fetchChildren 检查这两个数据是否正常 继续debug可知,在queryWrapper中使用departmentCode没有查询出数据,这时候回看模型定义,发现岗位列表中没有定义关联字段,导致没有查出数据。pro.shushi.pamirs.boot.web.manager.tree.UiTreeRelationQueryManager#_fetchIsLeaf 解决:在模型配置中添加关系字段@Field.Relation(relationFields = {"code"}, referenceFields = {"departmentCode"}),并和父类中的关系字段保持一致 部门代理模型: @Model.model(DepartmentDoc.MODEL_MODEL) @Model.Advanced(type = ModelTypeEnum.PROXY) @Model(displayName = "部门资料代理模型", summary = "部门资料代理模型") public class DepartmentDoc extends PamirsDepartment { public static final String MODEL_MODEL = "top.DepartmentDoc"; @Field.many2one @Field.Relation(relationFields = {"parentCode"}, referenceFields = {"code"}) @Field(displayName = "上级部门") private DepartmentDoc parent; @Field.one2many @Field.Relation(relationFields = {"code"}, referenceFields = {"departmentCode"}) @Field(displayName = "岗位列表") private List<PositionDoc> positionLists; } 岗位代理模型 @Model.model(PositionDoc.MODEL_MODEL) @Model(displayName = "岗位代理模型", summary = "岗位代理模型") @Model.Advanced(type = ModelTypeEnum.PROXY) public class PositionDoc extends PamirsPosition { public static final String MODEL_MODEL = "top.PositionDoc"; @Field.many2one @Field.Relation(relationFields = {"departmentCode"}, referenceFields = {"code"}) @Field(displayName = "上级岗位") private PositionDoc parent; }

    2024年7月23日
    00
  • Function、Action函数使用规范

    Function的定义需要严格遵循Oinone的规范, @Action是指页面上有按钮展示的方法,所有@Action注解的方法都是需要在权限处设置权限才能访问的。Action背后都对应一个Function。 @Function是Oinone的可管理的执行逻辑,是无处不在的。 如果只是查询,不需要在页面有按钮,定义为@Function就可以了。 覆写常用默认数据管理器定义标准 @Action.Advanced(name = FunctionConstants.create, managed = true)//默认取的是方法名 @Action(displayName = "确定", summary = "添加", bindingType = ViewTypeEnum.FORM) public AuthRole create(AuthRole data) { @Action.Advanced(type = FunctionTypeEnum.UPDATE, managed = true, invisible = ExpConstants.idValueNotExist) @Action(displayName = "更新", label = "确定", summary = "修改", bindingType = ViewTypeEnum.FORM) public AuthRole update(AuthRole data) { @Action.Advanced(type = FunctionTypeEnum.DELETE, managed = true) @Action(displayName = "删除", label = "删除", contextType = ActionContextTypeEnum.SINGLE_AND_BATCH) @Function.fun(FunctionConstant.deleteWithFieldBatch) public List<AuthRole> delete(List<AuthRoe> dataList) { @Function.Advanced(displayName = "查询角色列表", type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE, managed = true) @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API}) public Pagination<AuthRole> queryPage(Pagination<AuthRole> page, IWrapper<AuthRole> queryWrapper) {//注意方法名和入参名称必须和平台保持一致 @Function.Advanced(displayName = "查询指定角色", type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_ONE, managed = true) @Function.fun(FunctionConstants.queryByEntity) @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API}) public AuthRole queryOne(AuthRole query) {//注意方法名和入参名称必须和平台保持一致 自定义函数定义标准 @Action(displayName = "启用") @Action.Advanced(type = FunctionTypeEnum.UPDATE) public Teacher dataStatus(Teacher data) { } @Function(displayName = "构造", openLevel = FunctionOpenEnum.API) @Function.Advanced(type = FunctionTypeEnum.QUERY) public Teacher constructAll(Teacher data) { } 注意事项: 覆写常用默认数据管理器Function定义需要严格按照以上函数定义,包括出入参名字定义、注解定义。定义错误会导致gql请求报错或者找不到函数。 定义@Action或者@Function时,函数出入参必须是当前类注解定义的@Model.model()的模型,或者被该模型字段全包含的的模型,比如它的父模型。 页面调用使用的@Action或者@Function方法,出入参必须是oinone的对象,且不能是基础的java类型,因为oinone的对象有元数据信息,这样才能完成前后端之间的自动交互 managed = true定义当前函数为数据管理函数。它只有在重写平台默认数据管理器时需要使用。 @Function.fun()代表定义函数编码,不可更改,默认与方法名称相同。同一个模型Action内不允许有两个相同的函数编码。 不要使用set、get、unset作为函数方法名的开头,不要使用toString作为函数方法名。 传输模型没有默认的数据管理器,所以不能定义数据管理函数。 @Action和@Function注解使用约定 重写内置数据管理器动作和函数的,应与平台注册方式完全保持一致。以下属性可根据需要进行修改:(必须) @Function.Advanced#displayName @Function#openLevel 自定义方法不要与内置数据管理器中定义的动作和函数重名。(必须) @Action和@Function注解不要混合使用。(自定义方法必须) 如无特殊必要,请不要使用如下属性修改函数定义:(自定义方法必须) @Function#name @Function.fun#value @Function.Advanced#managed @Function.Advanced#builtin @Function.Advanced#group @Function.Advanced#version @Action.Advanced#name @Action.Advanced#args @Action.Advanced#managed @Action.Advanced#language 自定义方法在选择注册动作或函数时,应按照如下规则进行判断:(必须) 若该方法通过用户行为触发的,应注册为动作。 若该方法通过“入口”进行控制的,应注册为函数。 自定义方法若注册为动作时,应按照如下规则进行定义: 使用@Action.Advanced#type属性定义函数类型,默认为UPDATE。混合操作的动作应明确列出所有类型。(必须) 使用@Action#displayName属性定义动作功能名称。如无特殊必要,同一模型下的所有动作名称不要重复。页面展示名称重复的,可使用@Action#label属性定义展示名称。(必须)…

    2024年8月20日
    00
  • 序列化工具使用问题

    后端使用的JSON序列化JsonUtils.toJSONString(nodes);前端使用的JSON序列化PamirsJsonUtils.toJSONString(nodes, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.BrowserCompatible);注意:用什么工具序列化,就用什么工具反序列化、parse 的时候,要保持一致, 使用PamirsJsonUtils序列化工具主要是为了解决枚举取值错误的问题以及id精度丢失问题。当出现这两个问题的时候,需要使用PamirsJsonUtils 进行序列化。

    2024年9月5日
    00

Leave a Reply

登录后才能评论