开发示例
<p>上一章大致了解了整体权限系统如何设计的。本章通过代码展示如何实现。</p>
<h5>表结构设计</h5>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f81fe55ef2697ad09dff6e105f452bad?showdoc=.jpg" alt="" /></p>
<pre><code class="language-sql">t_pdc_user 用户表
t_pdc_role 角色表
t_pdc_resource 资源表
t_pdc_role_resource 角色资源表</code></pre>
<p>其中 <code>角色资源表</code>的设计如下</p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/06c93698a75843b54b0db0405203fdb7?showdoc=.jpg" alt="" />
主体思想为:为某个角色分配了某个资源,可以操作该资源的哪些权限。</p>
<h5>操作标识符</h5>
<p> 在用户登录的后,已经将该用户拥有系统中所有 操作标识符 存储在 session中。通过后续指令或者拦截器来提取。</p>
<h5>用户管理举例</h5>
<ul>
<li>服务端实现</li>
</ul>
<pre><code class="language-java">@ControllerBind(controllerKey = "/user", viewPath = "/pdc")
@AuthAnno(type = AuthType.Super, res = "user")
public class UserController extends BaseController {
@AuthAnno(auth="look")
@LogAnno(desc = "查看用户列表", type = LogType.SEARCH)
public void index() throws Exception{
render("user_list.html");
}
@AuthAnno(auth="save")
public void add() throws Exception{
setAttr("roles", Role.dao.findNormalRoles());
render("user_form.html");
}
}</code></pre>
<pre><code>res 表示 资源标识
auth 表示 权限(关键字)</code></pre>
<p>上面代码的意思为:只有当该用户拥有操作符 为 <code>user_look</code>,<code>user_save</code>的时候才可以进入业务方法操作。</p>
<ul>
<li>WEB端实现</li>
</ul>
<p>1.在WEB端通过自定义权限判断指令来实现 是否拥有操作符 的判断</p>
<pre><code class="language-html">/**判断是否有某个权限关键字,如果存在关键字则执行body内容,否则不执行。通常用做在HTML页面中判断按钮是否有权限,用于显示*/
#auth_has("user_save")
<a class="btn btn-info btn-xs no-border">
<i class="fa fa-plus"></i> 添加
</a>
#end</code></pre>
<p>上面的代码意思为:只有当该用户拥有操作符为 <code>user_save</code> 的时候才会拥有添加按钮出现。</p>
<p>2.通过js来为动态数据提供 是否拥有操作符 的判断</p>
<pre><code class="language-html">#define js()
<script>
/**参数可以是多个,返回结果格式为
{"user_save":true,"user_delete":false},其中TRUE表示有权限,FALSE表示无权限
*/
var auths = #auth_json("user_save","user_delete");
if(auths['user_save']){
alert("拥有某个js动态按钮权限");
}
</script>
#end</code></pre>
<p>上面代码意思为:通过js动态判断是否拥有 <code>user_save</code>的权限标识符。</p>
<p>3.判断拥有哪个角色和是否是超级管理员权限</p>
<pre><code class="language-html">/**判断是否是超级管理员*/
#is_admin
<a class="btn btn-info btn-xs no-border">
<i class="fa fa-plus"></i> 添加
</a>
#end
/**判断是否是有某个角色标识,目前系统中已有的角色标识包括:{"1":"超级管理员","10":"管理","20":"普通"}*/
#role_has(10)
<a class="btn btn-info btn-xs no-border">
<i class="fa fa-plus"></i> 添加
</a>
#end</code></pre>