2012-10-31 14 views
12

मई में वापस, मैंने this question पोस्ट किया। मैं एक ही ऐप पर एक ही काम करने की कोशिश कर रहा हूं, लेकिन मुझे इस समस्या का समाधान नहीं मिला है। मेरे पास अधिक जानकारी और बेहतर कोड है, इसलिए मुझे आशा है कि आप लोग इसे हल करने में मेरी मदद कर सकते हैं।केकपीएचपी 2.x एथ दो अलग लॉग इन

केस का उपयोग करें: डॉक्टर के कार्यालय में व्यवस्थापक उपयोगकर्ताओं के साथ एक वेबसाइट है। उपयोगकर्ता User मॉडल और UsersController के माध्यम से केकेपीएचपी के ऑथ के साथ सफलतापूर्वक लॉगिन करते हैं।

डॉक्टरों ने पूरी तरह से अलग प्रोफ़ाइल और कार्यों के साथ चिकित्सकों का जिक्र किया है। डॉक्टरों को example.com/physicians/login के माध्यम से लॉगिन करने की आवश्यकता है। हालांकि, इस लॉगिन इस

authError => 'You are not authorized to access that location.'

यहाँ के साथ विफल हो रहा है मेरी कोड AppController में है:

class AppController extends Controller { 
public $helpers = array('Form', 'Html', 'Time', 'Session', 'Js' => array('Jquery')); 

public $components = array(
    'Session', 
    'Auth' => array(
     'autoRedirect' => false, 
     'authorize' => 'Controller' 
    ) 
); 

public function beforeFilter() { 
    $this->Auth->allow('index', 'view', 'edit', 'display', 'featured', 'events', 'contact', 'signup', 'search', 'view_category', 'view_archive', 'addComment', 'schedule', 'login'); 
} 

}

और यहाँ है मेरी UsersController कि काम कर रहा है:

class UsersController extends AppController { 

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array(
       'userModel' => 'User', 
       'fields' => array(
        'username' => 'username', 
        'password' => 'password' 
       ) 
      ) 
     ), 
     'loginRedirect' => array('controller' => 'users', 'action' => 'admin'), 
     'logoutRedirect' => array('controller' => 'pages', 'action' => 'index'), 
     'loginAction' => array('controller' => 'users', 'action' => 'login'), 
     'sessionKey' => 'Admin' 
    ) 
); 


public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow('add', 'login', 'logout'); 
} 

function isAuthorized() { 
    return true; 
} 

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      $this->redirect($this->Auth->redirect()); 
     } else { 
      $this->Session->setFlash(__('Invalid username or password, try again')); 
     } 
    } 
} 

public function logout() { 
    $this->Session->destroy(); 
    $this->redirect($this->Auth->logout()); 
} 

यहां मेराहैकोड है जो काम नहीं कर:

class PhysiciansController extends AppController { 

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array(
       'userModel' => 'Physician', 
       'fields' => array(
        'username' => 'username', 
        'password' => 'password' 
       ) 
      ) 
     ), 
     'loginRedirect' => array('controller' => 'physicians', 'action' => 'dashboard'), 
     'logoutRedirect' => array('controller' => 'pages', 'action' => 'index'), 
     'loginAction' => array('controller' => 'physicians', 'action' => 'login'), 
     'sessionKey' => 'Physician' 
    ) 
); 

public function beforeFilter() { 
    parent::beforeFilter(); 

    $this->Auth->authorize = array(
     'Actions' => array(
      'userModel' => 'Physician', 
      'actionPath' => 'physicians' 
     ) 
    ); 

    $this->Auth->allow('login', 'logout'); 
// $this->Session->write('Auth.redirect','/physicians/index'); 
} 

function isAuthorized() { 
    return true;  
} 

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      $this->redirect(array('controller' => 'physicians', 'action' => 'dashboard')); 
     } else { 
      $this->Session->read(); 
      debug($this->Auth); 
      $this->Session->setFlash(__('Invalid username or password, try again')); 
     } 
    } 
} 

public function logout() { 
    $this->Session->destroy(); 
    $this->redirect($this->Auth->logout()); 
} 

मैं वास्तव में नहीं है से शुरुआत करने और एसीएल के लिए स्विच करना चाहते हैं - मुझे यकीन है कि सिर्फ दो लॉगिन के लिए आवश्यक है नहीं कर रहा हूँ। मदद बहुत सराहना की जाएगी!

संपादित करें: नीचे जोशुआ का जवाब अद्भुत और बहुत उपयोगी है। मैंने इसे कार्यान्वित किया, लेकिन जब भी मैं चिकित्सक के रूप में/भौतिक/भौतिक/लॉगिन (उपसर्ग/नियंत्रक/क्रिया) के माध्यम से लॉगिन करने की कोशिश करता हूं, तब भी मुझे अनधिकृत त्रुटि मिल रही है। व्यवस्थापक सेटअप महान काम करता है।

object(AuthComponent) { 
    components => array(
    (int) 0 => 'Session', 
    (int) 1 => 'RequestHandler' 
) 
authenticate => array(
    'Form' => array(
     'userModel' => 'Physician' 
    ) 
) 
authorize => false 
ajaxLogin => null 
flash => array(
    'element' => 'default', 
    'key' => 'auth', 
    'params' => array() 
) 
loginAction => array(
    'controller' => 'physicians', 
    'action' => 'phys_login' 
) 
loginRedirect => null 
logoutRedirect => '/' 
authError => 'You are not authorized to access that location.' 
allowedActions => array() 
request => object(CakeRequest) { 
    params => array(
     'prefix' => '*****', 
     'plugin' => null, 
     'controller' => 'physicians', 
     'action' => 'phys_login', 
     'named' => array(), 
     'pass' => array(), 
     'phys' => true, 
     '_Token' => array(
      'key' => 'ad1ea69c3b2c7b9e833bbda03ef18b04079b23c3', 
      'unlockedFields' => array() 
     ), 
     'isAjax' => false 
    ) 
    data => array(
     'Physician' => array(
      'password' => '*****', 
      'username' => 'deewilcox' 
     ) 
    ) 
    query => array() 
    url => 'phys/physicians/login' 
    base => '' 
    webroot => '/' 
    here => '/phys/physicians/login' 
} 
response => object(CakeResponse) { 

} 
settings => array() 

}

उत्तर

19

ठीक मैं यह करने के लिए एक रास्ता मिल गया है: जब मैं प्रवेश करने की कोशिश यहाँ डिबग कोड है। आप उपसर्ग रूटिंग के बारे में जानते हैं? यदि नहीं, तो मेरा उत्तर यहां पढ़ें: CakePHP/MVC Admin functions placement वह उत्तर वर्णन करता है कि एकल रूटिंग उपसर्ग ('व्यवस्थापक') कैसे सेट अप करें। लेकिन आप किसी भी संख्या हो सकती है - सिर्फ इस तरह:

Configure::write('Routing.prefixes', array('admin','phys','member','user')); 
// now we have admin, phys, member and user prefix routing enabled. 

आप क्या कर सकते सभी डॉक्टर के तरीकों का उपयोग 'व्यवस्थापक' उपसर्ग मार्ग है, और सभी चिकित्सकों के तरीकों 'Phys' उपसर्ग मार्ग का उपयोग करें।

तो नीचे दिया गया कोड मैंने बहुत जल्दी से हैक किया है, इसलिए यह सही नहीं हो सकता है लेकिन यह अवधारणा को दिखाना चाहिए।यहाँ यह अपने अनुप्रयोग नियंत्रक के पहले फिल्टर विधि के लिए छद्म कोड में है:

App::uses('Controller', 'Controller'); 

class AppController extends Controller { 

    public $components = array('Security','Cookie','Session','Auth','RequestHandler'); 
    public $helpers = array('Cache','Html','Session','Form'); 

    function beforeFilter() { 

     if ($this->request->prefix == 'admin') { 
      $this->layout = 'admin'; 
      // Specify which controller/action handles logging in: 
      AuthComponent::$sessionKey = 'Auth.Admin'; // solution from https://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session 
      $this->Auth->loginAction = array('controller'=>'administrators','action'=>'login'); 
      $this->Auth->loginRedirect = array('controller'=>'some_other_controller','action'=>'index'); 
      $this->Auth->logoutRedirect = array('controller'=>'administrators','action'=>'login'); 
      $this->Auth->authenticate = array(
       'Form' => array(
        'userModel' => 'User', 
       ) 
      ); 
      $this->Auth->allow('login'); 

     } else if ($this->request->prefix == 'phys') { 
      // Specify which controller/action handles logging in: 
      AuthComponent::$sessionKey = 'Auth.Phys'; // solution from https://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session 
      $this->Auth->loginAction = array('controller'=>'users','action'=>'login'); 
      $this->Auth->logoutRedirect = '/'; 

      $this->Auth->authenticate = array(
       'Form' => array(
        'userModel' => 'Physician', 
       ) 
      ); 
     } else { 
      // If we get here, it is neither a 'phys' prefixed method, not an 'admin' prefixed method. 
      // So, just allow access to everyone - or, alternatively, you could deny access - $this->Auth->deny(); 
      $this->Auth->allow();   
     } 
    } 

    public function isAuthorized($user){ 
     // You can have various extra checks in here, if needed. 
     // We'll just return true though. I'm pretty certain this method has to exist, even if it just returns true. 
     return true; 
    } 

} 

नोट लाइनों:

if (USER IS TRYING TO ACCESS AN ADMIN PREFIXED METHOD) { 
    Then use the users table for auth stuff 
} else if (USER IS TRYING TO ACCESS A PHYS PREFIXED METHOD) { 
    Then use the physicians table for auth stuff 
} else { 
    It's neither an admin method, not a physicians method. So just always allow access. Or always deny access - depending on your site 
} 

यहाँ मेरी एप्लिकेशन नियंत्रक कोड है

AuthComponent::$sessionKey = 'Auth.Admin'; // solution from https://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session 

और

AuthComponent::$sessionKey = 'Auth.Phys'; // solution from https://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session 

क्या यह एक व्यक्ति को एक दूसरे के सत्र में हस्तक्षेप किए बिना, एक ब्राउज़र में एक चिकित्सक, और एक व्यवस्थापक दोनों के रूप में लॉग इन करने की अनुमति देता है। आपको लाइव साइट में इसकी आवश्यकता नहीं हो सकती है, लेकिन परीक्षण के दौरान यह निश्चित रूप से आसान है।

अब, आप संबंधित नियंत्रक हैं, आपको उपयुक्त उपसर्ग के साथ सीधे-आगे लॉगिन/लॉगआउट विधियों की आवश्यकता होगी।

तो, व्यवस्थापक लगाकर के लिए, अपने उपयोगकर्ताओं नियंत्रक:

public function admin_login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      return $this->redirect($this->Auth->redirect()); 
     } else { 
      $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth'); 
     } 
    } 
} 

public function admin_logout() { 
    $this->Session->setFlash('Successfully Logged Out'); 
    $this->redirect($this->Auth->logout()); 
} 

और अपने चिकित्सकों नियंत्रक में:

public function phys_login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      return $this->redirect($this->Auth->redirect()); 
     } else { 
      $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth'); 
     } 
    } 
} 

public function phys_logout() { 
    $this->Session->setFlash('Successfully Logged Out'); 
    $this->redirect($this->Auth->logout()); 
} 

जैसा कि मैंने कहा, सभी कोड मैं एक साथ बहुत जल्दी से काट दिया, इतना है कि यह शायद वर्बैटिम काम नहीं कर सकता है, लेकिन यह अवधारणा को दिखाना चाहिए। अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।

+0

धन्यवाद इस के लिए बहुत बहुत - आप रॉक। मैंने आज लागू किया और व्यवस्थापक उपसर्ग और उपयोगकर्ता नियंत्रक के साथ कोई परेशानी नहीं है। हालांकि, चिकित्सक नियंत्रक अभी भी मुझे वही "आप अधिकृत नहीं हैं" त्रुटि दे रहा है। तो वास्तव में कुछ भी नहीं बदला। अगर मैं मदद करता हूं तो मैं उपरोक्त डीबग कोड पोस्ट करूंगा। – deewilcox

+0

तो क्या आपको 'अमान्य उपयोगकर्ता नाम या पासवर्ड मिल रहा है, पुनः प्रयास करें' या आप इसे बिल्कुल नहीं प्राप्त कर रहे हैं, और केवल 'आप उस स्थान तक पहुंचने के लिए अधिकृत नहीं हैं'। यही कहना है, क्या आपका "अगर ($ यह-> एथ-> लॉगिन()) {" पास है, और फिर आपको केवल लॉगिन-लॉगिन रीडायरेक्ट पर कोई समस्या है? या वह लाइन असफल हो जाती है? –

+0

मुझे "आप अधिकृत नहीं हैं" त्रुटि मिलती है। अगर मैं '($ this-> अनुरोध-> डेटा) पास करता हूं, तो यह काम करता है। मैंने '$ this-> Auth-> लॉगिन ($ this-> request-> डेटा) के साथ एक अमान्य उपयोगकर्ता नाम और पासवर्ड का उपयोग करके परीक्षण किया; ', और उपयोगकर्ता नाम या पासवर्ड गलत होने पर लॉगिन विफल रहता है (जैसा होना चाहिए)। – deewilcox

0

$this->Session->write('Auth.redirect','/physicians/index'); 

के बजाय का उपयोग करना चाहिए

setcookie("keys", value); 
संबंधित मुद्दे