2

自分のサイトの管理パネルを作成したいのですが、このために作成しましたadmin.ctp。DBテーブル名のuserには列が含まれますrole。ここで、role = admin / regular(user)です。

ログインフォームは1つしかなく、問題は、「チェック」を配置して、その場合user.role=adminはにリダイレクトし、そのadmin/user/dashboard場合user.role=regularはにリダイレクトすることは可能layout=defaultですか?私のAppController.phpには次のものが含まれています。

function beforeFilter(){
    $this->Auth->allow('index','view','login','home');
    $this->set('admin',$this->_isAdmin());

    $this->set('logged_in',$this->Auth->loggedIn());
    $this->set('current_user',$this->Auth->User());
    if ((isset($this->params['prefix']) && ($this->params['prefix'] == 'admin'))) {
        $this->layout = 'admin';
    }

そしてusersController.php

function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('*');
    if($this->action=='add' || $this->action=='edit'){
        $this->Auth->authenticate=$this->User;
    }
}

function login(){
    if(!($this->Auth->loggedIn())){
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                if($user['role'] === 'admin'){
                    $this->redirect($this->Auth->redirect('admin',array('controller' => 'user','action' => 'admin_dashboard')));
                }
                $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
            } else {
                $this->Session->setFlash('Your username/password combination was incorrect.',
                    'alert',array(
                        'plugin' => 'TwitterBootstrap',
                        'class' => 'alert-error'
                    ));
                $this->set('forget', 'Forgot Your Password');

            }
        }
    }else
    {
        $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
    }
}

Cakephp2.2.3を使用します。前もって感謝します!

4

5 に答える 5

2

field('name')これが私のやり方です (グループ モデルに応じて変更することを忘れないでください)。

if ($this->Auth->login())
{
    this->User->Group->id = $this->Auth->user('group_id');
    switch ($this->User->Group->field('name'))
    {
        case 'admin':
            $this->redirect($this->Auth->redirect('admin',array('controller' => 'user','action' => 'admin_dashboard')));
            break;
        case 'regular':
            $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
            break;
        default:
            //...
            break;
    }
}
于 2013-01-18T22:58:22.630 に答える
1

私は実際にいくつかのコードを投稿して、おそらく自分自身のためにもこの主題に光を当てたいと思っています. /Users/view を拡張する各ユーザー用のシンプルなダッシュボードを作成しました。次のステップは、各データ セットへのユーザー固有のアクセス権を取得することです。

AppController

class AppController extends Controller {
    public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            )
        ),
        'Session'
    );
    public $helpers = array('Html', 'Form', 'Session');

    public function beforeFilter() {
        //Configure AuthComponent

        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'dashboard');
        $this->Auth->allow('display');
    }
}

ユーザーコントローラー

public function dashboard() {
    $id = $this->Auth->user('id');
    $this->set('user', $this->User->read(null, $id));

    $group_name = $this->User->Group->field('name', array('id' => $this->Auth->User('group_id')));
    $this->redirect = array('controller' => 'users', 'action' => 'dashboard');
}   

ダッシュボード.ctp

$this->extend('/Users/view');
于 2013-01-23T21:37:45.123 に答える
1

AppController セット内:

$this->Auth->authorize = array('Controller');

そして、次のことを行います

public function isAuthorized($user = null)
{
    if (isset($this->request->params['admin']))
    {
        if(!isAdmin)
        {
            return false;
        }
    }

    return true;
}
于 2013-01-18T22:10:46.923 に答える
1

実際、CakePHP は、簡単に有効化できる便利な認証および承認フレームワークを既に提供しています。

CakePHP マニュアルから、データベースに保存されているロールに基づいて承認する方法を次に示します。beforeFilter()また、ユーザーが管理者である場合にログイン リダイレクト アクションを変更する例も含めました。

AppController.php:

public $components = array(
  'Auth' => array(
    'authorize' => array('Controller'),
    'loginRedirect' => array('/'),
));

public function beforeFilter() {
  // This allows us to use $user in all controllers.
  $this->set('user', $this->Auth->user());

  // If the user is an admin, override the loginRedirect
  if ('admin' === $this->Auth->user('role')) {
    $this->Auth->loginRedirect = array(
      'controller' => 'users',
      'action' => 'admin_dashboard',
    ));
  }
}

ユーザーコントローラー.php:

public function isAuthorized($user) {
  // Ensure the user has a valid role. If not, deny access to all actions:
  if ((!isset($user['role'])) || ('' === $user['role'])) return false;

  // If we're trying to access the admin view, verify permission:
  if ('admin_dashboard' === $this->action)
  {
    if ('admin' === $user['role']) return true;  // User is admin, allow
    return false;                                // User isn't admin, deny
  }

  return true;
}

承認を調整する方法は多数あるため、if/else必要に応じてステートメントを調整してください。メソッドは比較的単純です。アクセスを許可する場合、または許可しない場合はisAuthorized()、戻る必要があるだけです。truefalse

于 2013-01-18T23:19:24.827 に答える