一种常用的权限控制算法的实现 参考LINUX/UNIX权限编码
创新互联专注于四川网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供四川营销型网站建设,四川网站制作、四川网页设计、四川网站官网定制、成都微信小程序服务,打造四川网络公司原创品牌,更为您提供四川网站排名全网营销落地服务。
这里笔者介绍一种很常用 也比较专业的权限控制思路
要换成其他的语言主 自己转一下就可以了
这里用java语言描述 其实都差不多的
为了方便起见 我们这里定义a^b为 a的b次方
这里 我们为每一个操作设定一个唯一的整数值 比如
删除A---
修改A---
添加A---
删除B---
修改B---
添加B---
……
理论上可以有N个操作 这取决于你用于储存用户权限值的数据类型了
如果用户有权限
添加A---
删除B---
修改B---
那用户的权限值 purview = ^ + ^ + ^ = 就是 的权的和 化成二进制可以表示为
这样 如果要验证用户是否有删除B的权限 就可以通过位与运算来实现
在JAvA里 位与运算运算符号为& 即是
int value = purview ((int)Math pow( ));
你会发现 当用户有操作权限时 运算出来的结果都会等于这个操作需要的权限值!
原理
位与运算 顾名思义就是对位进行与运算
以上面的式子为例 purview ^ 也就是
将它们化成二进制有
== (十进制) == ^
同理 如果要验证是否有删除A--- 的权限
可以用 purview ((int)Math pow( ));
即
== (十进制)!= ^
这种算法的一个优点是速度快
可以同时处理N个权限
如果想验证是否同时有删除A--- 和删除B--- 的权限 可以用
purview( ^ + ^ )==( ^ + ^ )?true:false;
设置多角色用户 根据权限值判断用户的角色
下面提供一个java的单操作权限判断的代码
//userPurview是用户具有的总权限
//optPurview是一个操作要求的权限为一个整数(没有经过权的!)
public static boolean checkPower(int userPurview int optPurview)
{
int purviewValue = (int)Math pow( optPurview);
return (userPurview purviewValue) == purviewValue;
}
当然 多权限的验证只要扩展一下就可以了
几点注意事项
首先 一个系统可能有很多的操作
因此 请建立数据字典 以便查阅 修改时使用
其次 如果用数据库储存用户权限 请注意数值的有效范围
操作权限值请用唯一的整数!
public class Limits {
/**
* 常规信息下发
*/
public static final int CGXX_XF = ;
/**
* 常规信息列表
*/
public static final int CGXX_LB = ;
/**
* 常规信息审核
*/
public static final int CGXX_SH = ;
/**
* 包月用户查看
*/
public static final int BYYH_CK = ;
/**
* 违章点播统计
*/
public static final int WZDB_TJ = ;
/**
* 定制提取详细
*/
public static final int DZTQ_XX = ;
/**
* 请求记录
*/
public static final int QQJL = ;
/**
* 管理员权限
*/
public static final int GLY_QX = ;
/**
* 验证权限
* @param limitsSum 权限总和 权限总和 为每个权限的 次方相加
* @param checkInt 具体权限
* @return
*/
public static boolean checkLimits(int limitsSum int checkInt){
return (limitsSum ( checkInt)) ;
}
/**
* 生成权限总值
* @param limits
* @return
*/
public static int createLimits(String[] limits){
int limitsSum = ;
for (int i = ; i limits length; i++) {
limitsSum += ( Integer parseInt(limits[i]));
}
return limitsSum;
}
lishixinzhi/Article/program/Java/hx/201311/25604
代码没有写出起来,给你说一下原理吧!权限主要分为用户角色菜单一个角色对应多个用户,多个角色对应多个菜单这样用户登录时可以通过用户自己的角色得到相应的菜单而菜单就直接关系到具体的功能操作了这样就划分出权限了比如每个人都有自己的名字如“1,2,3,4”而用户可能有同样的角色如:“1,2是管理员”“3,4是主任”这样的管理员和主任就是角色这两个角色的权利(权限)当然不同了这样就是权限管理了啊中文java技术网
思路:
1、用户表 user;
2、角色表 role;
3、菜单 menu;
4、角色菜单权限表 role_menu;
5、用户菜单权限表 user_menu;
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[1] 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等[3] 。
由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。
1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。[4]
1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。
感觉你这个太强悍了。
一般都是给菜单授权,角色授予菜单,授予菜单权限的用户能操作相应的菜单。
你这个是给角色授予查询表的权限,还有多少条记录的。
查多少条记录,这个真心不知道怎么搞;
授予查询表的权限的这个应该不难,每次查之前都先验证一下是否在授权范围之类。
多表查询的只要一个不满足就不能查询。
struts拦截器不推荐使用 建议使用spring AOP 面向切面 统一权限操作当做一类失误处理 对于数据库权限 简单权限可以设定一张权限表 复杂权限 但权限没有从属关系可以使用2进制表示 0101010 0和1分别代表是否具有该权限操作 多级权限表结构又相应复杂
给你一个简单的管理代码
public class CheckIdAdvice implements MethodInterceptor {
protected final Log log = LogFactory.getLog(getClass());
public Object invoke(MethodInvocation invocation) throws Throwable {
String methodName = invocation.getMethod().getName();
for(int i=0;iConstant.levelOneMethod.length;i++)
{
if(Constant.levelOneMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin.getQuanxian()!=nulladmin.getQuanxian()=1)
{
return invocation.proceed();
}
else
{
log.info("进入失败");
return false;
}
}
}
for(int i=0;iConstant.levelTwoMethod.length;i++)
{
if(Constant.levelTwoMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin.getQuanxian()!=nulladmin.getQuanxian()=3)
{
return invocation.proceed();
}
else
{
log.info("进入失败");
return false;
}
}
}
for(int i=0;iConstant.levelThreeMethod.length;i++)
{
if(Constant.levelThreeMethod[i].equals(methodName))
{
Map map=(Map) ActionContext.getContext().get("session");
Admin admin=(Admin)map.get("admin");
if(admin!=nulladmin.getQuanxian()=5)
{
return invocation.proceed();
}
else
{
log.info("进入失败");
return false;
}
}
}
return invocation.proceed();
}
}
spring security可以实现。。不过spring要升级到3.0
tomcat6。7都能用,我有婉转班。。置于前台菜单用js隐藏也可以,用security判断角色都行,
如果按资源判断就要做acl。。这个很简单。。不过一般初学者要学会spring security至少要1,2个星期吧,如果楼主需要我可以把文档发给你,如果你直接要代码我也可以给你,但你看不懂。。建议还是看文档先把,你留个邮箱给我我发给你。。