【问题标题】:Restricting user to their own data限制用户使用自己的数据
【发布时间】:2013-09-05 04:10:31
【问题描述】:

我面临着在我正在开发的网站上将用户限制为他们自己的数据的问题。

目前所有用户都可以访问所有其他用户的数据。

我在网上找到了这个 sn-p:

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;
        }

【问题讨论】:

  • 您是否阅读过错误消息?它以纯文本形式表示您正在尝试查询不存在的列。 mob_reg一个名为name的列吗?
  • 之后的下一个问题是,当您将用户名放入查询时,您没有引用该用户名。使用绑定参数而不是直接插入。
  • 列名存在这不是问题,是的,你能告诉我如何引用用户名吗?
  • 您应该发布您正在使用的实际代码,而不是您找到并用作灵感的代码...public function defaultScope() { return array( 'condition' => 'name = :name', 'params' => array(':name' => ...), ); }

标签: php web yii


【解决方案1】:

首先,我不会使用 defaultScope,因为这会阻止您以后可能想要添加的其他用例,例如计算与当前用户有某种关联的其他人的统计信息,例如谁是我最常联系的人等。

所以我认为你应该在查找数据时添加额外的限制,如下所示:

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

如果你真的想坚持使用defaultScope,你需要正确引用名称,使用参数是要走的路:

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

当然,您不希望用户名存储在您的订单表中,但那是另一回事了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2019-05-30
    • 2013-05-31
    相关资源
    最近更新 更多