LightSwitch使用窍门:在HTML客户端检查用户权限的简便方法

[原文发表地址] LightSwitch Tip: A Simple Way to Check User Permissions from the HTML Client

[原文发表时间] 2013-04-12 08:36 AM

4/17更新: 如果您不怕写代码,这里一种更为可靠的方法,通过调用HTML客户端从数据库中来获取所有用户权限,并通过JavaScript可以在任何屏幕上显示:使用 LightSwitch ServerApplicationContext WebAPI 来获取用户权限

----------------

一直在用LightSwitch的人知道我们支持一个很强大的权限系统,允许开发人员定义某些权限,然后在代码中检查它们。LightSwitch实体提供了大量的”CanExecute”挂接和查询,它们可用于检查周边数据权限和查询操作。

例如,如果您已经定义了一个”CanAddCustomer”的权限,您能够检查允许在服务器上插入一个客户实体之前,用户是否有此权限。首先在项目属性的访问控制选项卡上定义权限:

0647_image_thumb_30E9CFBF

然后在数据设计器中选择Server perspective,然后下拉"Write Code"按钮并选择 Customers_CanInsert 的访问控制方法:

4338_image_thumb_502C7692

然后您写类似下面代码来允许或者禁止客户的插入:

Private Sub Customers_CanInsert(ByRef result As Boolean)
result = Me.Application.User.HasPermission(Permissions.CanAddCustomer)
End Sub

总是想要确保这种服务器端的方式,保护您的系统中的数据。然而,有时候为了隐藏/取消隐藏 (或启用/禁用) 在屏幕上的元素,我们也想在UI中使用权限来检查。

在Silverlight桌面客户端,这是很容易做到的,是因为我们使用便携式的程序集,这些程序集允许LightSwitch在客户端与服务端之间共享代码。您从屏幕中获得一个任何时间都对您有效的User对象。在HTML客户端中不存在这种情况,但所有都不会丢失!

定义查询

假如您想在HTML客户端屏幕来检查权限,最简单的方法就是添加查询并且确保在服务器端的查询。例如,添加基于客户的查询,称为”CanAddCustomer”:

5315_image_thumb_74715B14

然后在CanAddCustomer_CanExecute方法中添加如下代码来检查权限:

Private Sub CanAddCustomer_CanExecute(ByRef result As Boolean)
result = Me.Application.User.HasPermission(Permissions.CanAddCustomer)
End Sub

因为如果用户具有权限,这将会连接数据库,我们可以使查询尽可能高效,不返回任何结果。选择"CanAddCustomer_PreprocessQuery"方法,然后编写一个不返回结果的查询。

Private Sub CanAddCustomer_PreprocessQuery(
ByRef query
As System.Linq.IQueryable(Of LightSwitchApplication.Customer))
query = From c In query Where 0 = 1
End Sub

设置屏幕

既然我们有自己的查询,我们可以将其添加到屏幕上,在此屏幕上我们希望启用或禁用基于该权限的UI 元素。在屏幕设计上面板,点击顶部的“添加数据选项”,并将查询添加到您的屏幕上:

6404_image_thumb_00DF7E3E

然后选择您想启用或禁用的控件,注意其在属性框中的名称,我们将在代码中需要它。

2671_image_thumb_670B480E

添加一些 JavaScript 代码

最后,在设计器选择Screen结点,然后下拉“Write Code”按钮,添加代码到“created”方法里。

5315_image_thumb_74715B14

myapp.BrowseCustomers.created = function (screen)
{
// Write code here.
screen.getCanAddCustomer().then(function
success() {
screen.findContentItem("AddCustomer").isEnabled = true;
}, function error() {

screen.findContentItem("AddCustomer").isEnabled = false;
});

};

在我们屏幕上这段代码调用查询,如果用户没有权限来执行它,这将会失败,然后调用失败处理程序。注意如果查询是因为别的原因失败了,它同样会隐藏UI, 但如果客户端真的可以验证用户的权限的话,它可以确保只有用户界面显示出来。

请记住隐藏在客户端中的元素并不提供真正意义上的安全,所以一定要使用如上所示的服务器端访问控制方法,以确保没有客户端可以访问您想要保护的数据。

玩的愉快!