LightSwitch HTML Client でアクセス権によって利用できる機能を制限する方法 ~ Part 1

LightSwtich も認証に対応してますよ、という紹介をしました。デスクトップアプリケーションを利用することで 簡単にアカウントの管理 ができることも紹介しました。

次の話題としては、ユーザーの権限によってアプリで使用できる機能を制御することが必要になりますね。
コマンドバーボタンの無効化を実装してみましょう。

デスクトップアプリケーション(Silverlight クライアント)では、これが非常に簡単に実現できます。裏側に WCF RIA Services がいることのメリットですね。
CanXXX メソッド (XXX は Run, Read, Insert, Update, Delete など) で、User.HasPermissions(<対象とする権限>) を呼び出すだけでした。
アクセス権による制御が簡単にできることはデスクトップクライアントの大きなメリットであり、今でも要件によってはデスクトップクライアントを使うことが充分現実的であると言えます。

HTML Client では残念ながらそれほど簡単にはいきません。とはいえ、HTML Client でもアクセス権の制御はできません、というわけにはいきません。今回はその手順を紹介します。
LightSwitch にしては珍しくコードが必要ですが、面倒な感じはするとしても、定型的なコードで難しいことはありません。

なお本稿の内容は Beth Massi さんのブログ で紹介されたものをベースにしています。というか、日本語で書いただけで内容はそのまんまか(笑)。
が、ちょっとだけ仕様的に気になる部分があるので、それについての私なりの解決方法は 次の記事紹介します。


1. アクセス権(アクセス許可)を定義する

必要なアクセス権(アクセス許可)を定義します。
プロジェク"トのプロパティを開き、[アクセス制御] タブを開きます。ここでアクセス許可を追加します。
例えば、”顧客情報を編集および新規作成” する権限が必要であれば以下のようにします。

image

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Web.Http;
  7. using Microsoft.LightSwitch.Server;
  8. using Microsoft.LightSwitch.Security;
  9. using Microsoft.LightSwitch.Security.Server;
  10. using LightSwitchApplication;
  11.  
  12. namespace LightSwitchApplication.Perms
  13. {
  14.     public class UserPermissionsController : ApiController
  15.     {
  16.         // GET api/<controller>
  17.         public Dictionary<string, Boolean> Get()
  18.         {
  19.             Dictionary<string, Boolean> perms = new Dictionary<string, Boolean>();
  20.  
  21.             using (ServerApplicationContext ctx = ServerApplicationContext.CreateContext())
  22.             {
  23.                 var currentUser = ctx.Application.User;
  24.                 if (currentUser.IsAuthenticated)
  25.                 {
  26.                     perms.Add(Permissions.SecurityAdministration, currentUser.HasPermission(Permissions.SecurityAdministration));
  27.  
  28.                     currentUser.AddPermissions(Permissions.SecurityAdministration);
  29.  
  30.                     foreach (Permission perm in ctx.DataWorkspace.SecurityData.Permissions)
  31.                     {
  32.                         if (perm.Id != Permissions.SecurityAdministration)
  33.                         {
  34.                             perms.Add(perm.Id, currentUser.HasPermission(perm.Id));
  35.                         }
  36.                     }
  37.                 }
  38.             }
  39.  
  40.             return perms;
  41.         }
  42.     }
  43. }

 

2. テーブルのアクセス制御メソッドを記述する

テーブルのアクセス制御を行うメソッドを記述します。
対象のテーブルをデザイナー画面で開き(パースペクティブが “Server” であることを確認してください)、[コードの記述] を開きます。この中に [アクセス制御メソッド] グループがあるので、必要に応じて選択してコード画面を開きます。
今回で言うと、CanInsert, CanUpdate が必要ですね。

記述するコードは定型的で、

result = this.Application.User.HasPermission(<対応するアクセス権>);

です。これ自体はデスクトップアプリケーションと何ら変わるところはありません。サーバー側のコードなので、クライアントによる差異はありません。

image

3. Web API を使ってサービスを定義する

HTML Client でアクセス権による機能の制限を行うには、Web API を使ってサービスを定義する必要があります。
クライアントから非同期でサービスを呼び出し、これによって機能制限を行います。

Web API コントローラークラスを Server プロジェクト直下に作ってもいいのかもしれませんが、ここは Beth Massi さんの記事 どおりに “Perms” フォルダーを作って、そこにコントローラーを置くことにします。

2013-05-25 11-00-31

Perms フォルダーに Web API コントローラークラスを追加します。名前は “UserPermissionsController.cs” (クラス名の接尾辞が “Controller” なのはお約束) にしておきます。

imageimage

コントローラークラスで必要なのは “Get” メソッド 1個のみです。 現在のユーザーに付与されている権限のリストを取得するメソッドです。
Get で行う処理は、

  • サーバー側のコンテキストを作成
  • 現在のユーザーを一時的に昇格(SecurityAdministration 権限がないと、そもそもアクセス権の取得自体ができないので)
  • 現在のユーザーが持っている権限を Dictionary に入れて返す

という処理です。これはどのアプリでも全く同じコードになるので、慣れるまではこういうものだと思って、そのまま書くのもアリかも。

image

  1. using System;
  2. using System.Web.Routing;
  3. using System.Web.Http;
  4.  
  5. namespace LightSwitchApplication
  6. {
  7.     public class Global : System.Web.HttpApplication
  8.     {
  9.  
  10.         protected void Application_Start(object sender, EventArgs e)
  11.         {
  12.             RouteTable.Routes.MapHttpRoute("PermsApi", "Perms/{controller}");
  13.         }
  14.     }
  15. }

 

4. ルーティングの追加

Web API のコントローラーができました。Global.asax でルーティングを追加します。
前の手順から続けて進めていれば、ソリューションエクスプローラーは [ファイルの表示] になっているはずですが、もしそうでなければ、ここで切り替えてください。

Server プロジェクトに Global.asax を追加します。

imageimage

追加するコードは定型的です。

image

5. クライアントでユーザーの権限を取得する

ユーザー権限を返すサービスはできたので、次はクライアントからそれを呼び出します。
ここでは、コマンドバーボタンを無効化することで対象の機能を利用できないようにします。ボタンを配置したスクリーンのデザイナーを開きます。そうしたら [コードの記述]-[created] を選択して、画面生成時のイベントハンドラーを記述します。

imageimage

  1. /// <reference path="../GeneratedArtifacts/viewModel.js" />
  2.  
  3. myapp.Home.created = function (screen) {
  4.     // Write code here.
  5.     $.getJSON("../Perms/UserPermissions/", function (data) {
  6.         myapp.permissions = data;
  7.  
  8.         if (myapp.permissions["LightSwitchApplication:EditCustomer"]) {
  9.             screen.findContentItem("AddCustomer").isEnabled = true;
  10.         }
  11.         else {
  12.             screen.findContentItem("AddCustomer").isEnabled = false;
  13.         }
  14.     });
  15. };

コード中で、

  • LightSwitchApplication ・・・固定値
  • EditCustomer ・・・アプリケーションのプロパティページで設定したアクセス許可の名前
  • AddCustomer ・・・対象のボタンの名前

です。

 

以上で、一応完成。実際に権限有無によって以下のようになります。
LightSwitch にしては珍しくコードを書くことになりますが、定石通りなので難しいことはないですね。

image image
権限あり 権限なし

 

で、一応動作はしているのですが、少し気になる部分があります。

画面生成後に非同期でアクセス権を取得しに行っているので、表示直後は権限なしでもボタンが押せてしまうんですよね。それの対処は 次回

広告
カテゴリー: LightSwitch タグ: , パーマリンク

LightSwitch HTML Client でアクセス権によって利用できる機能を制限する方法 ~ Part 1 への1件のフィードバック

  1. ピンバック: LightSwitch HTML Client でアクセス権によって利用できる機能を制限する方法 ~ Part 2 | 技術との戯れ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中