Utilizzo di Prolog per implementare le regole di autorizzazione

3

Sto lavorando su un pseudoframework di gestione degli utenti in PHP, e sto cercando di implementare un'autorizzazione basata su regole ben definite. Sto usando una combinazione di funzioni SQL e condition-checking scritte in PHP in questo momento, ma non sono completamente soddisfatto. Funziona, ma non è molto elegante e soffre di alcune limitazioni.

Prolog è completo per Turing, quindi mi viene in mente che qualsiasi regola di autorizzazione arbitraria potrebbe essere implementata in questo modo. Ad esempio:

in_group("Alice","admin").
in_group("Alice","user").
in_group("Bob","user").
in_group("Carlos","admin").
in_group("Carlos","user").
allowed("delete_user",X,Y):-    in_group(X,"admin"),
                                not(in_group(Y,"admin")).

In pratica dice "Permetti all'utente X di cancellare l'utente Y se X è un amministratore e Y non lo è."

Le mie domande sono fondamentalmente:

  1. I problemi di scalabilità emergono ancora nelle moderne implementazioni di Prolog?
  2. In che modo questi problemi potrebbero essere complicati dal modo in cui le persone utilizzano in genere le applicazioni Web?
  3. Quali sono i rischi di compromettere la sicurezza a causa delle "conseguenze indesiderate" di alcuni costrutti Prolog?
  4. Quanto sarà difficile farlo per le persone prive del background di Prolog per modificare le regole di autorizzazione? L'esempio sopra mi sembra semplice, ma cosa succede se ci sono migliaia di regole?

Se Prolog non è la migliore idea per questa situazione, ci sono altri linguaggi di programmazione logica che potrebbero essere più adatti?

Ho letto questo post: Perché non vengono scritti i motori di regole Prolog? , ma quella domanda sembra riguardare i motori delle regole in generale, non le regole di autorizzazione in particolare.

    
posta alexw 11.12.2014 - 20:27
fonte

2 risposte

1

Anche se questo potrebbe funzionare, potrebbe essere un po 'eccessivo.

  1. Will issues in scalability still arise in modern Prolog implementations?

Attenzione alle stringhe. In alcune implementazioni, il codice generato per l'interrogazione di in_group/2 genererà molte ramificazioni, come in if "Alice" then ... else if "Bob" ... .

Sostituisci le virgolette con virgolette singole e hai gli atomi, che portano a query basate sulla tabella hash. A meno che tu non voglia complicare le cose, hai nomi e ruoli in ASCII (se puoi).

Alcune implementazioni hanno anche thread di lavoro, se vuoi avere più query in parallelo.

  1. How would these issues be complicated by the way that people typically use web applications?

Questo non dovrebbe avere importanza.

  1. What are the risks of compromising security due to the "unintended consequences" of some Prolog constructs?

Bene, puoi tornare indietro, ma questo è inteso, giusto?

  • in_group(X,Y) ti fornisce tutte le coppie di valori.
  • in_group(N,admin) ti dà tutti gli amministratori.
  • in_group(N,admin),in_group(N,user) indica l'intersezione di utenti e amministratori.
  • in_group(N,X),member(X,[admin,user]) invece dà l'unione.

Conseguenze non volute sono sinonimo di errori di programmazione qui, assumendo che tu capisca la lingua. In caso di problemi con nomi di variabili o errori di battitura, si potrebbe avere un'eccezione in fase di esecuzione: in genere non si esce dall'ambiente di esecuzione (anche se si esegue lo stack overflow perché è stato scritto un predicato infinitamente ricorsivo), ma non è possibile rispondere a ulteriori richieste. È lo stesso di qualsiasi linguaggio dinamico.

How difficult will this make it for people without a Prolog background to modify authorization rules? The above example looks straightforward to me, but what if there are thousands of rules?

Se non inserisci il nome tra virgolette e le inizi con una lettera maiuscola, queste sono variabili: avrai le conseguenze indesiderate che hai menzionato.

Forse puoi provare a insegnare e fidarti delle persone che modificheranno il tuo file (ma compilare e testare le tue query prima della distribuzione).

Altrimenti, fagli usare query "di livello superiore" che controllano gli input e producono predicati (cioè predicati dinamici o compile_term).

    
risposta data 12.12.2014 - 11:52
fonte
1

Un quadro molto migliore per questo genere di cose è Drools . Usa un algoritmo molto efficiente per cercare regole che si applicano a un dato insieme di fatti. È un sistema basato su Java, quindi non devi necessariamente usarlo nel tuo programma, ma dovresti studiarlo per vedere cosa puoi imparare su come lo fanno i professionisti.

Tutto ciò detto, credo che tu stia aprendo la tua applicazione a un mondo di angoscia. Avere molte e diverse dichiarazioni frammentarie sulla sicurezza e l'accessibilità crea un mondo da incubo in cui è estremamente facile specificare regole che consentano ai camion di grandi dimensioni di entrare e rubare le tue cose o, quasi altrettanto male, wall off di un sistema che non è accessibile dalle persone che hanno bisogno di accedervi, in un catch-22 computer-driven.

    
risposta data 12.12.2014 - 06:58
fonte

Leggi altre domande sui tag