5分で権利をグループに分割する最小限のシステム

ACLに苦しめられていますか? おそらく、権利をグループに分割するための最も簡単なソリューションがあります。 ACLテーブルも権利ツリーもありません。 しかし、各ユーザーに個別に権利を設定する必要がある場合、このソリューションは間違いなくあなたのためではありません。

5分しかないので、すぐに始めましょう。

ユーザーとグループでデータベーステーブルを作成または変更して、次のようにします。

users
id - primary
username - unique
password
group_id
groups
id - primary
name - unique


次に、いくつかのグループとユーザーを作成します。 管理者グループを作成することを忘れないでください

次に、ユーザーおよびグループモデルクラスを作成します

<?php
class User extends AppModel {
var $name = 'User' ;
var $displayField = 'username' ;
var $belongsTo = array (
'Group' => array (
'className' => 'Group' ,
'foreignKey' => 'group_id'
)
) ;
}
?>


<?php
class Group extends AppModel {
var $name = 'Group' ;
var $displayField = 'name' ;

var $hasMany = array (
'User' => array (
'className' => 'User' ,
'foreignKey' => 'group_id' ,
'dependent' => false
)
) ;

}
?>


そして、次のコードをapp_controller.phpに追加します。

<?php
class AppController extends Controller {

var $components = array ( 'Auth' ) ;
var $permissions = array ( ) ;

function beforeFilter ( ) {
$this -> Auth -> fields = array (
'username' => 'username' , //
'password' => 'password' //
) ;
$this -> Auth -> authorize = 'controller' ;
$this -> Auth -> autoRedirect = false ;
$this -> Auth -> loginAction = array ( 'controller' => 'users' , 'action' => 'login' ) ;
$this -> Auth -> logoutRedirect = array ( 'controller' => 'users' , 'action' => 'login' ) ;
$this -> Auth -> loginRedirect = array ( 'controller' => 'users' , 'action' => 'welcome' ) ;

}

function isAuthorized ( ) {
if ( $this -> Auth -> user ( 'group' ) == '' ) return true ; // "" ,
if ( ! empty ( $this -> permissions [ $this -> action ] ) ) {
if ( $this -> permissions [ $this -> action ] == '*' ) return true ;
if ( in_array ( $this -> Auth -> user ( 'group' ) , $this -> permissions [ $this -> action ] ) ) return true ;
}
return false ;

}

}
?>


users_controller.phpに次の行を追加します

<?php
class UsersController extends AppController {

var $name = 'Users' ;
var $helpers = array ( 'Html' , 'Form' ) ;
var $permissions = array (
'logout' => '*' ,
'welcome' => '*'
) ;

function welcome ( ) {
}

function login ( ) {
if ( $this -> Auth -> user ( ) ) {
$this -> Session -> write ( 'Auth.User.group' , $this -> User -> Group -> field ( 'name' , array ( 'id' => $this -> Auth -> user ( 'group_id' ) ) ) ) ;
$this -> redirect ( $this -> Auth -> redirect ( ) ) ;
}
}

function logout ( ) {
$this -> redirect ( $this -> Auth -> logout ( ) ) ;
}

// , add, edit, delete
?>


まあ、それがすべてです。 ここでアクセス権を指定するには、users_controllerで行ったように、コントローラーに$権限を追加する必要があります

仕組み:

ユーザーがログインすると、グループの名前を認証セッションに追加します。 その後、コントローラーメソッドにアクセスすると、AuthコンポーネントがisAuthorized関数を呼び出し、trueが返された場合、ユーザーはアクセスを取得し、falseが返された場合、それを禁止します。 ユーザーが管理者グループに属している場合、常にアクセスできます。 isAuthorized関数は、現在のアクションの名前をキーとして使用して各コントローラーで指定された$ permissions配列を確認し、ユーザーグループがこのキーによって配列内にある場合(まあ、または配列の代わりに '*'-つまり全員)、ユーザーはアクセスを許可されます
注:アクセスレベルが「*」であっても、まだログインしていることがわかります。 Auth-> allowメソッドを使用して、許可されていないユーザーのログインを許可できます。
注:デフォルトではAuthがアクセスを許可するため、ユーザー/ログインへのアクセスを定義しませんでした。

例:

Moderatorsグループにユーザーの削除を許可するとします。 次のコードをusers_controller.phpに追加します。

var $permissions = array (
'logout' => '*' ,
'welcome' => '*'
'delete' => array ( '' )
) ;


ただし、承認されていないユーザーは登録できません。 users_controller.phpに追加します

function beforeFilter ( ) {
$this -> Auth -> allow ( 'signup' ) ;
parent :: beforeFilter ( ) ;
}


このソリューションがお役に立てば幸いです。 これは、権利をグループに分割するための非常に簡単なソリューションです。もちろん、欠点もあります。 たとえば、ユーザーが作成した記事のみを変更することはできません。 まあ、少なくともコードを変更せずに。 しかし、私はあなたにお任せします。

Source: https://habr.com/ru/post/J69182/


All Articles