﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-tonyzhou00-文章分类-DataBase</title><link>http://www.blogjava.net/tonyzhou00/category/24236.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 26 Jul 2007 04:46:00 GMT</lastBuildDate><pubDate>Thu, 26 Jul 2007 04:46:00 GMT</pubDate><ttl>60</ttl><item><title>权限控制算法 </title><link>http://www.blogjava.net/tonyzhou00/articles/132299.html</link><dc:creator>蛮哥♂枫</dc:creator><author>蛮哥♂枫</author><pubDate>Wed, 25 Jul 2007 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/tonyzhou00/articles/132299.html</guid><wfw:comment>http://www.blogjava.net/tonyzhou00/comments/132299.html</wfw:comment><comments>http://www.blogjava.net/tonyzhou00/articles/132299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tonyzhou00/comments/commentRss/132299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tonyzhou00/services/trackbacks/132299.html</trackback:ping><description><![CDATA[
		<p>向大家介绍一种很不错，也是Linux中的权限管理算法。</p>
		<p>　　定义a^b为：a的b次方<br />　　假如，我们为每一个操作设定一个唯一的整数值，比如：</p>
		<p>删除Ａ－－－0<br />修改Ａ－－－1<br />添加Ａ－－－2</p>
		<p>删除Ｂ－－－3<br />修改Ｂ－－－4<br />添加Ｂ－－－5<br />。。。</p>
		<p>　　理论上可以有Ｎ个操作，这取决于你用于储存用户权限值的数据类型了。</p>
		<p>　　这样，如果用户有权限：添加Ａ－－－2；删除Ｂ－－－3；修改Ｂ－－－4<br />那用户的权限值 purview =2^2+2^3+2^4＝28，也就是2的权的和了<br />化成二进制可以表示为11100<br />　　如果要验证用户是否有删除Ｂ的权限，就可以通过位与运算来实现。<br />　　在Ｊａｖａ里，位与运算运算符号为＆<br />　　即是：int value = purview &amp;((int)Math.pow(2,3));<br />　　你会发现，当用户有操作权限时，运算出来的结果都会等于这个操作需要的权限值！</p>
		<p>原理：<br />位与运算，顾名思义就是对位进行与运算：<br />以上面的式子为例：purview &amp; 2^3 也就是　28&amp;8<br />将它们化成二进制有<br />　11100<br />＆ 01000<br />-------------------<br />　 01000 == 8(十进制)　＝＝　2^3<br />同理，如果要验证是否有删除Ａ－－－0的权限<br />可以用：purview &amp;((int)Math.pow(2,0));<br />即：<br />　11100<br />＆ 00001<br />------------------------<br />　 00000 == 0(十进制)　　！＝　2^0 </p>
		<p>　　这种算法的一个优点是速度快。可以同时处理Ｎ个权限，设置Ｎ种角色．<br />　　如果想验证是否同时有删除Ａ－－－0和删除Ｂ－－－3的权限<br />　　可以用purview&amp;(2^0+2^3)==(2^0+2^3)?true:false;<br />　　设置多角色用户。根据权限值判断用户的角色。。。</p>
		<p>　　下面提供一个java的单操作权限判断的代码：</p>
		<p>
				<br />//userPurview是用户具有的总权限<br />//optPurview是一个操作要求的权限为一个整数（没有经过权的！）<br />public static boolean checkPower(int userPurview, int optPurview){<br />　　int purviewValue = (int)Math.pow(2, optPurview);<br />　　return (userPurview &amp; purviewValue) == purviewValue;<br />}<br />　　当然，多权限的验证只要扩展一下就可以了。<br />　　几点注意事项：首先，一个系统可能有很多的操作，因此，请建立数据字典，以便查阅，修改时使用。其次，如果用数据库储存用户权限，请注意数值的有效范围。操作权限值请用唯一的整数！Java的int类型最多可以储存11个权限和．如果超过，可以选择其它数据类型，而且建议不同模块，使用多个权限变量．</p>
<img src ="http://www.blogjava.net/tonyzhou00/aggbug/132299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tonyzhou00/" target="_blank">蛮哥♂枫</a> 2007-07-25 14:20 <a href="http://www.blogjava.net/tonyzhou00/articles/132299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>