吉日4.2这个版本号不是随便起的,4代表第四个主迭代,2代表第二次功能修订,通常意味着它修复了4.0和4.1里比较扎眼的bug,如果你手里还留着4.1的安装包,不妨对比一下更新日志,重点看数据绑定和控件重绘这两块,4.2在这两处改动最大,winform权这个词在圈子里常被拿来指代WinForm控件的权限控制逻辑,吉日4.2对这块做了专门的处理,比如角色字段的继承关系从两层变成了三层。
实际部署时,建议先在一台干净虚拟机里跑一遍4.2的安装程序,注意看安装目录下有没有生成permission.config文件,这个文件决定了winform权初始化的默认值,如果缺失,手动从模板目录复制一份过去,否则启动时会报“权限节点未注册”的错误。
吉日4.2的winform权把控件分成了三种状态:可见、可用、可编辑,很多新手只改Visible属性,结果用户虽然看不到按钮,但通过Tab键或者快捷键还能触发事件,这就是权限没做干净,正确的做法是在窗体加载时,用权限服务一次性把这三态都设置好,比如一个“删除”按钮,无权限时应该同时把Visible和Enabled设为false,并且把它的TabStop也关掉。
有个容易踩的坑是动态创建的控件,吉日4.2的权限引擎只对设计器里拖出来的控件自动注册,代码里new出来的按钮需要手动调用PermissionManager.RegisterControl方法,我见过一个项目因为漏了这步,导致普通用户能点到一个隐藏的“导出全部数据”按钮,数据直接泄露。
winform权不是孤立存在的,它最终要落到数据库的权限表上,吉日4.2默认用三张表:Users、Roles、Permissions,Permissions表里有一个ControlName字段,存的是“窗体名.控件名”的格式,FrmMain.btnSave”,你可以在SQL里直接查某个角色对某个控件的权限位,权限位是整型,1代表可见,2代表可用,4代表可编辑,加和就是组合权限。
实际开发中,建议写一个小的同步工具,每次改完窗体设计器,跑一遍工具,把新增或删除的控件名同步到Permissions表,否则时间一长,表里全是废弃的控件记录,查询效率会明显下降,吉日4.2提供了一个命令行参数 /syncpermissions,可以直接在部署脚本里调用。
第一个高频报错是“未找到权限节点”,这通常是因为窗体的命名空间变了,但Permissions表里的ControlName还是旧的,解决办法是打开吉日4.2的日志文件,在Logs目录下找最新的.log,搜索“PermissionNodeNotFound”,它会告诉你具体缺了哪个节点,然后手动在表里补一条,或者重新跑一遍同步工具。
第二个报错是“权限缓存过期”,吉日4.2默认缓存权限数据5分钟,如果你在后台改了角色权限,前台不会立刻生效,测试阶段可以把这个缓存时间改成0,在app.config里加一行<add key="PermissionCacheSeconds" value="0"/>,生产环境不建议这么干,5分钟是个合理的折中。
有人为了省事,在每个窗体的构造函数里都去查一遍数据库权限,吉日4.2的权限服务本身带缓存,但如果你在构造函数里直接new一个PermissionService,缓存是独立的,等于每次都要查库,正确做法是用单例,或者用依赖注入把同一个实例传进去,一个中等规模的winform项目,窗体数量在30个左右,用单例后启动时间能从4秒降到1.2秒。
安全方面,吉日4.2的winform权只做界面层的控制,不替代后端接口的鉴权,别以为把按钮藏起来就万事大吉了,用户完全可以用Fiddler或者直接调你的API,所以每个涉及数据变更的接口,后端必须再验一次角色,界面权限是体验,接口权限才是底线。
吉日4.2winform权这套东西,上手不难,难在细节的一致性,建议你从第一个窗体开始就严格按规范来:控件命名统一用“btn”“txt”“dgv”前缀,权限表定期清理,缓存时间根据项目阶段调整,遇到报错先看日志,九成问题都能在PermissionNodeNotFound和CacheExpired这两条里找到答案,最后提醒一句,升级到4.2之前,务必备份好你现有的权限表,因为4.2的表结构比4.1多了一个ControlType字段,直接覆盖安装会导致旧数据读不出来。