[已解决]scenario遇到难题

class User extends CActiveRecord:

Quote

public function rules()
{





	return array(





		......





		array('pwd','length','max'=>32),





		array('pwd', 'compare', 'compareAttribute'=>'pwd2','on'=>'create'), //这里如果去掉'on'=>'create'就能正常校验





		......





		array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),





	);





}</div></div>

class UserController extends CController:

Quote

public function actionCreate()
{





	$user=new User;





	if(isset($_POST&#91;&#039;User&#039;]))





	{





		//$user-&gt;attributes=$_POST&#91;&#039;User&#039;];





		$user-&gt;setAttributes($_POST&#91;&#039;User&#039;], &#039;create&#039;);





		if($user-&gt;save()){





			if(Yii::app()-&gt;user-&gt;getState(&#039;role&#039;)==&quot;admin&quot;){





				$this-&gt;redirect(array(&#039;show&#039;,&#039;id&#039;=&gt;$user-&gt;id));





			}else{





				$this-&gt;redirect(array(&#039;create_ok&#039;,&#039;id&#039;=&gt;$user-&gt;id));





			}





		}





	}





	$this-&gt;render(&#039;create&#039;,array(&#039;user&#039;=&gt;$user));





}</div></div>

请问这样写有错吗?

但是我测试的时候pwd=pwd2的校验并不起作用,就算输入的pwd不等于pwd2也可以通过验证,请问怎么回事呢?

另外,我没有采用Yii的RBAC(我不需要这么复杂的功能),在用户登录的时候直接把用户角色用setState('role')储存在session(基于cookies)中,请问这样安全吗?setState有可能被访客伪造吗?

谢谢。

你把'create'改成'insert',或者用下述代码显式设置scenario:



$user=new User;


$user->scenario='create';


把role存在cookie是安全的,因为Yii对cookie里的内容做了保护,可以防止内容被更改伪造。不过如果你希望更加安全的话,建议你写自己的WebUser,定义个getRole()函数来动态获得当前用户的role。

Quote

你把'create'改成'insert',或者用下述代码显式设置scenario:


$user=new User;


$user->scenario='create';


$user->setAttributes($_POST['User'], 'create');

第二个参数不是设置scenario吗?

是的,但是这只是对setAttributes()函数有效,你还需要在调用save或validate时传入同样的scenario参数。通过setScenario(),你可以避免这些麻烦。

明白了,多谢