- /*
- *
- * @copyright 2011
- * @version $Id$
- * @access public
- * @property string $id
- * @property string $account
- * @property string $ pwd
- * @property string $lastquesttime
- * @property string $lastip
- * @property int $regtime
- * @property int $accounttype
- * @property string $oldaccount
- * @property int $logintimes
- * @property string $currentIP
- * @property int $cid
- */
- class Resposity extends AdminActiveRecord {
- public $connectionPrefix = 'passport';
- protected $list = null;
- protected $passportConfig = null;
- public $oldaccount = '';
- /* *
- * 指定された AR クラスの静的モデルを返します。
- * @return 静的モデル クラスの応答性
- */
- public static function model($className = __class__) {
- returnparent::model ( $className );
- }
-
- /**
- * 必要に応じて変更します。
- * @return は、primaryKey を混合します。
- */
- public functionprimaryKey() {
- return 'id';
- }
-
- /**
- * @return モデル属性の配列検証ルール。
- */
- public function rules() {
- // 注: ルールは、
- // ユーザー入力を受け取る属性に対してのみ定義する必要があります。s
- return array (
- array ('accounttype,cid', 'required' ),
- array ('accounttype', 'in', 'range' => array ('0', '1', '2', '3', ' 4', '5', '6', '7' ) ),
- array ('currentIP', 'ip')
- );
- }
- /**
- メインアカウントに基づいてユーザー情報を取得します
- **/
- protected function getUserInfoByMainAccount($account, $cid){
- $account=strto lower($account);
- $cacheKey = hash ( 'md5', $account.'^]'.$cid.'^]'.'0' );
- $user=UtilD ::getCache('resposity',$cacheKey);
- if(is_array($user)){
- UtilD::clearNullOrEmptyValue ( $user );
- }else{
- $user=array();
- }
- if(count ($user)){
- return $user;
- }else{
- $model = $this->find ( 'account=:account AND cid=:cid', array (':account' => $account,':cid' => $cid ) );
- if($model){
- $user=$model->getAttributes();
- unset($model);
- }
- UtilD::setCache('resposity',$cacheKey,$user) ;
- return $user;
- }
- }
- /**サブアカウント*に基づくユーザー情報の取得*/
- protected function getUserInfoByChildAccount($subaccount,$cid,$accounttype){
- if(!$this->validate(array('accounttype') , true)){
- return -1000;
- }
- $subaccount=strto lower($subaccount);
- $cacheKey = hash ( 'md5', $subaccount.'^]'.$cid.'^]'.$accounttype );
- $userAccounts=UtilD::getCache('resposity',$cacheKey);
- if(is_array($userAccounts)){
- UtilD::clearNullOrEmptyValue($userAccounts);
- }else{
- $userAccounts=array() ;
- }
- if(!count($userAccounts)){
- $accountRefer=new AccountRefer();
- $model=$accountRefer->find ( 'subaccount=:subaccount AND cid=:cid AND accounttype=:accounttype' , array (':subaccount' => $subaccount,':cid' => $this->cid,':accounttype'=> $accounttype) );
- if($model){
- $userAccounts= $model->getAttributes();
- UtilD::setCache('resposity',$cacheKey,$userAccounts);
- }
- }
- if(isset($userAccounts['account'])){
- return $this- >getUserInfoByMainAccount($userAccounts['account'],$userAccounts['cid']);
- }
- return array();
- }
- /**アカウントタイプに基づいてユーザーデータを取得**/
- public function getUserInfoByAccount(){
- if( $this->accounttype==0){
-
- return $this->getUserInfoByMainAccount($this->account,$this->cid);
- }else{
- return $this->getUserInfoByChildAccount($ this->account,$this->cid,$this->accounttype);
- }
- }
- /**
- * メインアカウントを通じてサブアカウントを取得します
- */
- public function getSubAccountByMainAccount(){
- $c=new CDbCriteria();
- $c->addCondition('cid=:cid AND account=:account', 'AND');
- $c->params=array(':cid'=>$this->cid, ' :account'=>$this->account);
- $refer=new AccountRefer();
- $result=$refer->getListByPage(1, 30, $c);
- $data=array();
- if($result['count']>0){
- foreach($result['data'] as $row){
- $data[$row['accounttype']]=$row['subaccount'] ;
- }
- }
- return $data;
- }
- /**
- 現在の加盟店の操作レベルを取得します
- 1 は自分で追加したユーザーには完全な権限がありますが、他機関によって追加されたユーザーには権限がありません
- 2 は自分で追加したユーザーに対して完全な権限があり、指定された機関からのユーザーに対してクエリ権限がありますby accessids
- **/
- public function getAccess(){
- if ($this->passportConfig === null) {
- $this->passportConfig = PassportConfig::model ()->getItemConfigById ( $this->cid );
- }
- $ip=Yii::app ()->request->getUserHostAddress();
- $ips=CJSON::decode($passportConfig['iprouters']);
- if(!in_array($ip,$ips) )){
- throw new CHttpException(403, 'このページにアクセスする権限がありません!');
- }
- }
- /**有名ブランドユーザーの個人データを変更**/
- public function saveUserAttributes($tickets,array $attributes){
- try{
- $user=$this->getUserAttributes($tickets);
- if( empty($user) || !is_array($user)){
- return -1001;
- }
- $data=array();
- if($user[WebUserD::STORAGE_KEY]!=='[]'){
- $data=CJSON::decode($user[WebUserD::STORAGE_KEY]);
- }
- if(!is_array($data)){
- $data=array();
- }
- $attributes=array_change_key_case($attributes );
- foreach($attributes as $key=>$value){
- if(!is_array($value)){
- $data[$key]=$value;
- }else{
- if(!isset($ data[$key])){
- $data[$key]=array();
- }
- $data[$key]=array_merge($data[$key],$attributes[$key]);
- }
- }
- $user[WebUserD::STORAGE_KEY]=CJSON::encode($data);
- $user['lastquesttime']=$_SERVER['REQUEST_TIME'];
- $user['data']=CJSON::encode ($data);
- $this->setAttributes($user,false);
- !$this->currentIP && $this->currentIP='127.0.0.1';
- !$this->lastip && $this->lastip=$this->currentIP;
-
-
- !$this->logintimes && $this->logintimes = 0;
- $this->setIsNewRecord ( false );
- if($this ->save()){
- UtilD::setCache('resposity', $tickets, $user);
- }else{
- return -1003;
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- /**アカウントの個人データを変更**/
- public function saveUserAttributesByName( array $attributes){
- $user=$this->getUserInfoByMainAccount($this->account,$this->cid);
- if(empty($user)){
- return -1001;
- }
- $cacheKey = hash ( 'md5', $user['account'].'^]'.$user['cid'].'^] '.'0' );
- return $this-> saveUserAttributes($cacheKey,$attributes);
-
- }
- /**
- @return array
- トークンに基づいてすべてのアカウントデータを取得します
- **/
- public function getUserAttributes($tickets){
- $t = hash ( 'md5', $tickets . '&' . $this- >現在のIP . '&' . $this->cid );
- $ft=UtilD::getCache('resposity', $t);
- if (! $ft ) {
- $ft = 0;
- } else {
- if ($ft > 4) { //如果1个ip 1分钟内连续5次获取失败
- return -1005;
- }
- }
- $user=UtilD ::getCache('resposity',$tickets);
- if(!$user){
- $ft++;
- UtilD::setCache('resposity', $t,$ft,60);
- return -1001;
- }
- $user['lastquesttime']=$_SERVER['REQUEST_TIME'];
- UtilD::setCache('resposity',$tickets,$user);
- return $user;
- }
- /**メインアカウントを追加**/
- public function add(){
- try{
- if($this->accounttype!=0){
- return -1000;
- }
- $this->account=strto lower($this->account);
- //检查主帐号が存在するかどうか
- $user=$this->getUserInfoByAccount();
- if(is_array($user) && count($user)){
- return -1006;
- }
- //データ保存開始
- $this->setIsNewRecord ( true );
- $this->lastquesttime=$_SERVER['REQUEST_TIME'];
- $this->regtime=$_SERVER['REQUEST_TIME'];
- $this->data= '[]';
- $this->pwd=hash('sha256',$this->pwd);
-
- if(!$this->save()){
- return -1007;
- }else {
- $user=$this->getAttributes();
- $cacheKey = hash ( 'md5',$this->account.'^]'.$this->cid.'^]'.$this ->アカウントタイプ );
- UtilD::setCache('resposity', $cacheKey, $user);
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- /**関連するサブアカウント* */
- public function addChild($subaccount){
- try{
- //检查子が同名の帐号と主账号关联
- $subaccount=strto lower($subaccount);
- $user=$this->getUserInfoByChildAccount($サブアカウント,$this->cid,$this->アカウントタイプ);
- if($user){
- return -1008;
- }
- $user=$this->getUserInfoByMainAccount($this->アカウント,$ this->cid);
- if(!$user){
- return -1001;
- }
- //检查の種類の有無と主账号关联
- $accountRefer=new AccountRefer();
- $model=$accountRefer ->find('pid=:pid AND cid=:cid AND accounttype=:accounttype', array (':pid'=>$user['id'],':cid'=>$this-> ;cid,':accounttype'=>$this->accounttype));
- if($model){
- return -1009;
- }
- $this->account=strto lower($this->account);
- $accountRefer->cid=$this->cid;
- $accountRefer->setIsNewRecord ( true );
- $accountRefer-> pid=$user['id'];
- $accountRefer->account=$user['account'];
- $accountRefer->subaccount=$subaccount;
- $accountRefer->accounttype=$this-> accounttype;
- if($accountRefer->save()){
- $cacheKey = hash ( 'md5',$accountRefer->subaccount.'^]'.$accountRefer->cid.'^]'.$ accountRefer->accounttype );
- UtilD::setCache('resposity', $cacheKey, $accountRefer->getAttributes());
- }else{
- return -1010;
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- /**パスワードを変更する**/
- public function changePassword(){
- try{
- $user=$this->getUserInfoByAccount();//检查主帐号が存在するかどうか
- if (!$user){
- return -1001;
- }
- $this->setIsNewRecord ( false );
- $this->pwd=hash('sha256',$this->pwd);
- if($ this->pwd!==$user['pwd']){
- $this->setIsNewRecord ( false );
- $user['pwd']=$this->pwd;
- $this-> setAttributes($user,false);
- if($this->save()){
- $cacheKey = hash ( 'md5', $user['account'].'^]'.$user['cid' ].'^]'.'0' );
- UtilD::setCache('resposity', $cacheKey, $user);
- }else{
- return -1011;
- }
- }
- }catch(Exception $ex) {
- return -1004;
- }
- }
- /**サブアカウントの変更**/
- public function repickAccount(){
- try{
- $accounts=$this->getUserInfoByChildAccount($this->oldaccount,$this- >cid,$this->アカウントタイプ);
- if(!$accounts){
- return -1001;
- }
- $cacheKey = hash ( 'md5',$this->oldaccount.'^]'.$ this->cid.'^]'.$this->accounttype );
- $user=UtilD::getCache('resposity', $cacheKey);
- if($this->oldaccount!==$this ->account){
- $accountRefer=new AccountRefer();
- $accountRefer->setIsNewRecord ( false );
- $accountRefer->setAttributes($user,false);
- $accountRefer->subaccount=$this ->アカウント;
- if($accountRefer->save()){
- $user['サブアカウント']=$this->アカウント;
- UtilD::setCache('resposity', $cacheKey,array() );
- $cacheKey= hash ( 'md5',$user['subaccount'].'^]'.$this->cid.'^]'.$this->accounttype );
- UtilD::setCache ('resposity', $cacheKey,$user);
- }else{
- return -1012;
- }
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- /**
- メインアカウントを削除
- * */
- public function deleteMainAccount(){
- try{
- $user=$this->getUserInfoByMainAccount($this->account,$this->cid);
- if(!$user){
- return -1001 ;
- }
- //检查は有子帐号
- $accountRefer=new AccountRefer();
- $models=$accountRefer->findAll('pid=:pid', array (':pid'=>$user[ 'id']));
- if(is_array($models)&&count($models)){
- foreach($models as $model){
- $k= hash ( 'md5', $model->subaccount.' ^]'.$model->cid.'^]'.$model->accounttype );//删除子帐号缓存
- UtilD::setCache('resposity', $k,false);
- unset($ model);
- }
- unset($models);
- }
- //删除主帐号缓存
- $cacheKey = hash ( 'md5', $this->account.'^]'.$this->cid. '^]'.'0' );
- if($this->deleteByPk($user['id'])){
- UtilD::setCache('resposity', $cacheKey,false);
- }else{
- return -1013;
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- /**サブアカウントを削除**/
- public function deleteChildAccount(){
- try{
- $user=$this ->getUserInfoByChildAccount($this->account,$this->cid,$this->accounttype);
- if(!$user){
- return -1014;
- }
- //删除缓存
- $cacheKey = ハッシュ ( 'md5', $this->account.'^]'.$this->cid.'^]'.$this->accounttype );
- $child=UtilD::getCache('resposity ',$cacheKey);
- $accountRefer=new AccountRefer();
- if($accountRefer->deleteByPk($child['id'])){
- UtilD::setCache('resposity', $cacheKey,false) ;
- }else{
- return -1014;
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- public function login(){
- try{
- if(empty($this-> currentIP)){
- return -1017;
- }
- $tickets=hash ( 'md5', $this->account.'^]'.$this->cid.'^]'.$this->アカウントタイプ );
- $t = ハッシュ ( 'md5', $tickets . '&' 。 $this->currentIP 。 '&' 。 $this->アカウントタイプ 。 '&' 。 $this->cid );
- $ft=UtilD::getCache('resposity', $t);
- if (! $ft) {
- $ft = 0;
- } else {
- if ($ft > 4) { //如果1个ip 1分钟内连续5次获取失败
- return -1015;
- }
- }
- $user=$this->getUserInfoByAccount();
- if(!$user){
- $ft++;
- UtilD::setCache('resposity', $t,$ft,60);
- return -1001;
- }
- $this->pwd=hash('sha256',$this->pwd);
- if($user['pwd']!==$this->pwd){
- $ft++;
- UtilD ::setCache('resposity', $t,$ft,60);
- return -1016;
- }
- $tickets=hash ( 'md5', $user['account'].'^]'.$user[ 'cid'].'^]'.'0' );
- //更新登录次数と最終请要求時間
- if(!isset($user['currentIP'])){
- $user['currentIP']= $this->currentIP;
- }
- $user['lastip']=$user['currentIP'];
- $user['currentIP']=$this->currentIP;
- if(!isset($user ['logintimes'])){
- $user['logintimes']=0;
- }
- $user['logintimes']++;
- $user['lastquesttime']=$_SERVER['REQUEST_TIME'];
- $this->setAttributes($user,false);
- if($this->save()){
- UtilD::setCache('resposity', $tickets,$user);
- return array('tickets' =>$tickets);
- }else{
- return -1017;
- }
- }catch(Exception $ex){
- return -1004;
- }
- }
- }
-
复制發
|