保护你的应用程序
by Si Chen
OFBIZ可以在用户接口层或业务逻辑层实现安全性保障。在用户接口层,整个WEB应用程序可以被一次性保护,控制器中单个的请求可以被保护,并且单个的页面可以需要特定的权限。在业务逻辑层,每一个服务可以需要特定的权限。
分配权限
有一个名叫SecurityPermission的实体描述了粒状的安全权限,这些权限可以用于特定的页面或特定的服务。SecurityPermission是一个两部分的字符串,由”_”分开,第一部分指定了应用程序,第二部分指定了允许的操作。这样的话你就有可能会拥有像"ORDERMGR_CREATE"的权限,它意味着拥有该权限的用户可以在订单管理应用程序里创建信息。有一些权限以_ADMIN结尾,比如ORDERMGR_ADMIN,这些权限自动拥有对应用程序的所有操作权限。
许多单个的安全权限通过实体SecurityPermissionGroup可以被组织到一起。例如,你可以为特定客户创建一组权限,指定谁可以察看客户信息,进入订单,但是不能创建购买订单或者访问内部产品,账户,或者薪水信息和其它功能。
每一个SecurityPermissionGroup都和一个UserLogin关联。一个Party(或许是一个人,或许是一个组织)可以被关联多个UserLogins。这样的话一个人就可以有多个Login,一些Login拥有的权限多一些,一些Login拥有的权限少一些,这样对于大客户是很有用的。这可以在Party Manager的安全tab中操作。
保护WEB应用程序
在ofbiz-component.xml文件中定义web应用程序位置处(<web app>标签处),你可以使用<base-tag>标签来指定整个web应用程序需要的权限。仅使用安全权限字符串的第一部分,即应用程序的名字。例如,如果你使用base-permission="ORDERMGR",则web应用程序会自动需要ORDERMGR_VIEW或ORDERMGR_ADMIN。
在许多应用程序中,你会看到base-permission="OFBTOOLS, ORDERMGR",这句话表示了权限OFBTOOLS_VIEW和ORDERMGR_VIEW。base -permission属性允许指定一系列的权限,并且它们必须是真实的同时用户是可以获得访问的。OFBTOOLS_VIEW和 ORDERMGR_VIEW的含义是:OFBTOOLS_VIEW控制了访问对于web应用程序的访问,而ORDERMGR_VIEW可用于控制任何应用程序中订单信息的访问,包括基于web的订单管理,POS,CRM模块或其它应用程序。
在web应用程序的controller.xml中,我们可以用<security>标签为单个的request指定安全性需求。你可以使用<security>标签来实现页面的安全性,可以通过使用https,或者需要一个用户login来访问页面(尽管没有为一个用户login指定特殊的权限)。你也可以通过指定无法从浏览器中定向request来隐藏request,这对于收到了一个request链中的一个不能被单独调用的request的情况是很有效的。
最后,在页面本身你可以使用request,这在页面上是不显示的除非用户login有一定的安全性权限。OFBIZ在一个.bsh文件中使用UserLogin和一个 "security" 对象来检查这些权限。如果你使用widget你还可以使用如下的标签:
引用
<condition>
<if-has-permission>
<check-permission>
<widgets>
<fail-widgets>
OFBIZ允许我们直接在widget里核查权限而不是使用FTL,并设置了一个通过核查时的widget和没有通过核查的widget.
安全性API
The most popular security API methods are: 以下是最常用的安全性API方法:
* Security.hasPermission -核查该用户是否具备一个特定的权限。
* Security.hasEntityPermission - 允许你指定权限字符串,字符串有两部分,如"ORDERMGR", "_CREATE",所以,如果用户有"ORDERMGR_CREATE" 或 "ORDERMGR_ADMIN"权限,它将会通过。
* ServiceUtil.getPartyIdCheckSecurity -核查是否用户具备指定的权限,或者实际上是执行自己的操作。只要是任何情况中的一种,该方法都会返回partyId,意味着用户有权限。
* Security.hasRolePermission -核查是否用户具备指定的权限,以及是否用户关联一个角色中特殊的实体。意思是如果你给用户一个权限,比如ORDER_ROLE_VIEW,并且指定他通过实体OrderRole和一个订单关联,这样的话那个用户就有权限察看特定的订单。相同的用户将不会拥有权限查看订单,如果他没有一个OrderRole实体记录的话。
The minilang simple methods also have permission checking tags <if-has-permission> and <check-permission>. Minilang脚本也有可以进行权限核查的标签:<if-has-permission> 和<check-permission>。
安全性服务
你可以定义是否一个服务需要一个用户login。此外,你可以使用<security>标签来定义什么权限是需要的。在服务内部,你可以为自己核查权限。有一个安全性相关的方法可以用于核查是否UserLogin拥有某种权限,或者是否用户为自己执行一个任务(比如为自己创建订单)。
你也可以在services.xml里是用<required-permissions> 和<check-permission>标签定义你的权限,
http://blog.sina.com.cn/s/blog_4a4820f9010008vi.html