ユーザー認証(役割と権利)モジュールの設計


15

Delphi UIアプリケーションのバックエンドとなるMS SQL Serverデータベースのユーザー認証モジュールをモデル化しようとしています。基本的に、ユーザーが1つのグループにのみ所属するユーザーアカウントが必要です。グループは、「n」個の権利を持つことができます。

また、ユーザーがアプリケーション設定(たとえば、90日ごと)に基づいてパスワードを変更する必要があるため、パスワード履歴をデータベースに追加します。

また、ユーザーがログインおよびログアウトするたびにイベントを記録したいと思います。私はこれを将来の追加イベントに拡張するかもしれません。

以下に、私の最初のクラックを見つけます。これを行うのはこれが初めてなので、改善するための提案があれば教えてください。

役割ベースのセキュリティの追加属性とパスワードルール/有効期限の制約が必要ですか?

db-design


詳細なブログはこちら:goo.gl/ATnj6j
Suresh Kamrushi

1
わからない userテーブルにはgroup_idがあります。人は複数のグループのメンバーになることができますか?
ジョニー

回答:


11

記載された要件に基づいて、モデルは非常に良好な状態です。

改善のための提案を次に示します。

  • 明示的には言わないので、言うのは難しいですが、ユーザーパスワードを直接保存しているように見えます。 これは非常に悪いでしょう! 一般的な認証データベースを見ると、パスワードは暗号化された形式で保存されています。多くの場合、password列と列の両方が表示されpassword_saltます。

  • あなたのUSER_LOGSテーブルには、持っているEvent列が。これがどのように入力されるかについては明確ではありません。参照するEVENT_TYPEテーブルが必要USER_LOGSですか?これにより、わかりやすいレポートが作成される場合があります。一般的なイベントには、ログイン、ログアウト、パスワードの失敗、パスワードの変更、パスワードのリセット、ロックアウト、ロック解除などが含まれます。

  • あなたのGROUP_RIGHTSテーブルには、権利を付与された者を示すものではありません。監査証跡の目的で、人々は多くの場合、誰がいつどのレコードを変更したかのログを保持しています。それはあなたにとって問題ではないかもしれません。

記載されているビジネス要件に関する質問は次のとおりです。これは、「テキストブック」の役割ベースのセキュリティパターンとはいくつかの点で異なります。

  • ユーザーを1つのグループのみに参加させてもよろしいですか?ロールベースのセキュリティの利点は、ロールがかなり静的になる傾向があるのに対して、ロールを実行する人が頻繁に出入りすることです。これに含まれているのは、一部の人々がしばしば「2つの帽子をかぶる」ことです。

  • あなたのデザインは助成金のみです。一部のシステムには、付与 取り消しが含まれます。これにより、特定のグループが広く利用可能な権利を利用できないと言うことができます。

  • あなたのUSERSデザインのようにユーザーとアカウントが混ざっています。多くの場合、ユーザーIDには区別があります。一部のユーザーIDはチームまたはマシン用であり、一部の人々は異なる目的のために複数のユーザーIDを持っています。これはあなたに役立つ区別ですか?


3

ユーザー単位の許可を実装するには、ビット単位演算子が最適な方法だと思います。ここでは、Mysqlでそれを実装する方法を示しています。

以下は、いくつかのサンプルデータを含むサンプルテーブルです。

表1:1,2,4,8..etc(2の倍数)のようなビットとともに許可名を格納する許可テーブル

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

サンプルデータをテーブルに挿入します。

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

表2:ユーザーID、名前、およびロールを保存するユーザーテーブル。役割は権限の合計として計算されます。
例:
ユーザー「Ketan」が「User-Add」(ビット= 1)および「Blog-Delete」(ビット64)の許可を持っている場合、ロールは65(1 + 64)になります。
ユーザー 'Mehata'が 'Blog-View'(bit = 128)および 'User-Delete'(bit-4)の許可を持っている場合、ロールは132(128 + 4)になります。

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

サンプルデータ-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

ユーザーのアクセス許可をロードする場合は、ログイン後にユーザーのアクセス許可をロードします。以下のクエリを実行してアクセス許可を取得できます。

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

ここで、user.role "&" permission.bitは、次のように出力するBitwise演算子です。

User-Add - 1
Blog-Delete - 64

天気を確認する場合、特定のユーザーにユーザー編集権限があるかどうか

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

出力=行なし。

また見ることができます:http : //goo.gl/ATnj6j


そして、アクセス許可が100のように多数ある場合はどうしますか?
ypercubeᵀᴹ

2
異なる質問に対して3つの同一の回答を投稿しました!-数分間隔ですべて本日投稿。これは良い習慣ではありません。質問が十分に同一または類似していると思われる場合は、重複としてクローズするように投票することができます(クローズに投票する評判がない場合はフラグを立てることができます)。
ypercubeᵀᴹ

また、あなたのリンクを編集し、それが持っているかを説明してください(?詳細は、それがあなたのブログや他の誰かの、などです)
ypercubeᵀᴹ

同じ答えをコピーアンドペーストせずに、古い質問に大量にスプレーしてください。それらの質問が同じ場合、重複としてフラグを立てます。
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.