2012-03-27 5 views
0

S'il vous plaît garder avec moi, comme je suis un noob programmation/cakephp, mais je ne sais pas comment restreindre l'accès de l'utilisateur à d'autres données de l'utilisateur. Lorsqu'un utilisateur se connecte, il obtient un tableau de bord de ses annonces (qui proviennent de plusieurs modèles ... restaurants, hôtels, parcours de golf, images pour chaque annonce, informations de localisation, coupons, etc.). Selon le modèle/contrôleur, je pourrais avoir un utilisateur '3' (qui a des listes d'hôtels) tapez dans la barre de navigateur/restaurants/éditer/1 et modifier les informations de restaurant de l'utilisateur '17' qui a un restaurant avec ID = '1'. Pire, ils peuvent même accéder à/users/dashboard/17. Comment limiter un utilisateur à accéder uniquement à ses propres données? J'espérais qu'il y avait une sorte de partie 'beforeAllow()' de l'AuthComponent que je pourrais utiliser dans AppController qui vérifie l'identifiant de l'utilisateur et les renvoie vers leur tableau de bord s'ils essaient d'exécuter une action CRUD sur les données des autres utilisateurs.utilisateur connecté peut accéder aux données des autres utilisateurs

Même si j'utilisais ACL (je sais que je devrais mais c'est franchement un peu trop sur ma tête à ce stade de l'apprentissage), je devrais encore connaître le bon code pour limiter l'accès utilisateur, correct?

Ci-dessous mon AppController:

class AppController extends Controller { 

public $components = array(
    'Session', 
    'Auth' => array(
     'loginRedirect' => array('controller' => 'users', 'action' => 'view'), 
     'logoutRedirect' => array('controller' => 'docs', 'action' => 'index'), 
     'authError' => 'Sorry, you are not authorized to view this page.' 
    ) 
); 


function beforeFilter() { 



    $this->Auth->userModel = 'User'; 
    $this->Auth->allow('join_now','debug','index', 'condos', 'houses', 'hotels_and_motels', 'print_all_coupons', 'print_coupon', 'search', 'golf', 'charters', 'events', 'nightlife', 'shopping', 'visitors_info', 'contact_us', 'view', 'results'); 

} 


} 

et voici une fonction d'édition de l'échantillon (la fonction d'édition de mon UnitsController):

function edit($id) { 
    $this->set('title', 'Edit your property'); 
    $this->Unit->id = $id; 

    if (empty($this->request->data)) {   
     $this->request->data = $this->Unit->read();  
} else { 

    if ($this->Unit->saveAll($this->request->data)) { 

     $this->Session->setFlash('Your property has been updated.', 'success'); 

    } 
} 
} 

je vais dire que chacun de mes tables db a un champ user_id afin que l'utilisateur connecté puisse correspondre à l'id_utilisateur de chaque modèle.

Je pensais que this SO question était ce que je cherchais, mais ils ont fini par descendre sur une tangente et n'ont jamais répondu à la question initiale de l'utilisateur a demandé.

Répondre

1

Si vous utilisiez cakes acl et auth, alors non, vous n'auriez pas à écrire un tas de code, en vérifiant les identifiants utilisateur pour chaque action, mais vous auriez à écrire le code pour lier les acl . Vous diriez au composant que votre contrôleur et vos actions requièrent des privilèges acl. Et il ne fait pas les recherches dans les tables aros et acos pour s'assurer que votre objet demandant le contenu a les autorisations appropriées.

Je vous recommande de prendre HAUTEMENT un oeil à la tutorial et de déterminer comment le faire fonctionner

Si vous ne passez pas par la route, alors vous devrez ajouter le contrôle à toutes les actions que les charges contenu dépendant. Fondamentalement, quand une action est demandée, l'objet est présenté, puis l'utilisateur est associé à cet objet et vérifie si l'identifiant de l'utilisateur est identique à celui de l'objet.

if ($this->Unit->User->uid != $this->Session->User->uid) { 
    throw new NotFoundException('Could not find that Unit'); 
} else { 
    ... 
} 

L'autre chose que vous pouvez faire, pour les pages qui sont les mêmes, mais personnalisés, n'est pas utiliser l'URL /user/dashboard/17 et au lieu simplement utiliser /user/dashboard puis dans l'action du tableau de bord, tirez l'ID utilisateur à partir des données de session et charger le profil pour l'utilisateur qui est authentifié

+0

Je savais que j'allais obtenir plusieurs réponses «non, sérieusement utiliser le composant ACL», heh heh. (Insérez un autre 'le manuel du gâteau est terrible' commentaire) Honnêtement, je suis d'accord, je n'avais aucune idée de comment étrangler une action basée sur l'identifiant de l'utilisateur connecté, votre code ci-dessus est à peu près ce que je cherchais . JE VOUS REMERCIE! – huzzah

1

Je pense que vous devrez utiliser l'autorisation CRUD pour ajouter des actions EditOwn. La réponse décrite dans CakePHP ACL Database Setup: ARO/ACO structure? gère une grande partie de la logique dont vous avez besoin.

Veuillez noter que la solution n'est toujours pas complète et que vous aurez accès à des actions qui peuvent rendre les données d'autres utilisateurs. Exemple: méthodes d'indexation d'échafaudage. Pour restreindre l'accès aux données d'autres utilisateurs ici, vous pouvez modifier la requête pour ajouter des filtres en fonction de l'ID utilisateur que vous avez reçu de Session.

Questions connexes