2015-10-22 8 views
8

Mein Finder von Auth hat Bedingungen, die ich auf $this->request zugreifen muss, aber ich habe keinen Zugang für das auf UsersTable.Pass zusätzliche Daten zu Finder Auth

AppController ::

$this->loadComponent('Auth', [ 
     'authenticate' => [ 
      'Form' => [ 
       'finder' => 'auth', 
      ] 
     ] 
    ]); 

UsersTable initialisieren

public function findAuth(Query $query, array $options) 
{ 
    $query 
     ->select([ 
      'Users.id', 
      'Users.name', 
      'Users.username', 
      'Users.password', 
     ]) 
     ->where(['Users.is_active' => true]); // If i had access to extra data passed I would use here. 

    return $query; 
} 

gibt ich brauche ein zusätzliches Daten Fom AppController zu finderauth da ich nicht Zugang zu $this->request->data auf UsersTable.

aktualisieren

Menschen auf Kommentare sagen, dass ein schlechtes Design ist so ich genau erklären, was ich brauche.

Ich habe eine Tabelle users aber jeder Benutzer gehört zu einem gym. Die username(email) ist einzigartig nur für eine bestimmte gym, so dass ich eine [email protected] von gym_id 1 und eine weitere [email protected] von gym_id 2 haben kann. Auf Login-Seite habe ich die gym_slug zu auth finder was gym der Benutzer username, die ich gehört gehört zu erzählen.

+0

Das klingt wie möglicherweise schlechtes Design für mich, könnten Sie zeigen, was Sie weitergeben wollten? Es muss möglich sein, als ein Verhalten in irgendeiner Weise obwohl :-) – Spriz

+0

Ich passiere eine Fitness-Studio Slug an der Url, so muss ich die ID des Fitness-Studio basierend auf diesem Slug zu filtern bei Benutzer finden, weil ich 'gym_id' habe Benutzertisch. Ich kann auf den Slug durch 'this -> request-> params ['gym_slug]' zugreifen, aber ich habe keinen Zugang dazu bei 'UsersTable' –

+0

Wir brauchen ein bisschen mehr Informationen, um hier weiterzumachen. Es klingt sowohl von der Frage als auch von den Kommentaren, dass Sie einen Benutzer authentifizieren und dann versuchen, ihn auf die Seite seines Studios umzuleiten. Bearbeiten Sie Ihre Frage und geben Sie genau an, was Sie tun und warum.Sie erwähnen das Fitness-Studio erst im obigen Kommentar und ich bin neugierig, warum Sie die Anfragedaten umleiten müssen (wenn Sie das gerade tun), da Sie die gym_id in derselben Tabelle gespeichert haben. –

Antwort

2

Nach meinem Wissen gibt es keine Möglichkeit, dies in die Konfiguration in 3.1 zu übertragen. Dies könnte eine gute Idee sein, auf dem cakephp git Hub als Feature-Anfrage einzureichen.

Es gibt Möglichkeiten, dies zu tun, indem Sie ein neues Authentifizierungsobjekt erstellen, das die Basisauthentifizierung erweitert und dann _findUser und _query überschreibt. Etwas wie folgt aus:

class GymFormAuthenticate extends BaseAuthenticate 
{ 

/** 
    * Checks the fields to ensure they are supplied. 
    * 
    * @param \Cake\Network\Request $request The request that contains login information. 
    * @param array $fields The fields to be checked. 
    * @return bool False if the fields have not been supplied. True if they exist. 
    */ 
protected function _checkFields(Request $request, array $fields) 
{ 
    foreach ([$fields['username'], $fields['password'], $fields['gym']] as $field) { 
     $value = $request->data($field); 
     if (empty($value) || !is_string($value)) { 
      return false; 
     } 
    } 
    return true; 
} 

/** 
    * Authenticates the identity contained in a request. Will use the `config.userModel`, and `config.fields` 
    * to find POST data that is used to find a matching record in the `config.userModel`. Will return false if 
    * there is no post data, either username or password is missing, or if the scope conditions have not been met. 
    * 
    * @param \Cake\Network\Request $request The request that contains login information. 
    * @param \Cake\Network\Response $response Unused response object. 
    * @return mixed False on login failure. An array of User data on success. 
    */ 
public function authenticate(Request $request, Response $response) 
{ 
    $fields = $this->_config['fields']; 
    if (!$this->_checkFields($request, $fields)) { 
     return false; 
    } 
    return $this->_findUser(
     $request->data[$fields['username']], 
     $request->data[$fields['password']], 
     $request->data[$fields['gym']], 
    ); 
} 

/** 
    * Find a user record using the username,password,gym provided. 
    * 
    * Input passwords will be hashed even when a user doesn't exist. This 
    * helps mitigate timing attacks that are attempting to find valid usernames. 
    * 
    * @param string $username The username/identifier. 
    * @param string|null $password The password, if not provided password checking is skipped 
    * and result of find is returned. 
    * @return bool|array Either false on failure, or an array of user data. 
    */ 
protected function _findUser($username, $password = null, $gym = null) 
{ 
    $result = $this->_query($username, $gym)->first(); 

    if (empty($result)) { 
     return false; 
    } 

    if ($password !== null) { 
     $hasher = $this->passwordHasher(); 
     $hashedPassword = $result->get($this->_config['fields']['password']); 
     if (!$hasher->check($password, $hashedPassword)) { 
      return false; 
     } 

     $this->_needsPasswordRehash = $hasher->needsRehash($hashedPassword); 
     $result->unsetProperty($this->_config['fields']['password']); 
    } 

    return $result->toArray(); 
} 

/** 
    * Get query object for fetching user from database. 
    * 
    * @param string $username The username/identifier. 
    * @return \Cake\ORM\Query 
    */ 
protected function _query($username, $gym) 
{ 
    $config = $this->_config; 
    $table = TableRegistryget($config['userModel']); 

    $options = [ 
     'conditions' => [$table->aliasField($config['fields']['username']) => $username, 'gym' => $gym] 
    ]; 

    if (!empty($config['scope'])) { 
     $options['conditions'] = array_merge($options['conditions'], $config['scope']); 
    } 
    if (!empty($config['contain'])) { 
     $options['contain'] = $config['contain']; 
    } 

    $query = $table->find($config['finder'], $options); 

    return $query; 
} 
} 

Für weitere Informationen sehen: Creating Custom Authentication Objects

+1

Arbeitete zu mir, es ist eine Schande, ich konnte Ihnen die Prämie nicht geben, bevor es abläuft –

+0

Es ist ganz in Ordnung! Irgendetwas, um einem Mitentwickler zu helfen! – chrisShick

1

Ich weiß, dass dies eine alte Frage, aber ich dachte, ich würde den Finder poste ich in einem unserer SaaS-Anwendungen auf CakePHP gebaut bin mit 3 Es folgt DRY usw. wahrscheinlich nicht. Um zu sagen, dass alles auf X oder Y Weise gemacht werden kann ..... muss man immer die Regeln verbiegen. In diesem Fall wird auf die URL abhängig (xdomain.com oder ydomain.com) unsere App herausfindet, wer der Kunde ist, und ändert Layouts etc. Auch der Benutzer gebunden basiert & SITE_ID viel wie das Ihre

public function findAuth(\Cake\ORM\Query $query, array $options) { 
    $query 
      ->select([ 
       'Users.id', 
       'Users.email', 
       'Users.password', 
       'Users.site_id', 
       'Users.firstname', 
       'Users.lastname']) 
      ->where([ 
       'Users.active' => 1, 
       'Users.site_id'=> \Cake\Core\Configure::read('site_id') 
      ]); 

    return $query; 
} 

Auf jeden Fall zu den zu Favoriten hoffe, es hilft jemandem

Verwandte Themen