2011-06-26 21 views
3

ログインとMS Access DBを使用して小さなアプリを作成しました。テーブル "ユーザ"には "IsHeAdmin"フィールドがあります。 「はい」にチェックされている場合は、チェックされません(はい/いいえフィールド)。特別なフォームへのアクセスは、管理者にのみ許可します

ここで、アプリケーションの一部のフォームは、管理者(yes/noフィールドがチェックされているもの)にのみ表示されるようになっています。

ユーザーが管理者であるかどうかを確認する最も良い方法は何ですか?

編集:

SQLコマンドによってこれをチェックするいくつかの方法がありますか? 例:SELECT * FROMユーザーWHERE Username = current_logged_username AND IsHeAdmin = 'Yes'。 "はい"の場合はアクセスを拒否し、そうでない場合はmsgbox "アクセスが拒否されました"。

答えて

0

私はこの状況で何をしますか:ユーザーがログインして管理者ではない場合、管理フォームにアクセスするためのボタン/メニュー項目を無効にするだけです。次に、ログイン時にユーザーadminを1回だけチェックする必要があります。

0

ユーザーがログインすると、Userオブジェクトがデータベースから取得されます。彼がログインしている限り、そのオブジェクトをどこかに見えるようにします。このオブジェクトには、データベースの列に基づいてIsHeAdminというプロパティがあります。ユーザーがそのようなウィンドウを開こうとすると、そのプロパティーをチェックしてウィンドウを表示するかどうかをチェックします。管理者以外のユーザーがウィンドウを開くボタン(または何か)を無効にすると、さらに優れたものになります。

これは、ユーザーが管理者になったとき、または管理者でなくなるときに変更を有効にするには再度ログインする必要があるという欠点があります。

これが唯一の保護機能であり、フォームのデータベースからの重要なデータを表示している場合は、管理者でなくても通常のSQLを使用して同じデータを取得できることを忘れないでくださいSQLサーバー管理スタジオのようなものでクエリを実行します。

+0

ORM(http://en.wikipedia.org/wiki/Object-relational_mapping)を使用してオブジェクトを取得するか、ORMが状況に応じて複雑すぎる場合は、DBからのデータを使用してオブジェクトを作成します。ユーザーをどこかに見えるようにする最も簡単な方法(ただし必ずしも最良ではない)は、いくつかの静的プロパティを使用することです。 – svick

1

IPrincipal.IsInRole(role)に内蔵機能を使用することをおすすめします。

サンプル単純な実装:

class User : IPrincipal 
{ 
    private readonly bool IsAdmin; 
    // or better 
    private readonly string[] roles; // or HashSet<string> to speed up lookup 

    public User(string name) 
    { 
     // fetch and fill from db 
    } 

    bool IPrincipal.IsInRole(string role) 
    { 
     return role == "admin" && this.IsAdmin; 
     // or better 
     return this.roles.Contains(role); 
    } 
} 

用途:また

var user = new User("Joe"); 
if (user.IsInRole("admin")) 
    // do stuff 
else 
    throw new SEcurityException("Insufficient rights"); 

することができますハードコード役割行列:

[AccessAttribute(Roles.Administrator)] 
class AdminForm : BaseForm { } 

abstract class BaseForm 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     CheckAccess(); //check current user against attribute of form 

     base.OnLoad(e); 
    } 
} 

enum Roles 
{ 
    Administrator, 
    User 
} 

class AccessAttribute : Attribute { } 

class User 
{ 
    private bool? isAdmin; 

    public bool IsAdmin 
    { 
     get 
     { 
      if (!isAdmin.HasValue) // better to move to private static method 
      { 
       bool b = false; 
       using (SqlConnection connection = new SqlConnection(connectionString)) 
       using (SqlCommand command = connection.CreateCommand()) 
       { 
        command.CommandText = "select IsHeAdmin from Users where Name = @UserName"; 
        command.Paratemters.AddWithValue("@UserName", this.Name); 
        connection.Open(); 
        b = command.ExecuteScalar() as bool? ?? false; // if null then false, otherwise assign the value 
       } 
       isAdmin = b; 
      } 
      return isAdmin.Value; 
     } 
    } 
} 
+0

あまりにも複雑です。私はランクを作成したくない、私はちょうど現在のユーザーがデータベースの管理フィールドがチェックされているかどうか(はい/いいえフィールド)をチェックして管理者権限があるかどうかを確認する必要があります。 これをSQLコマンドで確認する方法はありますか? 例:SELECT * FROMユーザーWHERE Username = current_logged_username AND IsHeAdmin = 'Yes'。 "はい"の場合はアクセスを拒否し、そうでない場合はmsgbox "アクセスが拒否されました"。 – mazganekamaka

+0

@mazganekamaka:私は自分の答えを更新しました – abatishchev

関連する問題