﻿<?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/Metadmin/</link><description>解开耦合，权限不再编程，</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 10:20:10 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 10:20:10 GMT</pubDate><ttl>60</ttl><item><title>权限管理最佳实践：四，数据级查询权限管理</title><link>http://www.blogjava.net/Metadmin/archive/2010/09/08/331430.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Wed, 08 Sep 2010 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2010/09/08/331430.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/331430.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2010/09/08/331430.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/331430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/331430.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">-------------------------------------------- 总大纲 ---------------------------------</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><a href="http://www.ralasafe.org/zh" style="color: #108ac6; text-decoration: underline; ">Ralasafe</a>开源有段时间了，大约有2个月了。根据社区的反馈，我打算围绕Ralasafe最佳实践，书写一系列BLOG。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">大体内容有：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">1，&nbsp;<a href="http://www.javaeye.com/topic/751897" style="color: #108ac6; text-decoration: underline; ">登录控制</a>： 哪些页面需要登录后才能访问，登录用户名、密码验证，登录转向页面；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">2，&nbsp;<a href="http://www.javaeye.com/topic/754014" style="color: #108ac6; text-decoration: underline; ">URL权限控制</a>：哪些页面访问需要进行角色权限验证，怎样验证最简单有效，如何处理验证失败情况；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><a href="http://metadmin.javaeye.com/blog/757065" style="color: #108ac6; text-decoration: underline; ">3， 数据级权限管理方案探讨：选择中间件呢还是框架？</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><a href="http://metadmin.javaeye.com/blog/757065" style="color: #108ac6; text-decoration: underline; ">4， Ralasafe体系结构： 用户怎么读取，用户有哪些字段，怎样与应用基础；</a></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">5， 数据级查询权限管理： 如何给不同的人分配不同的查询数据权限，返回where条件呢，还是直接返回结果集？</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">6， 数据级决策权限管理： 如何给不同的人分配不同的数据操作权限，当用户不具备权限怎么办？</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">7， 其他细小的权限控制： 如下拉框显示内容；按钮、链接是否显示，图片是否显示等。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">-------------------------------------------- ------- --------------------------------</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">数据级权限管理需求</h1>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">数据级权限管理需求主要有：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">1，支持不同用户查询到数据是不同的；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">2，支持数据库行级、列级查询；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">3，支持分页查询——包括2个方面：a，分页查出数据；b，能告知总数据条数是多少；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">4，支持自定义条件（比如：张三在自己的查询权限范围内，查询50w以上的订单）。</p>
<h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">理论分析</h1>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">能够将数据级权限，与业务分离出来——是多年来开发人员追求的目标。一旦遇到疑难杂症，马上会让人联想到高难度的API编程，或者绚丽的XML配置。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">不过，我今天的分析，会极其简单。不过我强烈建议大家看下去。如果对该方案有所怀疑，请使用你的应用案例进行试验。我当时不敢确认的时候，就是这么做的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">（当初，我提出该方案的时候，我们团队认为该方案过于简单，不可行。我坚持让他们实现该方案。等产品做出来后，他们略有所悟，认为该方案可行。当，我让他们做demo的时候，将该方案运用于案例的时候，他们拍腿叫道：超级太棒了！我希望你也有该感受）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">分类思想的提出</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">首先，我们思考这个问题：为什么我们在程序里面使用了if/else？为什么数据级权限难以处理？</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">原因就是：1，有很多种情况；2，我们需要针对不同的人、不同的情况做不同的权限逻辑。比如：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;&nbsp;是总公司用户？&nbsp;&nbsp;then&nbsp;查询所有订单；&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;&nbsp;是分公司用户？&nbsp;&nbsp;then&nbsp;查询本分公司（${用户的公司}）及下属子公司订单；&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;是子公司用户了&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">then&nbsp;查询本子公司订单（${用户的公司}）&nbsp;</span></div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">在RBAC模型里面有用户群组概念，也有不少开发人员将用户群组引入数据级权限管理领域。群组很好的将用户归组，但不足之处是要事先将用户归入组内。比如，在将张三指定到&#8220;总公司用户组&#8221;之前，他不属于该用户组，即便张三的机构属性显示他属于总公司。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">我们对群组进行稍微改造：使用规则来定义群组，满足该规则的用户，我们则认为该用户属于该群组。传统编程里面的if/else判断条件，基本都可以使用规则或者规则表达式组来描述。此时，张三的机构属性显示是总公司，那么他就属于总公司用户组；如果他的机构属性是某个分公司，那么他就属于分公司用户组了。无需进行额外操作（指定、重新指派等，一切都是动态智能的）。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">OK，至此，我们提出了使用规则描述的&#8220;用户分类&#8221;。该规则应该能读取用户信息、上下文信息、数据查询等，并进行相关运算（比较、集合运算等）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">至此，我们可以基于用户要分类，为每个用户分类分配一个查询。（该查询可以接受相关参数，比如用户参数、上下文参数等）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">那么上述例子，使用分类思想，可以这么解决：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">用户分类：总公司用户类 —— 查询：查询所有订单</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">用户分类：分公司用户类 —— 查询：查询本分公司及下属子公司订单；</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">用户分类：子公司用户类 —— 查询：查询本子公司订单。</p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">与功能权限结合</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">我认为功能权限与数据权限分开非常合适。功能权限由企业IT管理员维护；数据权限由软件开发商维护。有人会说这样不好，比如这个案例怎么处理：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">普通审查员可以审查50w财务数据；中级审查员审查50w～500w的财务数据。这个50w、500w，企业需要自行维护。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">OK，我认为这50w、500w应该称为&#8220;权限策略数据&#8221;，可以保存到数据库里面，做为基础数据或者数据字典由企业通过界面自行维护。而软件开发商，开发的&#8220;数据级权限&#8221;策略读取这些数据。（当然，你可以缓存。。。。）</p>
<h1 style="font-size: 2em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">Ralasafe方案</h1>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">怎样实现数据级查询权限</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">为了理解本节内容，建议下载<a href="http://www.ralasafe.org/zh/download/download.jsp" style="color: #108ac6; text-decoration: underline; ">ralasafe demo</a>应用，对照图形界面，更容易理解些。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">Ralasafe使用管理界面来定制用户分类、定制数据查询。为了确保定制无误，Ralasafe支持在线测试。比如定制用户分类后，可以选择一个用户进行测试。数据查询等都是可以在线测试的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">定制完毕后，将用户分类和数据查询配对，赋给特点权限。一个权限，可以赋多个（用户分类——数据查询）配对。和前面的理论分析一样。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">具体定制，怎样配对，可以参考文档，配有图片，在此不做多说。<a href="http://www.ralasafe.org/zh/guide/reference/designUc.html" style="color: #108ac6; text-decoration: underline; ">定制用户分类</a>，<a href="http://www.ralasafe.org/zh/guide/reference/designQuery.html" style="color: #108ac6; text-decoration: underline; ">定制数据查询</a>，<a href="http://www.ralasafe.org/zh/guide/reference/assignQuery.html" style="color: #108ac6; text-decoration: underline; ">给权限授权策略</a>（即配对）。</p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">怎样与应用结合</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">Ralasafe提供<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html" style="color: #108ac6; text-decoration: underline; ">org.ralasafe.Ralasafe</a>和<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/WebRalasafe.html" style="color: #108ac6; text-decoration: underline; ">org.ralasafe.WebRalasafe</a>两个接口类。里面的query方法对应数据级查询权限。在应用系统相应的地方，调用该方法即可。我建议在系统的控制层调用，即：servlet或者action。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">ralasafe demo例子，EmployeServlet就是这么调用的：（demo演示员工查询，不是订单查询<span style="font-family: Simsun; line-height: normal; font-size: medium; "><img border="0" align="absmiddle" src="/CuteSoft_Client/CuteEditor/images/emsmilep.gif" alt="" /></span>）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过Ralasafe接口获取当前用户被授权查看的员工&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">Collection&nbsp;employees&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WebRalasafe.query(req,&nbsp;Privilege.QUERY_EMPLOYEE);&nbsp;&nbsp;<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;将数据放入request，供前台展示&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">req.setAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">employees</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;employees); &nbsp;</span></div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">OK，就这么简单。需要编程的工作量非常非常少，达到了极致。世界从此清净了。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">（WebRalasafe.query方法接受req&lt;HttpRequest&gt;参数，从这里读取User。Ralasafe.query方法则直接传入User，可供非web类应用调用）&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span style="font-size: 18px; font-weight: bold; ">系统结构</span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">Ralasafe由权限引擎和管理界面组成。权限引擎解析权限策略；管理界面生成、维护权限策略。如图示：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><img src="http://www.ralasafe.org/zh/images/stru.png" alt="" width="342" height="179" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 18px; "><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; "><span style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun; ">注：ralasafe团队博客在<a href="http://metadmin.javaeye.com/" target="_blank" style="color: #008e7a; text-decoration: none; ">javaeye</a>/<a href="http://hi.baidu.com/ralasafe/" target="_blank" style="color: #008e7a; text-decoration: none; ">baidu</a>/<a href="http://www.blogjava.net/metadmin" style="color: #108ac6; text-decoration: underline; ">blogjava</a>等空间，同步发布。ralasafe官方网站：</span></span><span style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; "><span style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun; "><a href="http://www.ralasafe.org/zh" target="_blank" style="color: #008e7a; text-decoration: none; ">http://www.ralasafe.org/zh</a></span></span></span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</p>
<img src ="http://www.blogjava.net/Metadmin/aggbug/331430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2010-09-08 21:38 <a href="http://www.blogjava.net/Metadmin/archive/2010/09/08/331430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限管理最佳实践：三&amp;四，数据级权限管理方案探讨</title><link>http://www.blogjava.net/Metadmin/archive/2010/09/06/331258.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Mon, 06 Sep 2010 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2010/09/06/331258.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/331258.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2010/09/06/331258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/331258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/331258.html</trackback:ping><description><![CDATA[<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; ">
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">-------------------------------------------- 总大纲 ---------------------------------</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://www.ralasafe.org/zh" mce_href="http://www.ralasafe.org/zh">Ralasafe</a>开源有段时间了，大约有2个月了。根据社区的反馈，我打算围绕Ralasafe最佳实践，书写一系列BLOG。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">大体内容有：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，&nbsp;<a href="http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html">登录控制</a>： 哪些页面需要登录后才能访问，登录用户名、密码验证，登录转向页面；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，&nbsp;<a href="http://www.blogjava.net/Metadmin/archive/2010/09/02/330760.html">URL权限控制</a>：哪些页面访问需要进行角色权限验证，怎样验证最简单有效，如何处理验证失败情况；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">3， 数据级权限管理方案探讨：选择中间件呢还是框架？</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">4， Ralasafe体系结构： 用户怎么读取，用户有哪些字段，怎样与应用基础；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">5， 数据级查询权限管理： 如何给不同的人分配不同的查询数据权限，返回where条件呢，还是直接返回结果集？</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">6， 数据级决策权限管理： 如何给不同的人分配不同的数据操作权限，当用户不具备权限怎么办？</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">7， 其他细小的权限控制： 如下拉框显示内容；按钮、链接是否显示，图片是否显示等。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">-------------------------------------------- ------- --------------------------------</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<h1 style="font-size: 2em; ">数据级权限</h1>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">数据级权限，无外乎这些类型：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，数据库行列级：比如领导查询数据范围和普通员工查询的数据范围不同，客户经理能够查询客户联系方式字段，而其他人不能查看客户联系方式字段。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，字段内容控制：比如普通审查员审查50w以下财务数据，刚入职客户经理只能将客户级别调整不能超过3级。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">从用户与数据的交互方向可以分为2大类：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，从系统获取数据（查询）；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，向系统提交数据之前的判断。</p>
<h1 style="font-size: 2em; ">现实困惑</h1>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这种权限与业务紧密耦合，很难找到通用方法。绝大部分系统仍然采用if/else来编程，而且这种逻辑分散到系统的各个环节，甚至还会在系统多处出现重复判断。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">也有不少网友尝试5表模型等，试图通过数据模型构造好的ACCESS CONTROL LIST来控制。这种构造ENTRY模式，当数据量小的时候，是可行的，维护工作量也不大。当数据量大的时候，显然不能奏效。甚至无法运行，维护工作量非常大。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">主要表现在：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，where 语句里面的in(..., ..., ..., ..., ...) 子条件过长，或者使用in (select ... from ACL_ENTRY where ... )性能也是非常低下的；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，当删除某用户的时候，需要在ACL_ENTRY表里面，删除相关记录；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">3，当删除某业务数据的时候，也需要在ACL_ENTRY表里面，删除掉相关记录；</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">4，数据量大，ACL_ENTRY数据量承几何级增长。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">也有企业尝试使用规则引擎来解决。这是非常好的尝试，提升了系统开发效率、组件复用率。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">主要表现在：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，首先，主动的实践了一项最佳项目实践：权限与业务松耦合。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，通过松耦合，大幅优化了系统结构。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">3，进一步提高了组件复用率。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">只是，规则引擎毕竟不是专业于权限管理领域，对于复杂需求，或者有些需求实现起来还是很别扭。看起来像if/else的规则表达罢了。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Ralasafe和IBM、Oracle商业产品一样，都使用规则进行描述。大家的区别在于：谁满足需求更多、更容易了。</p>
<h1 style="font-size: 2em; ">框架or中间件</h1>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">框架的好处，显然是有个体系结构，团队遵循该方式进行开发、组装即可。提供了一种标准和开发模式。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">中间件的好处，显然是提供了自由，而且易于结合、易于分工。提供了一种服务方式。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我本人希望自由，所以讨厌框架，偏爱中间件。但我对选用中间件、框架的选择标准是非常中肯的，供大家参考。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong><span style="color: red; ">在系统结构分层的场景，适合使用框架。<br />
在系统功能分离的场景，适合使用中间件。</span></strong></p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">那么具体到权限管理领域，显然是功能分离，中间件更合适。这么做，还将不给原有系统、新开发系统的既定框架造成冲突。一个系统里面使用多个框架，是非常痛苦的事情。<span mce_style="color: #ff0000;" style="color: #ff0000; ">殊不知在SSH的海洋里面，有多少人将N多时间&#8220;Kill&#8221;在沙滩上？！</span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<h1 style="font-size: 2em; ">Ralasafe体系结构及应用集成</h1>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Ralasafe是中间件，采用服务模型。在业务需要的地方，调用Ralasafe接口，或者将Ralasafe接口向LOG4J那样wrap到你的aspect里面去。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Ralasafe按照权限的方向，提供2种数据级权限管理服务，也正好对应2个接口：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1，从系统获取数据，&nbsp;<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html" mce_href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html">Ralasafe</a>.query( int privilegeId, User user, CustomizedWhere where, int fromIndex, int size );</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2，向系统提交数据之前的判断，<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html" mce_href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html">Ralasafe</a>.permit( int privilegeId, User user, Object businessData);</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html" mce_href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/Ralasafe.html">Ralasafe</a>还针对web应用，提供了<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/WebRalasafe.html" mce_href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/WebRalasafe.html">WebRalasafe</a>。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">接口非常简单，在接口层只要告知Ralasafe：当前这个是谁，他/她想干什么。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">权限逻辑，全部在Ralasafe图形化管理界面，点击鼠标完成配置，并进行在线测试。无需编程。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">所以，使用Ralasafe编程工作量非常少。<a href="http://www.ralasafe.org/jforum/posts/list/64.page" mce_href="http://www.ralasafe.org/jforum/posts/list/64.page">也给不少开发人员造成&#8220;不知道怎样与应用集成&#8221;的错觉。</a></p>
<h1 style="font-size: 2em; ">Ralasafe的用户怎么来</h1>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Ralasafe并不会给你的应用系统&#8220;假定&#8221;有哪些字段。你的应用系统用户可以由任意字段，通过XML文件安装到Ralasafe即可。该XML文件，主要指明：用户存在那张表（也可以是视图，这样可以从多张表关联读取数据。比如ralasafe-demo，就关联到company表读取了companyLevel和companyName字段）； 哪些字段是唯一字段； 哪些字段是主键；各字段对应类型。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">然后，在所有权限规则里面，可以读取这些用户字段。比如ralasafe-demo应用（下载地址：</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://www.ralasafe.org/zh/download/download.jsp" mce_href="http://www.ralasafe.org/zh/download/download.jsp">http://www.ralasafe.org/zh/download/download.jsp</a>&nbsp;) 用户含有companyLevel字段，在定制&#8220;总公司&#8221;用户分类的时候，就将该用户companyLevel字段与总公司级别&#8220;1&#8221;进行比较。</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（下期真正开始探讨数据级权限管理实现了）</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 18px;" style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 18px; "><span mce_style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;" style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; "><span mce_style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun;" style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun; ">注：ralasafe团队博客在<a mce_style="color: #008e7a; text-decoration: none;" href="http://metadmin.javaeye.com/" mce_href="/" target="_blank" style="color: #008e7a; text-decoration: none; ">javaeye</a>/<a mce_style="color: #008e7a; text-decoration: none;" href="http://hi.baidu.com/ralasafe/" mce_href="http://hi.baidu.com/ralasafe/" target="_blank" style="color: #008e7a; text-decoration: none; ">baidu</a>/<a mce_style="color: #108ac6; text-decoration: underline;" href="http://www.blogjava.net/metadmin" mce_href="http://www.blogjava.net/metadmin" style="color: #108ac6; text-decoration: underline; ">blogjava</a>等空间，同步发布。ralasafe官方网站：</span></span><span mce_style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma;" style="line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; "><span mce_style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun;" style="font-size: 12px; color: #323e32; line-height: 18px; font-family: simsun; "><a mce_style="color: #008e7a; text-decoration: none;" href="http://www.ralasafe.org/zh" mce_href="http://www.ralasafe.org/zh" target="_blank" style="color: #008e7a; text-decoration: none; ">http://www.ralasafe.org/zh</a></span></span></span></p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
<p mce_style="padding: 0px; margin: 0px;" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br />
</p>
</div>
<img src ="http://www.blogjava.net/Metadmin/aggbug/331258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2010-09-06 22:58 <a href="http://www.blogjava.net/Metadmin/archive/2010/09/06/331258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限管理最佳实践：二，URL权限控制</title><link>http://www.blogjava.net/Metadmin/archive/2010/09/02/330760.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Thu, 02 Sep 2010 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2010/09/02/330760.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/330760.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2010/09/02/330760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/330760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/330760.html</trackback:ping><description><![CDATA[-------------------------------------------- 总大纲 ---------------------------------<br />
Ralasafe开源有段时间了，大约有2个月了。根据社区的反馈，我打算围绕Ralasafe最佳实践，书写一系列BLOG。<br />
<br />
大体内容有：<br />
1， 登录控制： 哪些页面需要登录后才能访问，登录用户名、密码验证，登录转向页面；<br />
2， URL权限控制：哪些页面访问需要进行角色权限验证，怎样验证最简单有效，如何处理验证失败情况；<br />
3， 数据级权限管理方案探讨：选择中间件呢还是框架？<br />
4， Ralasafe体系结构： 用户怎么读取，用户有哪些字段，怎样与应用基础；<br />
5， 数据级查询权限管理： 如何给不同的人分配不同的查询数据权限，返回where条件呢，还是直接返回结果集？<br />
6， 数据级决策权限管理： 如何给不同的人分配不同的数据操作权限，当用户不具备权限怎么办？<br />
7， 其他细小的权限控制： 如下拉框显示内容；按钮、链接是否显示，图片是否显示等。<br />
-------------------------------------------- ------- --------------------------------<br />
<br />
今天说的URL权限控制，内容主要有：URL权限控制，当用户访问某URL时，进行角色权限验证。如果有相应权限，则允许其正常访问；否则，转到拒绝页面。<br />
我们依然通过一个Filter来实现，这样就无需在代码中增加权限判断，也无需套用任何框架。对于整个权限管理系统来说，本节内容也非常简单。<br />
<h1>理论分析<br />
</h1>
当软件实施人员进行系统实施的时候，会将一些访问菜单定义为权限。然后定义角色，让角色拥有权限。然后再将权限赋给用户。<br />
所以，当用户请求某个URL的时候，要不该URL需要权限验证，要不就是不需要权限验证。<br />
检验标准就是：看权限表里面有没有该URL。检验的时候，唯一需要注意的是：URL参数，比如employeeManage?op=add。<br />
<h1>数据库模型<br />
</h1>
权限表：id&lt;int&gt;,name&lt;varchar&gt;,url&lt;varchar&gt;,description&lt;varchar&gt;&nbsp;&nbsp; | pk(id)<br />
角色表：id&lt;int&gt;,name&lt;varchar&gt;,description&lt;varchar&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | pk(id)<br />
角色-权限关系表：roleId&lt;int&gt;,privilegeId&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | pk(roleId,privilegeId)<br />
用户-角色关系表：userId&lt;int&gt;(根据你系统的情况，也可能是varchar等),roleId&lt;int&gt; | pk(userId,roleId)<br />
<h1>Ralasafe方案<br />
</h1>
<a href="http://www.ralasafe.org/zh">Ralasafe</a>权限管理中间件(<a href="http://www.ralasafe.org/zh/download/download.jsp">下载地址</a>)，既可以管理和控制功能级权限，也可以管理和控制数据级权限。开发者还可以根据需求，只选择功能级控制，或者只选择数据级控制。<br />
<br />
当<a href="http://www.ralasafe.org/zh/guide/reference/config.html#usermetadata">安装好用户元数据</a>的时候，Ralasafe自动创建所有权限表。相关权限数据，都由Ralasafe界面进行管理（即录入）。<br />
<br />
Ralasafe的管理界面，在功能权限方面可以做到：<br />
1，管理权限界面；<br />
2，管理角色界面，并给角色赋权限；<br />
3，给用户分配角色界面。这里还需要注意：不同用户管理可以给不同范围的用户分配角色。比如：总公司的管理员可以给所有人分配角色；分公司管理员可以给本分公司及下属子公司用户分配角色。<br />
<br />
Ralasafe将最后一点视为数据级权限。详见：<a href="http://www.ralasafe.org/zh/guide/reference/safe.html#ralasafe">http://www.ralasafe.org/zh/guide/reference/safe.html#ralasafe</a> 和<a href="http://www.ralasafe.org/jforum/posts/list/11.page">http://www.ralasafe.org/jforum/posts/list/11.page</a><br />
<br />
<br />
将<a href="http://www.ralasafe.org/zh/guide/reference/javadoc/org/ralasafe/webFilter/UrlAclFilter.html">org.ralasafe.webFilter.UrlAclFilter</a>配置到web.xml即可，而且配置工作量极其少。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ralasafe/UrlAclFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">org.ralasafe.webFilter.UrlAclFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">loginPage</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/ralasafe/demo/login.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">denyPage</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/ralasafe/demo/noPrivilege.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ralasafe/UrlAclFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/ralasafe/demo/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;</span></div>
<br />
&nbsp;<br />
该Filter具有这些功能：<br />
1，在用户具有权限的时候，正常访问；<br />
2，在用户不具有权限的时候，转到拒绝页面；<br />
3，如果用户没用登录，转到登录页面，让用户先登录。<br />
<h1>其他</h1>
这里我简单说说spring security。<br />
spring security在控制功能权限的时候，还会帮助开发人员控制Dao/Service等组件。我个人认为这种控制是多余的。<br />
因为，功能权限控制应该站在最终用户角度进行考虑。Dao/Service等编程开发级的组件，并不是最终用户关心的事情。所以无需进行功能权限控制。<br />
另外，大家在使用spring security，我建议将功能级权限控制放在数据库里面，而不是annotation到java code里面。因为annotation到java code里面，最终用户就不能控制了。<br />
<br />
注：ralasafe团队博客在javaeye/baidu/blogjava等空间，同步发布。ralasafe官方网站：<a href="http://www.ralasafe.org/zh">http://www.ralasafe.org/zh</a><br />
<br />
<br />
<img src ="http://www.blogjava.net/Metadmin/aggbug/330760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2010-09-02 21:55 <a href="http://www.blogjava.net/Metadmin/archive/2010/09/02/330760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ralasafe社区维护原则</title><link>http://www.blogjava.net/Metadmin/archive/2010/09/02/330728.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Thu, 02 Sep 2010 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2010/09/02/330728.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/330728.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2010/09/02/330728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/330728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/330728.html</trackback:ping><description><![CDATA[原文：<a href="http://www.ralasafe.org/jforum/posts/list/66.page%20" target="_blank">http://www.ralasafe.org/jforum/posts/list/66.page </a><br />
<span><span>Ralasafe自从2010年6月23日开源以来，得到广大网友的支持和鼓励，在此非常感谢。Ralasafe团队也通过网站、论坛、博客、Email、QQ等各种方式与社区互动，形成交流。根据这段时间的社区维护情况，我们制定如下社区维护原则。
<br />
<br />
我们欢迎这样的人，乐于回答他们的问题：
<br />
1，说话友好，平等切磋的人；
<br />
2，勤于学习，而不论技术高低，不论新手老手。即便你是新手，但只要你肯予学习，不断交流，我们乐于提供帮助；
<br />
3，带有个人偏见，但言之有物的人。
<br />
<br />
我们不欢迎这样的人，也不想回答他们的问题：
<br />
1，出言不逊，带有蔑视或者侮辱性语言的人；
<br />
2，懒惰的人，尤其是没有看文档，没有对Ralasafe-demo进行揣摩，没有进行基本学习的人；（文档没有看懂的人例外，确实我们可能撰写方式有问题，个人理解力有差距等）
<br />
3，带有个人偏见，且言之无物的人。
<br />
<br />
Ralasafe团队将继续保持开源，并致力于社区维护工作。对于新手，只要乐于学习，我们甚至会对学习难点，免费提供QQ远程协助。</span></span>
<img src ="http://www.blogjava.net/Metadmin/aggbug/330728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2010-09-02 15:04 <a href="http://www.blogjava.net/Metadmin/archive/2010/09/02/330728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限管理最佳实践：一，登录控制</title><link>http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Wed, 01 Sep 2010 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/330609.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/330609.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/330609.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ralasafe是基于MIT协议开源的，数据级权限管理中间件。开源有2个月了。根据社区的反馈，我围绕Ralasafe最佳实践，书写一系列BLOG。今天说的登录控制，内容主要有：哪些页面需要登录控制、登录验证逻辑、登录后页面转向哪里，以及权限菜单等问题。虽然本系列讲解权限管理，尤其是数据级权限管理。但严格意义来说，登录控制，并不属于权限管理内容。它属于用户身份认证内容。权限基本都与用户相关，用户首先就涉及到用户名密码验证。所以我们从这里开始说起。&nbsp;&nbsp;<a href='http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html'>阅读全文</a><img src ="http://www.blogjava.net/Metadmin/aggbug/330609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2010-09-01 19:41 <a href="http://www.blogjava.net/Metadmin/archive/2010/09/01/330609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《玩转细粒度权限管理》 六，细粒度数据操作权限</title><link>http://www.blogjava.net/Metadmin/archive/2009/06/23/283683.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Tue, 23 Jun 2009 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2009/06/23/283683.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/283683.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2009/06/23/283683.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/283683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/283683.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很多系统对于黑客不堪一击。请看这样的示例：<br>1.	前台展现客户能查看的客户数据，而且用户能删除的客户数据，就是前台展现出来的数据；<br>2.	当用户选择某个用户，点击删除按钮，后台执行删除操作。<br>比如，请求后台删除的url是：http://www.test.com/crm/customer.do?id=3<br>假设，id=13的客户在前台不显示（因为当前用户没有对该客户数据有删除权限），但用户输入http://www.test.com/crm/customer.do?id=13 显然id=13的客户将被删除掉。<br><br>有开发者建议采用id值不要使用自增长型，而改用其他型，比如hashcode等。这也不大合适，可以使用爬虫轻松地将漏洞爬出来。<br><br>显然，仅仅通过界面层次控制数据级权限是不够的。&nbsp;&nbsp;<a href='http://www.blogjava.net/Metadmin/archive/2009/06/23/283683.html'>阅读全文</a><img src ="http://www.blogjava.net/Metadmin/aggbug/283683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2009-06-23 09:55 <a href="http://www.blogjava.net/Metadmin/archive/2009/06/23/283683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>夏至到了</title><link>http://www.blogjava.net/Metadmin/archive/2009/06/21/283482.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Sun, 21 Jun 2009 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2009/06/21/283482.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/283482.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2009/06/21/283482.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/283482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/283482.html</trackback:ping><description><![CDATA[今天是夏至，白天是一年中最长的。好好努力。此文激烈自己和同样在努力的朋友们。
<img src ="http://www.blogjava.net/Metadmin/aggbug/283482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2009-06-21 21:52 <a href="http://www.blogjava.net/Metadmin/archive/2009/06/21/283482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《玩转细粒度权限管理》 五，细粒度数据查询权限（下）</title><link>http://www.blogjava.net/Metadmin/archive/2009/06/21/283481.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Sun, 21 Jun 2009 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2009/06/21/283481.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/283481.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2009/06/21/283481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/283481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/283481.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 上一章讲解通过设计器，设计出数据查询，并在线测试。本章讲解如何快速定制数据查询，如果将业务代码中的if else逻辑判断去掉，如何将这种细粒度的权限集成到业务系统。&nbsp;&nbsp;<a href='http://www.blogjava.net/Metadmin/archive/2009/06/21/283481.html'>阅读全文</a><img src ="http://www.blogjava.net/Metadmin/aggbug/283481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2009-06-21 21:47 <a href="http://www.blogjava.net/Metadmin/archive/2009/06/21/283481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《玩转细粒度权限管理》 四，细粒度数据查询权限（上）</title><link>http://www.blogjava.net/Metadmin/archive/2009/06/19/283191.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Fri, 19 Jun 2009 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2009/06/19/283191.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/283191.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2009/06/19/283191.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/283191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/283191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过基于角色访问控制，我们可以控制哪些人具有某种权限。比如总公司员工柴其贵、分公司员工李朵朵和营业部员工贾志宏，三个人都具有访问“查询员工”页面权限。但，由于他们三人所在公司级别不同（总公司、分公司和营业部），进入查询员工页面，系统展示出来的员工数据应该是不同的。 <br>为此，很多系统代码里面充满了if else逻辑判断，造成业务与权限耦合。有更好的办法去除这种耦合吗？&nbsp;&nbsp;<a href='http://www.blogjava.net/Metadmin/archive/2009/06/19/283191.html'>阅读全文</a><img src ="http://www.blogjava.net/Metadmin/aggbug/283191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2009-06-19 11:52 <a href="http://www.blogjava.net/Metadmin/archive/2009/06/19/283191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《玩转细粒度权限管理》 三，用户角色权限RBCA</title><link>http://www.blogjava.net/Metadmin/archive/2009/06/18/282999.html</link><dc:creator>细粒度权限管理</dc:creator><author>细粒度权限管理</author><pubDate>Thu, 18 Jun 2009 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/Metadmin/archive/2009/06/18/282999.html</guid><wfw:comment>http://www.blogjava.net/Metadmin/comments/282999.html</wfw:comment><comments>http://www.blogjava.net/Metadmin/archive/2009/06/18/282999.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Metadmin/comments/commentRss/282999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Metadmin/services/trackbacks/282999.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本章详细讲解用户角色权限关系。这也就是RBCA(Role Based Access Control，基于角色的访问控制)。基于角色控制模型已经深入人心，关系并不复杂，广泛运用于各个系统。通过给用户赋予角色、角色拥有权限的模式，达到控制用户具有权限的目的。同时，还复用了角色，这样可以让多个相同职务（或职能）的人拥有同样的角色。RBCA模型怎么建立呢？又有哪些局限性。&nbsp;&nbsp;<a href='http://www.blogjava.net/Metadmin/archive/2009/06/18/282999.html'>阅读全文</a><img src ="http://www.blogjava.net/Metadmin/aggbug/282999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Metadmin/" target="_blank">细粒度权限管理</a> 2009-06-18 10:57 <a href="http://www.blogjava.net/Metadmin/archive/2009/06/18/282999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>