0

開発中のサイトでユーザーを自分のデータに制限するという問題に直面しています。

現在、すべてのユーザーが他のすべてのユーザー データにアクセスできます。

Web で次のスニペットを見つけました。

public function defaultScope() {
        return array(
            'condition' => 'mob_num = '.YII::app()->user->getId(), // Customer can see only his orders
        );
    }

これは、列が整数の場合は正常に機能しますが、文字列の場合は次のエラーが発生します。

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'where clause'. The SQL statement executed was: SELECT COUNT(*) FROM `mob_reg` `t` WHERE name = shayan 

public function authenticate()
    {
        /*$users=array(
            // username => password
            'demo'=>'demo',
            'admin'=>'admin',
        );*/
          //  $users= Auth::model()->findByPk("8951821861");
            $users = Auth::model()->findByAttributes(array('company'=>$this->username)); 

            if($users == NULL)
                $this->errorCode=self::ERROR_USERNAME_INVALID;
            else if ($users->name != $this->username)
                $this->errorCode=self::ERROR_USERNAME_INVALID;
            else if ($users->company != $this->password)
                $this->errorCode=self::ERROR_PASSWORD_INVALID;

            else if($users->company=='naga')
            {
                $this->errorCode=self::ERROR_NONE;
                $this->setState('roles', 'super');
                 $this->id=$users->company;
            }
            else {
                 $this->errorCode=self::ERROR_NONE;
                $this->setState('roles', 'normal');
                 $this->id=$users->company;
            }

            return !$this->errorCode;
    /*  if(!isset($users[$this->username]))
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        elseif($users[$this->username]!==$this->password)
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
            $this->errorCode=self::ERROR_NONE;
        return !$this->errorCode;*/
    }
        public function getid()
        {
            return $this->id;
        }
4

1 に答える 1

0

何よりもまず、defaultScope を使用しません。これは、現在のユーザーに何らかの形で関連する他のユーザーの統計を計算するなど、後で追加する可能性のある他のユース ケースを防ぐためです。等

したがって、次のようにデータを検索するときはいつでも、追加の制限を追加する必要があると思います:

$orders = Orders::model()->findByAttributes(array('name' => user()->getid()));

本当にdefaultScopeに固執したい場合は、名前を適切に引用する必要があります。パラメーターを使用するのが道です:

public function defaultScope()
{
    return array(
        'condition' => "name=?",
        'params' => array(user()->getid()),
    );
}

もちろん、ユーザーの名前を order テーブルに保存したくはありませんが、それは別の話です。

于 2013-09-02T07:28:37.447 に答える