首先介绍下思路:
1、用户表 user
2、角色表 role
3、菜单 menu
4、角色菜单权限表 role_menu
5、用户菜单权限表 user_menu
如图:
根据用户角色取出该角色所有权限,并对用户进行权限分配;注意菜单的按钮(新增、删除、修改)权限是放在中间表(user_menu)中的;
1、新增用户时,是要根据用户角色进行分配权限的 一定记得批量添加;批量、批量、批量,重要的事情说三遍,不要查询角色权限,然后for循环,这样效率太低了;
SQL如下:
INSERT INTO sys_user_menu(UserId, MenuId, DelPower, UpdPower, InsPower, ViewPower)
SELECT #{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId = #{roleId}
updPower 默认都是有的 所以都是1,这样根据角色查询出权限直接添加,响应时间大大提升;
2、修改用户角色也要记得重新分配用户权限哦!这个不能忘,可以用上面的方法;
业务方法:
如果角色没有修改,是不用重新分配权限的,所有userRole 重置为 null,如果角色修改则删除原权限,重新进行分配;
3、最后要优化的就是根据用户查询权限的时候啦,我最开始是这样做的,查询角色权限,用户权限,返回到前端,前端进行处理;结果就是很卡 基本上要三到四秒,
解决方案,一步到位;一个查询返回全部数据。
如下SQL:
SELECT menu.MenuId id, ParentId pid, MenuName text,
(SELECT COUNT(1) FROM sys_user_menu WHERE UserId = #{userId} AND MenuId = sm.MenuId) isShow,
(SELECT CONCAT(
(CASE WHEN smenu.InsPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.DelPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.UpdPower = 1 THEN 1 ELSE 0 END), ',',
(CASE WHEN smenu.ViewPower = 1 THEN 1 ELSE 0 END))
FROM sys_user_menu smenu WHERE smenu.UserId = #{userId}
AND smenu.MenuId = sm.MenuId) MenuInfo
FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId = menu.MenuId
WHERE RoelId = #{roleId}
首先根据 角色ID查询出权限,然后子查询用户是否有该权限,有返回1 木用返回 0;
最后按钮权限 我是直接拼接成字符串,分别对应 添加、删除、修改、查看 1 有该按钮 0 没有该按钮;
优化后 不管是添加、修改用户,加载用户权限都能控制在 1~2 秒;
关于JAVA软件的权限(这里用塞班证书来做类比) 有些SIS软件是不需要开机自启、后台自动运行等功能的,这种软件就不需要签名如果你要实现这些功能,就必须签名同理,有些JAVA软件不需要联网、读取存储卡内容、发送短信等功能,这种JAVA软件,直接用JAR安装即可正常使用但是,如果这个JAVA软件需要联网(比如航海家浏览器),需要读取存储卡内容(比如anyview),需要发送短信等等,那么如果你直接用JAR安装,在运行软件时,每当你需要联网、读取、发短时,就会出来提示框,问你是否允许这个 *** 作这种情况下,就需要JAD文件来解决了用JAD安装JAVA软件,就好比用证书给SIS软件签名具体方法:将JAD和JAR文件放在同一个文件夹下,文件名保持相同,点击JAD安装。安装以后,去程序管理,找到这个软件,套件设置,将所有的权限都从每次询问,改成总是允许,这样,你就不会再看到烦人的提示框了,世界清静了JAD也是分种类的有些JAD是无效的:大部分的JAVA软件,都会同时提供JAD和JAR两个文件同时下载,但是,有时候,你用JAD安了以后,发现最高权限还是每次允许,这就说明,这个JAD是低权限的(好比塞班证书的13、17、19、20权限),是无效的(比如签了别人的名),或者是过期的(好比塞班证书的三年有效期),总之,不能用。JAD是分系统的:同样的一个JAVA软件(JAD+JAR),安在S60手机上,可以提高权限,安在S80手机上,却不行。这点类似塞班证书,只不过塞班证书更严格而已,一部手机一个证书。比如anyview,在我的N73上就可以提高权限,在9300(S80系统)上就不行,后来联系了作者,作者专门为9300做了一个JAD证书才解决JAD是要花钱的:就像塞班的开发者证书需要花钱购买一样,JAD也一样。现在很多论坛都帮大家免费制作塞班证书,但是追本溯源,最开始的那个证书,还是用钱买来的。作为JAVA软件的作者,如果你想让你的软件拥有一个高权限的JAD证书,那就得用一个东西来制作这个证书,而那个用来做JAD证书的东西,一年费用好像是4000。同一个软件,一个使用流畅,没有任何提示框,一个频繁d出提示框,作为使用者,你想选哪个?肯定是前者了所以,对软件作者来说,都想拥有高权限JAD,这对软件的推广非常重要因此,和S60论坛经常能看到的求证书帖一样(现在论坛都给大家免费做证书,这种帖子少见了,以前可是很多的),JAVA论坛也能看到求证书帖,不过那都是没证书的软件开发者,向有证书的软件开发者求助因为大部分JAVA软件的作者,都是出于兴趣免费制作发布,让大家免费使用的,对于他们来说,自己再往里投入4000一年的费用,实在不划算,但是有些软件作者是职业开发者,靠这个吃饭,人家就买了那东西,就能制作高权限JAD而且这个制作比较变态,同一个软件的每个版本,都得重新制作JAD,所以可能会存在这种情况,上一版是高权限,出了新版,反而低权限了。这说明软件作者上一版找到了个雷锋,这一版没找到,呵呵和塞班证书类似,这种热心行为也是有风险的。塞班证书的存在,是S60系统没有病毒(迄今为止没有)的原因之一,JAD也一样。如果你随便帮别人做了证书,那你就得对这个证书负责。如果那人存心不良,开发的是8楼说的那种暗地发送短信扣费软件,那就惨了。到时候,如果真的追究起来,技术高手是能从这个软件的JAD文件追查到当初做证书的那个人的。1,破解手机系统2,安装“RomPatcher 汉化版”(如果以前安过,先卸载)。这软件已经签了binpda的根证书,如果你手机已经替换过binpda的根证书,可以直接安装,或者利用自己的根证书签名,或者利用installserver3,下载“通用文件到C盘补丁(C2Z)”,将解压出的所有文件都放到同一个文件夹下,这其中有个c2z.exe文件4,将z:\sys\bin\EFSrv.dll复制出来,和c2z.exe放在同一文件夹下,运行c2z.exe,生成1个补丁文件rc2z.rmp,复制到手机存储卡:\patches目录(没有这个文件夹就自己新建),运行rompatcher,启用补丁5,下载java_permissions.zip,解压,得到两个xpf文件,复制到手机C:\System\data\midp2\security\policy下面(没有这个文件夹就自己新建)破解成功从此以后,安任何JAVA软件,都不再需要JAD,可以直接用JAR安装。使用过程中不会出现任何提示框(当然,是在RomPatcher软件启动且补丁启用的前提下)去程序管理找到这个JAVA软件,点套件设置,你会发现,所有权限,都默认为总是允许这比用JAD安装所能获得的权限还要高用JAD安装,只能是把读取、编辑、联网等设为总是允许,信息的最高权限还是每次询问,而且程序自动启动和联网这两项的权限有冲突,其中一个选了总是允许,那么另一个就不能选总是允许了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)