功能权限
功能权限用来控制菜单的授权,即被授权的菜单项会显示,而不被授权的菜单项就不会显示。同时,功能权限还可以防止在浏览器上直接输入非授权菜单项的地址。和登录权限不同,登录权限只要登录系统,就能访问页面,而不管该页面是否授权。而功能权限只能访问那些授权的功能,非授权的功能不允许访问。
功能权限的 Xml 定义
在很多 Source 中,都可以找到功能权限的定义,如下:
一旦在 Xml 中定义了这个,功能权限的检查就会启动。
FunctionType 有四个类型:
-
None:不做功能权限检查,这个和没定义一样
-
Admin:只要访问用户具有 Admin 权限就能访问功能,其他不管。
-
Function:这个功能最常用,定义它时,需要同时配置 FunctionKey,这个 FunctionKey 必须要和菜单的短名称一致。也就是说,只有这个菜单授权了,你才能访问。没授权,敲地址就会显示无授权页面(这个页面可以进行全局配置)
-
SubFunction:这个功能除了具备 Function 的功能外,还能对 Function 中每个子操作检查是否授权。因此,使用这个配置,除了要配置 FunctionKey,还需要配置每个子操作的 Key。TK5.5 重新定义了这个 SubKey,它通过扫描配置功能的 url 地址,获取子功能使用的 Source 和 PageStyle,通过这两个参数可以基本上确定一个功能了。这样 SubKey 就是 Source 和 PageStyle 的叠加。(后面将有对 SubFunction 功能配置的示例)
FunctionKey 在 FunctionType 设置为 Function 或者 SubFunction 时配置,需要和菜单的短名称一致。如果不一致,即使获得授权,也一样不能访问。
关于功能权限的 Source
对数据库操作的 Source,如 SingleDbSource,MasterDetailDbSource 等等,都加了 FunctionRight 的配置标签。这些 Source 也是菜单上常用的 Source,因此要开启功能权限应该非常方便。但是,不是每种 Source 都添加了 FunctionRight 的配置,一些很简单的 Source,通常无此配置,如果这些 Source 也需要添加功能权限的保护,那么,系统新开发了一个 Source 作为代理来完成此功能。
这个 Source 可以包装那些不带 FunctionRight 定义的 Source。它只是一个代理,具体 Source 需要做的功能,依旧是原来的 Source 去做。只是在做之前,需要检查菜单功能是否授权。
关于 SubFunction 的功能增强
由于 SubFunction 的缺陷问题一直存在,原先采用 PageStyle 作为 SubKey,只能解决常规问题。而强行在每个子功能指定 Key,会使配置复杂,好在 tk5.5 的功能定义已经全部可以通过 Url 获取,因此通过 url 可以获取一个子功能使用的 Source 和 PageStyle,通过这两个参数可以基本上确定一个功能了。因此,对 SubFunction 进行相应的调整,SubKey 以当前 Url 的 PageStyle 和 Source(已经定义 SubFunctionKey 类,该类进行了相关处理,可以作为 Dictionary 的 Key 存储)作为 Key 传入 API 进行检查。
对应的,作为 FunctionRight 的实现,需要针对传入 SubFunctionKey 进行相关比对查找。此外,FunctionRight 在存储用户信息时,最好也要通过分析 Url 来获取 PageStyle 和 Source 来进行相关比对。
Url 的规则请查询相关文档。
Toolkit 在 SimpleRight 也做了相应调整,如果有自定义的 FunctionRight 实现,可以参考 SimpleRight 中实现。
具体实例
现在以用户管理功能为例,来说明 SubFunction 的配置。
在菜单管理中,可以看到用户管理的子功能,如下图:
其中新建,修改,删除都是内置的功能。而重置密码和设置角色都有额外的 Source 来实现相应的功能。
在 User.xml 中定义了新建,修改,删除的功能,这里使用的标准的 SingleDbSource,因此可以直接配置 FunctionRight 的节点,如下图:
重置密码的配置在 ChangeUserPasswd.xml 中,这个 Source 没有 FunctionRight 节点,因此,我们使用前面定义的 FunctionRightSource 进行改写,如下图:
设置权限的配置在 UserPart.xml 中,这个 Source 同样没有 FunctionRight 节点,因此,我们同样使用前面定义的 FunctionRightSource 进行改写,如下图:
改造完成后,如果在角色配置中配置好相应的权限。使用相应的用户登录后,除了看不到相应功能外,如果尝试使用敲地址的方式进行访问,将看到如下界面:
关注微信公众号获取TKCore最新资讯: