权限定义:

对于页面操作而言,URL是页面操作所在的URL,而对于功能页面而言,URL的含义是功能页面对应的URL ,URL会作为安全框架对功能页面和页面元素权限控制的线索。

角色权限:

针对角色所具备的权限,则存储在角色权限表中,定义某个角色Id具备的操作Id(这里的操作的含义,是指受控的对象,不仅仅只是页面的操作),并且可以定义在该操作上具备操作规则。这样角色权限表里的每一行数据的意思是:定义某个角色具备某一操作的权限,并且角色在该操作上,采用某一操作规则

权限控制:

系统的权限控制分为功能权限和数据权限。

在功能权限方面,KissU能做到对菜单渲染、URL权限控制和UI页面元素多方面的权限控制,数据权限方面,目前能做到对行数据权限的控制,列数据权限的控制需要项目组可根据权限规则自行根据需要扩展。

动态授权

  • 部门-角色授权:

通过“部门-角色”授权,在某些情况下是非常有用的,比如:希望某个部门的所有人都具备某些功能权限,如果你通过给用户一个一个赋予权限,会非常繁琐,一定会要求界面上提供批量给某些人赋权的功能。所幸的是,通过“部门-角色”授权可以轻松解决这一问题。当给某部门赋予角色,那么这个部门的人就自然而然的具备这些功能权限,不需要给用户一个一个赋角色了,所谓动态授权就是如此。

功能权限控制:

  • 菜单权限控制

KissU支持利用.NET原生的模式定义系统功能菜单,即利用SiteMap的方式,在SiteMap菜单定义中,会定义菜单对应的URL、能有权访问的角色。.NET原生的这种通过角色控制菜单访问的模式有个较大的问题,那就是在实际应用中,系统的角色都是可以扩展配置的,不会是一次定义后永不改变的,这就存在较大的局限性了。

KissU本身不废除.NET的这种定义死角色的权限控制方式,为了满足项目实际的需要,KissU又基于原生.NET的权限体系上扩展了两种菜单权限控制的方式,一种是以菜单对应的操作为线索,另外一种是通过菜单对应的URL为线索。分析如下:

  1. 以操作为线索:KissU扩展了SiteMap,提供了扩展实现(在WebConfig里配置),允许你定义菜单对应的操作——Operation,这意味着,当管理员给用户有分配菜单对应的这个操作时,用户才能具备访问这个菜单的权限。同样是在SiteMap中定义死操作代码,与定义死角色不同的是,在系统建设完毕时,系统的操作的可变性要大于系统角色的可变性,因此使用操作为线索比使用角色为线索控制权限具备更强的可用性。
  2. 以URL为线索:在原生.NET的SiteMap中,菜单对应的URL是必须要配置的,那么我们是否能够以URL为线索,控制菜单的访问权限呢,答案是肯定的。KissU通过SiteMap中菜单对应的URL,到操作权限表中获取URL对应的操作,然后到角色权限表中,求解出用户是否拥有该操作的权限,进而就可以知道用户是否具备该菜单的访问权限了。使用URL控制菜单权限时,KissU也考虑到了queryString的问题,当你在SiteMap中的URL中,定义的URL是细化到queryString级别,那么KissU首先会拿SiteMap中的URL与操作权限中的URL做严格匹配,即匹配到queryString级别,如果匹配不到,则会截掉操作权限定义中URL的queryString后再匹配。如果最终匹配上了,那么就按照用户是否具备该操作的访问权限进行全兴控制;如果最终没有在操作权限定义中匹配到菜单对应的URL,那意味着该菜单不是受控对象,不进行权限控制。
  • URL访问控制

用户除了“乖乖的”通过导航菜单访问系统的功能外,聪明的用户会通过浏览器工具捕捉菜单对应的功能页面,在以自己的账户登录系统后,在浏览器地址栏直接敲入自己不具备权限的URL,从而能使用到自己不具备的功能。因此如果系统没有控制URL的访问权限,将是一个很大的系统漏洞。 KissU通过一个httpModule,拦截用户的请求,通过请求中的URL到操作权限表中去求解对应的操作,再求解用户对该操作是否具备权限,从而得出用户是否具备访问该URL的权限。

  • 页面元素控制

在新手上路中提及过两种方式对页面元素进行控制,一种是通过在页面中绑定操作代码的方式,一种是在操作权限定义中,绑定元素Id的方式。

  1. 前者的逻辑比较简单,直接根据操作代码,到用户授权信息中求解用户是否具备该操作的权限,进而进行visible或者enable的控制。
  2. 后者是在用户发起请求访问页面时,KissU在服务器端,先从权限定义中获取该请求URL下需要受控的页面元素Id,接着求解用户是否具备页面元素所对应的操作,进而控制用户是否能visibale或者enable该页面元素。
  3. 因为KissU是在服务端直接处理页面元素的可见性,聪明的你一定意识到,页面元素必须是runat="server"才行。考虑到不是每个页面都需要进行页面元素的控制,如果在httpModule里针对每个页面都做无谓的这种页面元素权限控制,那么会有损性能。因此KissU提供了一个attribute(UISecurity),用于标识页面是否需要做页面元素控制,这样可以提高性能。
  4. 对于以操作为线索控制元素的行为的使用方式,KissU提供了表达式支持,支持And、Or、Not等支持,以便可以应对“当用户同时具备操作1和操作2时,该元素才可见的情况”。