2012-07-20 13 views
6

applicazione My Mojolicious ha qualche meccanismo di autenticazione personalizzato, che implemento in una condizione di routing chiamata auth_permission:Perché Mojolicious annida i miei percorsi?

$app->add_condition(auth_permission => sub { 
    return is_user_allowed(...) ? 1 : 0; 
}); 

Così i miei percorsi simile a questa:

my $r = $app->routes; 

$r->get('/prefs') 
    # no permission necessary here 
    ->to(...); 

$r->get('/objects') 
    ->over(auth_permission => 'view objects') 
    ->to(...); 

$r->get('/objects/delete/:id') 
    ->over(auth_permission => 'delete objects') 
    ->to(...); 

I to() clausole sono gestiti correttamente: GET /objects mi fornisce l'elenco degli oggetti e GET /objects/delete/42 elimina l'oggetto 42.

Il problema è che il permesso view objects viene verificato per entrambe le richieste, anche se il secondo percorso deve verificare l'autorizzazione delete objects.

Il motivo sembra essere che /objects/delete/42 è un percorso inferiore a /objects. Lo stesso problema non si verifica con la route /prefs, che non ha una base comune con le altre route.

mia soluzione attuale è quella di posizionare la regola per /objectssotto quello per /objects/delete/:id, ma questa è una) unelegant ed è b) andando a rompere quando un altro sviluppatore modifica il file. Posso disattivare esplicitamente il comportamento di nidificazione visto in questo caso?

+2

Questo comportamento mi sembra abbastanza semplice. E la tua cosiddetta soluzione alternativa è una conseguenza logica di come Mojolicious abbina le rotte. IMO hai risposto alla tua domanda. –

risposta

1

I documenti Mojolicious sembrano indicare che si dovrebbe costruire il percorso esteso dall'oggetto che gestisce quello più corto. Vedere la sezione Nested Routes dei documenti.

Ciò significa che si ha un percorso $ oggetti e un percorso $ objects_delete derivato da esso. Elimina i problemi di ordine (oltre a dover dichiarare prima il percorso più breve).

Problemi correlati