Delphi UIアプリケーションのバックエンドとなるMS SQL Serverデータベースのユーザー認証モジュールをモデル化しようとしています。基本的に、ユーザーが1つのグループにのみ属しているユーザーアカウントを作成します。グループは「n」個の権限を持つことができます。
また、ユーザーはアプリケーションの設定に基づいてパスワードを変更する必要があるため(たとえば、90日ごと)、データベースにパスワード履歴を追加します。
また、ユーザーがログインおよびログアウトするたびにイベントをログに記録したいと思います。私はこれを将来の追加のイベントに拡張するかもしれません。
以下に私の最初の亀裂を見つけます。これを行うのは初めてなので、改善するための提案があれば教えてください。
ロールベースのセキュリティのための追加の属性、およびパスワードルール/有効期限の制約が必要ですか。
指定された要件に基づいて、モデルはかなり良好な状態です。
改善のためのいくつかの提案があります:
明示的に言っていないので、言うのは難しいですが、ユーザーパスワードを直接保存しているようです。 これはverybad!になります。一般的な認証データベースを見ると、パスワードは暗号化された形式で保存されています。 password
列とpassword_salt
列の両方がよく表示されます。
USER_LOGS
テーブルにはEvent
列があります。これがどのように入力されるかについては明確ではありません。 EVENT_TYPE
が参照するUSER_LOGS
テーブルがあるべきですか?これは、より親しみやすい報告になるかもしれません。一般的なイベントには、ログイン、ログアウト、パスワードの失敗、パスワードの変更、パスワードのリセット、ロックアウト、ロック解除などがあります。
GROUP_RIGHTS
テーブルは、誰が権利を付与したかを示していません。監査証跡の目的で、人々は多くの場合、誰がどの記録をいつ変更したかを記録します。それはあなたにとって問題ではないかもしれません。
以下は、指定されたビジネス要件に関するいくつかの質問です。これらは、いくつかの点で「テキストブック」の役割ベースのセキュリティパターンとは異なります。
ユーザーを1つのグループだけにしてよろしいですか?ロールベースのセキュリティの利点は、ロールがかなり静的である傾向があるのに対し、ロールを実行する人はかなり頻繁に行き来することです。これには、「2つの帽子をかぶる」ことがよくある人もいます。
あなたのデザインは助成金のみです。一部のシステムには付与および取り消しが含まれます。これにより、広く利用可能な権利は特定のグループには利用できないと言うことができます。
デザインにUSERS
としてユーザーとアカウントが混在しています。 peopleとuser IDsはしばしば区別されます。チームまたはマシン用のユーザーIDもあれば、目的の異なる複数のユーザーIDを持っている人もいます。これはあなたに役立つでしょう区別ですか?
ユーザーの権限を実装するには、ビット演算子が最善の方法だと思います。ここでは、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'(ビット= 128)および 'User-Delete'(ビット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はビットワイズ演算子であり、出力は次のようになります-
User-Add - 1
Blog-Delete - 64
天気を確認したい場合は、特定のユーザーがユーザー編集権限を持っているかどうかを確認します
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
出力=行なし。
あなたも見ることができます: http://goo.gl/ATnj6j