0

まず、私の語学力で申し訳ありませんが、私は英語で書くことに慣れていません。;)
初めての CakePHP アプリケーションを開発しようとしています。

私がやろうとしていること:

  • ユーザーはグループに属しており、グループはさまざまな場所にアクセスできます。
  • ユーザーは、この場所の予約を追加できます。

したがって、私の主な問題は、ユーザーのアクセス許可を取得するための最良の方法を見つけることです:

  • ユーザーは、自分がアクセスできる場所のみを表示する必要があります。
  • ユーザーが場所の予約を追加しようとすると、この場所に対するユーザーの許可を確認する必要があります。

モデレーターと管理者もいますが、これは同様の問題だと思います。

では、どうすればこれを適切に行うことができますか?ACL は正しい方法ではないようです。ほとんどのチュートリアルでは、データベース行ではなく、アクションへのアクセスを制御しています。

データベースの外観:
ユーザー テーブルがあり、AuthComponent を使用して認証を管理します。これはうまくいきます。

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) 

ユーザーグループ用のグループテーブルがあります。

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
)


CREATE TABLE IF NOT EXISTS `groups_users` (
  `group_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  UNIQUE KEY `group_id` (`group_id`,`user_id`)
) 

そして、私は私の場所を持っています。

CREATE TABLE IF NOT EXISTS `locations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `adress` text NOT NULL,
  `description` text,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) 

テーブルには、どのグループがどの場所にアクセスできるかという権限が含まれています。

CREATE TABLE IF NOT EXISTS `groups_locations` (
  `group_id` int(11) NOT NULL,
  `location_id` int(11) NOT NULL,
  UNIQUE KEY `group_id` (`group_id`,`location_id`)
)

もちろん予約表:

CREATE TABLE IF NOT EXISTS `reservations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `location_id` int(11) NOT NULL,
  `start` date NOT NULL,
  `end` date NOT NULL,
  `user_id` int(11) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

THX

4

2 に答える 2

0

多分私は解決策を持っています-私はいくつかのフィードバックを使用できます:

ユーザーがログインしたら、権限をセッション変数に保存します。

    function login() {
        if($user = $this->Auth->user()) {       
            $this->User->unbindModel(array(
                    'hasMany' => array('Reservation'),
            ));
            $user = $this->User->find('first', array('conditions' => array('id' => $user['User']['id']), 'recursive' => 2));
            $this->Session->write('Auth.User.Group', $user['Group']);
    }

このソリューションがどれほど安全かはわかりません。許可の変更はログアウト後にのみ影響しますが、うまく機能しているようです。

于 2011-03-16T12:39:53.963 に答える
0

groups_users本当にそのテーブルが必要ですか? 各ユーザーは 1 つのグループにしか所属できませんか?

グループIDをユーザーテーブルに外部キーとして入れるだけで、これをはるかに簡単に達成できます

    CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `group_id` int(11) NOT NULLL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
)

次に、ユーザーが特定の情報を表示できるかどうかをビューに送信できます...

app_controller.php に以下を追加します

function beforeFilter(){
    $this->set('users_role', $this->Auth->user('group_id'));
}

これで、ビューからアクセスできる変数が $users_role... になり、ビューで次の操作を実行できます。

<?php if($users_role == 1 ): ?>
    //show records available to admins
<?php elseif ($users_role == 2): ?>
    //show records available to logged in users
<?php else : ?>
    //show records for all users
<?php endif; ?>
于 2011-03-15T18:56:20.740 に答える