BSTEK Development Framework2(BDF2) : 3.6.URL权限控制

      权限是框架的核心,BDF2中的权限是以Spring Security3.1为基础实现,使用时以角色为中心,将资源(URL或组件)与角色绑定,再将各种类型的成员(用户、部门、岗位、群组)放置到角色当中,在放置成员到角色的过程当中还可以设置是否授权,从而实现权限加减功能。如下图所示:

      从上图当中,可以看到URL权限在操作过程当中以角色为中心,首先创建角色,然后将角色与需要进行权限管控的URL关联(如上图中的URL1,URL2),接下来将角色成员放到角色当中,BDF2中允许的角色成员有三类,分别是:用户、岗位、部门和群组,且成员在放置到角色中时还可以设置该成员在这个角色中的权限(能不能访问这个角色所拥有的资源)。

      以上图为例,用户A在角色A中的权限为允许访问,那么用户A就可以访问角色A中的URL1和URL2两个资源,同样岗位A在角色A中的权限也是允许访问,那么所有岗位是岗位A的用户都可以访问角色A中的资源,也就是URL1和URL2;而部门A和群组A在角色A中的权限为禁止访问,也就是说隶属于部门A和群组A的用户都不能访问角色A中的资源(URL1和URL2)。

      BDF2当中,角色的四种类型的成员在进行权限计算的时候是有优先级的,如上图所示,权限最先计算的是用户,然后是岗位,接下来是部门,最后是群组,如果在用户层面已经明确取得当前用户对某资源的访问权限(允许或拒绝),那么就不再计算后面的岗位、部门和群组,同样如果在用户这个层面没有得到某资源的访问权限,就会用这个用户所在的岗位进行计算...,依次类推。还以上图为例,假如用户A隶属于部门A,但不在岗位A与群组A当中,那么用户A在角色A中的权限又是什么呢?通过上面描述的规则,那么用户A对角色A中的两个URL资源是允许访问,因为用户A直接与角色A绑定,且访问权限是允许,所以权限在计算时在用户层面就可以得到答案,而不再向下进行计算,所以用户A可以访问角色A中两个URL资源。

      上述角色成员计算的规则其实就是Spring Security中投票器的计算规则,利用这个规则我们就可以实现权限的加减。举个例子,假如有一个部门X,其中有1000个人,这1000人都可以对资源X进行访问,现在这个部门来了个新同事X,因为其还处于试用期,所以还不能访问资源X,这时在进行权限设置时就可以利用权限的加减法实现,具体做法是:创建一个角色,比如角色X,在这个角色当中放置资源X,然后将部门X与这个角色X关联且访问权限为允许,同时再把这个新同事X与这个角色X关联,访问权限为拒绝,这样就可以实现我们需要的权限功能,这也是权限加减功能最好的应用示例,如下图所示:

      在BDF2-CORE模块当中,在我们执行了初始化菜单之后,登录系统就可以在左边导航区域看到权限管理相关菜单,如下图所示:

      在权限管理菜单组当中,我们可以找到针对角色、角色资源、角色成员及群组维护的菜单项,在进行URL权限管理时,首先我们需要添加相关角色(角色维护中添加),然后通过URL权限维护将需要权限管理的URL与角色关联起来,最后利用角色成员维护把成员(用户、岗位、部门及群组)放到这个角色当中,角色维护效果页面如下:

      角色添加好之后,再进到URL权限维护页,将需要管控的URL与这个角色关联起来,效果如下图所示:

      可以看到,这里在建立角色与URL关联的操作过程当中,可以看到URL我们只需要勾选就行,如果其中不存在你需要管控的URL,那么,可以在菜单维护页中把需要的URL添加进去即可,如果添加的URL不想成为导航菜单,只需要将是否用于导航设置为否即可。

      最后,就是将成员放置到角色当中,如下图所示:

       在上图所示,无论是添加用户还是岗位还是部门还是群组成员,都可以设置这个成员在当前角色中的权限(是否授权)。

       在维护完成角色资源或角色成员后,要使权限生效,我们必须要点击工具栏上的”刷新缓存“按钮,否则权限将不生效。同时如果您是在集群环境下,那么可以采用BDF2-WEBSERVICE模块提供的权限缓存同步刷新Terracotta Server来实现权限信息的同步刷新(我们这里推荐使用BDF2-WEBSERVICE模块提供的权限缓存同步刷新)。

权限操作核心原则

在BDF2当中无论是URL权限还是页面的组件权限,都遵循以下原则:

当一种资源未分配给某个角色时,那么这个资源就是公共的,也就是所有人都可以访问;反之当某个资源分给了某个角色,那么只是这个角色下的成员(用户、部门【该部门下所有用户】,群组【该群组下所有用户】)才可以访问这些资源,不在该角色下的成员是没有权限访问的。


Attachments:

url-role.png (image/png)
url-role.png (image/png)
security-add.png (image/png)
permission-menu.png (image/png)
role-maintain.png (image/png)
url-permission.png (image/png)
role-member.png (image/png)