2010-12-05 5 views
1

Je souhaite que certaines actions soient disponibles uniquement pour les utilisateurs connectés. J'ai essayé de limiter certains par ce code:Limiter certaines actions, fonction _remap, CodeIgniter

function _remap($method) 
    { 
     $restricted = array('update_rating', 'delete_post'); 
     if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
     { 
      echo 'Log in, please'; 
     } 
     else { 
      $this->$method(); 
     } 
    } 

Mais $ this -> méthode $() n'a pas reçu des paramètres qui a été envoyé dans l'URL. Que faire? Je souhaite que certaines actions soient disponibles uniquement pour les utilisateurs connectés.

+0

'_remap' est une fonction spéciale pour modifier la fonction d'appel d'une url ... si vous voulez restreindre l'accès à une fonction via une URL, alors vous devez ajouter un trait de soulignement' _foo ($ vars) '- cela peut être appelé seulement dans votre contrôleur (pas via l'url). clarifier peut-être? votre code a l'air ok. Dans ce qui précède, quelle que soit la fonction appelée, '_remap' va comparer ce qui a été demandé et tenter de l'appeler en fonction de votre condition. – Ross

+0

Non, je veux faire certaines fonctions autorisées uniquement pour les utilisateurs connectés. – Kir

Répondre

2

Pour limiter les utilisateurs enregistrés pour une chose toute utilisation du contrôleur comme:

function __construct(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

Ou faire la même chose si vous avez besoin de restreindre une méthode spécifique:

function restricted_function(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

Cela nécessite la présence d'une variable is_logged_in avant l'appel du contrôleur.

J'utilise un MY_controller qui vérifie une session connectée dont tous les contrôleurs héritent.

1

Vous ne lui avez envoyé aucun paramètre.

Vous devez donner tous les paramètres dont vous avez besoin pour évaluer la méthode $.

function _remap($method) 
{ 
    $restricted = array('update_rating', 'delete_post'); 
    if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
    { 
     echo 'Log in, please'; 
    } 
    else 
    { 
     $params = get_func_get_args(); 
     $this->$method($params); 
    } 
} 

Notez que les méthodes recevraient maintenant et tableau des paramètres.

+0

Bonne idée! Donc, il n'y a aucun moyen de travailler avec des arguments de fonctions régulières sans tableau de paramètres? – Kir

+0

Excusez-moi, pouvez-vous m'aider? – Kir

2

Idéalement, vous ne devriez pas utiliser ce modèle de développement pour créer une connexion utilisateur. Vous devriez simplement faire la vérification dans le constructeur de la classe que vous appelez, et utiliser la méthode $ this-> router-> pour voir à quelle méthode l'utilisateur tente d'accéder. Vérifiez cela par rapport à un tableau de méthodes nécessitant une connexion, puis vérifiez si l'utilisateur est connecté ou non. Si l'une des conditions est fausse, rediriger vers la page de connexion, ou bien continuer l'exécution de l'appel. la mise en œuvre de l'échantillon ci-dessous:

Class XYZ extends Controller{ 

    function __construct() { 
     parent::controller(); 
     $protected_methods = array('method_1', 'method_2'); 

     if(in_array($this->router->method, $protected_methods)){ 
      // check if user is logged in 
      if(!$this->session->userdata('logged_in')) 
       redirect('/login'); 
     } 
    } 

} 
Questions connexes