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 ( ) ;

}








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



All Articles