1

私は現在、YII に基づいてアプリケーションを作成しています。
インデックスに対する私のアクション:

  public function actionIndex() {
    $data = array();
    $data['server'] = Server::model()->findByPk(1);
    $data['dataProvider'] = new CActiveDataProvider('ServerUserPermission', array('criteria' => array('condition' => 'serverID=:id', 'params' => array(':id' => 1))));
    $this->render('index', $data);
}

私のajaxアクション:

public function actionAddPermission($server) {
    if(Util::checkServerPower($server, Permission::MODIFY_SERVER)) {
        $perm = new ServerUserPermission;
        $perm->userID = 1;
        $perm->serverID = $server;
        $perm->power = 10;
        try {
            if ($perm->save()) {
                echo "OK";
            } else {
                echo Util::print_r($perm->getErrors());
            }
        } catch (Exception $e) {
            echo 'Critical Error Code: ' . $e->getCode();
        }
    } else {
        echo 'No Permissions';
    }
}

私のビューは、ボタンを使用して addPermission アクションにリンクしています。

echo CHtml::ajaxButton("Insert New Player", array('addPermission', 'server' => $server->serverID), array('success'=>'refresh')); 

私の関数 Util::checkServerPower(...) は、アプリケーションの現在のユーザーをチェックします。結果: YII の Ajax リクエストはゲスト AuthWeb ユーザーによって処理されますが、ユーザーが実際にアクセス許可を追加できるかどうかを確認する必要があります。現在、他のゲストから送信された悪意のあるデータを保護するための安全なソリューションは考えられません。Ajax 呼び出しの (サーバー側の) ユーザー ID を取得することは何とか可能ですか?

とにかく心からありがとう

4

1 に答える 1

0

組み込みのアクセス制御を使用してCWebUser を拡張することでそれを行います。長く思えるかもしれませんが、私はそれがきれいな解決策だと思います。(すでに Yii::app()->user->isGuest などがあるので、ここですべてのパーミッションをチェックしてみませんか?)

1) アクセス制御フィルターを有効にします。

(1 つのコントローラーまたは /components/controller.php ですべてのコントローラーを一度に)

public function filters()
{
    return array( 'accessControl' ); // Tell Yii to use access rules for this controller
}

2) アクセス ルールを追加する

関係するコントローラーで。(申し訳ありませんが、私はあなたのインデックスアクションを気にしませんでした。)

public function accessRules()
{
    return array(
        [
            'allow', 
            'actions'=>['AddPermission'], 
            'expression'=>'$user->has(Permission::MODIFY_SERVER)'
        ],
        ['deny'],  // Deny everything else. 
    );
}

3) CWebUser を拡張する

// components/WebUser.php
class WebUser extends CWebUser {
    public function has( $permission)
    {
            // Check database for permissions using Yii::app()->user->id
            ...
    }
}

4) CWebUser の代わりに新しい WebUser を使用するようにアプリを構成します

// config/main.php
'components'=>[
    'user'=>[
        'class' => 'WebUser',
    ],
],
于 2013-08-26T07:43:29.760 に答える