﻿<?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-志当存高远,功到自然成!-随笔分类-权限设计</title><link>http://www.blogjava.net/shanben/category/31807.html</link><description>少年强则中国强,少年进步则中国进步!</description><language>zh-cn</language><lastBuildDate>Thu, 29 May 2008 09:44:55 GMT</lastBuildDate><pubDate>Thu, 29 May 2008 09:44:55 GMT</pubDate><ttl>60</ttl><item><title>Java权限控制算法</title><link>http://www.blogjava.net/shanben/archive/2008/05/29/203883.html</link><dc:creator>虎啸长沙,龙跃深圳.</dc:creator><author>虎啸长沙,龙跃深圳.</author><pubDate>Thu, 29 May 2008 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2008/05/29/203883.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/203883.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2008/05/29/203883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/203883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/203883.html</trackback:ping><description><![CDATA[<div class="blog_content">这里笔者介绍一种很常用，也比较专业的权限控制思路。这里用java语言描述，其实都差不多的。要换成其他的语言主，自己转一下就可以了。为了方便起见，我们这里定义a^b为：a的b次方。这里，我们为每一个操作设定一个唯一的整数值，比如：
<p>删除Ａ－－－0<br />
修改Ａ－－－1<br />
添加Ａ－－－2</p>
<!--newszw_hzh_begin-->
<table cellspacing="0" cellpadding="0" align="left" border="0">
    <tbody>
        <tr>
            <td></td>
        </tr>
    </tbody>
</table>
<!--newszw_hzh_end-->
<p>删除Ｂ－－－3<br />
修改Ｂ－－－4<br />
添加Ｂ－－－5</p>
<p>&#8230;&#8230;</p>
<p>　　理论上可以有Ｎ个操作，这取决于你用于储存用户权限值的数据类型了。</p>
<p>　　这样，如果用户有权限：添加Ａ－－－2；删除Ｂ－－－3；修改Ｂ－－－4。那用户的权限值 purview =2^2+2^3+2^4＝28，也就是2的权的和了。化成二进制可以表示为11100。这样，如果要验证用户是否有删除Ｂ的权限，就可以通过位与运算来实现。在Ｊａｖａ里，位与运算运算符号为＆，即是：</p>
<p class="code">int value = purview &amp;((int)Math.pow(2,3));</p>
<p>　　你会发现，当用户有操作权限时，运算出来的结果都会等于这个操作需要的权限值！</p>
<p>　　原理：</p>
<p>　　位与运算，顾名思义就是对位进行与运算：</p>
<p>　　以上面的式子为例：purview &amp; 2^3 也就是　28&amp;8</p>
<p>　　将它们化成二进制有</p>
<p>　 11100<br />
＆ 01000<br />
-------------------<br />
　 01000 == 8(十进制)　＝＝　2^3</p>
<p>　　同理，如果要验证是否有删除Ａ－－－0的权限</p>
<p>　　可以用：purview &amp;((int)Math.pow(2,0));</p>
<p>　　即：</p>
<p>　 11100<br />
＆ 00001<br />
------------------------<br />
　 00000 == 0(十进制)　　！＝　2^0 </p>
<p>　　这种算法的一个优点是速度快。可以同时处理Ｎ个权限。如果想验证是否同时有删除Ａ－－－0和删除Ｂ－－－3的权限，可以用purview&amp;(2^0+2^3)==(2^0+2^3)?true:false;设置多角色用户。根据权限值判断用户的角色。</p>
<p>　　下面提供一个java的单操作权限判断的代码：</p>
<p class="code">//userPurview是用户具有的总权限<br />
//optPurview是一个操作要求的权限为一个整数（没有经过权的！）<br />
public static boolean checkPower(int userPurview, int optPurview)<br />
{<br />
&nbsp; int purviewValue = (int)Math.pow(2, optPurview);<br />
&nbsp; return (userPurview &amp; purviewValue) == purviewValue;<br />
}</p>
<p>　　当然，多权限的验证只要扩展一下就可以了。</p>
<p>　　几点注意事项：首先，一个系统可能有很多的操作，因此，请建立数据字典，以便查阅，修改时使用。其次，如果用数据库储存用户权限，请注意数值的有效范围。操作权限值请用唯一的整数！</p>
</div>
<img src ="http://www.blogjava.net/shanben/aggbug/203883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">虎啸长沙,龙跃深圳.</a> 2008-05-29 17:13 <a href="http://www.blogjava.net/shanben/archive/2008/05/29/203883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>