Domanda

Sto costruendo una webapp con controllo degli accessi in base al ruolo usando la sicurezza di Acegi (Spring). Quindi ho diversi utenti con ruoli: ROLE_ADMIN , ROLE_USER ed ecc.
Tuttavia, devo implementare vari vincoli utente.

Consideriamo un esempio:

  

Supponiamo che esista un sito in cui gli utenti possono guardare film online. Ci sono utenti con ruoli ROLE_STANDARD_USER e ROLE_VIP_USER . Gli utenti standard possono guardare 3 film a settimana e gli utenti VIP possono guardare 10 film a settimana e avere altri privilegi. E c'è un utente nel gruppo di utenti standard a cui voglio dare altri 2 film a settimana. Il numero di film consentiti può talvolta cambiare.
  Inoltre, ci sono varie categorie di film: fantasy, commedia, classici, nuovi film ecc. E voglio che alcuni utenti, indipendentemente dal loro ruolo, abbiano accesso solo a determinate categorie. Le categorie possono essere create e rimosse in modo dinamico.

Esistono pratiche standard per l'implementazione di questo tipo di vincoli utente?
Può / dovrebbe essere fatto usando i ruoli e le autorizzazioni di Spring Security?
O devo considerare di aggiungere un motore basato su regole alla mia app?

Grazie.

Modifica
L'esempio sopra è immaginario, il mio progetto riguarda la concessione di accesso remoto a varie apparecchiature di rete (e altre) per gli studenti. Tuttavia, è probabile che i tipi di vincoli utente siano gli stessi.
Sfortunatamente, il modello per l'accesso degli utenti & amp; i vincoli non sono completi e stabili. Nel prossimo futuro mi potrebbe essere detto di implementare vari vincoli aggiuntivi per gli utenti, che non sono noti ora.
Quindi vorrei selezionare ora un percorso che faciliterà l'aggiunta o la modifica di nuovi vincoli utente in futuro e non richiederebbe una revisione significativa del modello interno o della struttura del database. Se possibile,

Modifica 2

Attualmente, i vincoli utente di base sono codificati (rimanenti dal sistema di prototipazione). Immagino che proverò prima a eseguire il refactoring su una sorta di oggetti parametrizzati di servizi aziendali e poi penserò dove posso andare da lì. Prenderò anche in considerazione l'utilizzo dei responsabili delle decisioni sull'autorizzazione della sicurezza primaverile.

Grazie per tutti i suggerimenti!

È stato utile?

Soluzione

Non mi aspetterei che un sistema di sicurezza basato sul ruolo dichiarativo dia il controllo accurato che stai cercando. Ne hai già descritte alcune "regole aziendali" controlli di accesso basati che desideri implementare e potremmo aspettarci che nel tempo tali regole diventeranno più complesse. Quindi hai bisogno di una combinazione di informazioni dal sottosistema di sicurezza (chi è l'utente per questa richiesta? Quali ruoli hanno?) Ma poi combinalo programmaticamente con i dati e le regole aziendali (questo utente ha diritto a 2 film gratuiti se la data di oggi è in questo intervallo).

Almeno definirei i servizi in cui incapsulo quella logica aziendale. La decisione se utilizzare un motore di regole completo dovrebbe essere ulteriormente studiata.

Altri suggerimenti

Prima di chiedertelo, Acegi (o un motore di regole, ecc.) è il posto giusto per farlo, penso che sia necessario

analizza le tue esigenze in modo preciso e completo .

Considerando ogni argomento ( per esempio, limiti al film che possono essere visti ), ci sono molti modi per implementarlo e devi fare delle scelte funzionali. Non può esserci un'implementazione corretta se non hai già deciso in dettaglio cosa deve essere fatto!

Esempio di modello per le tue esigenze:

  • Limita il numero di film generali a settimana in base alla somma di :
    • ruolo (3 o 10)
    • bonus per utente (impostazione predefinita 0 se non menzionato)
  • Aggiorna questi numeri secondo necessità
  • Limita i filmati a un elenco di categorie:
    • se viene specificato un elenco per l'utente, utilizzalo
    • altrimenti, utilizzare l'elenco fornito per il ruolo

Questo esempio ha molte implicazioni, che possono essere corrette o inaccettabili nel tuo caso.
Implicazioni:

  • dopo aver aggiornato un numero, il limite viene modificato immediatamente.
  • non c'è memoria dei limiti settimanali, non si può chiedere questo per il passato (per fare statistiche per esempio)
  • ...

Supponendo che questo modello non soddisfi le tue esigenze, stai affrontando il duro lavoro di creare un modello che si adatti davvero a loro. Solo una volta che ce l'hai, pensa all'implementazione.

Se consideri Spring Security, questo è un modo in cui vedo che puoi implementare la tua soluzione. Implementare un AccessDecisionVoter per decidere l'accesso dell'utente. Dai un'occhiata alla fonte di riferimento qui

Guarda anche il [javadoc] [2] per AccessDecisionVoter . Puoi implementare le tue regole implementando il metodo voto .

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Lascia che Spring gestisca l'accesso (Autenticazione e autorizzazione). Se il processo decisionale diventa complicato, un motore di regole potrebbe essere saggio. Consenti al metodo di voto di chiamare un motore di regole. Ciò fornisce una chiara separazione del dovere. Lascia che Spring Security gestisca l'accesso e consenti al motore delle regole di calcolare le regole.

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote (org.springframework.security.Authentication , java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

Sembra che tu abbia esigenze di autenticazione e di autorizzazione: molte volte le persone confondono e / o si uniscono. Per fortuna Spring Security delinea molto bene i due. L'utente eseguirà l'autenticazione tramite la catena di sicurezza (sia esso logj, openID, SSL X509) e, una volta terminato, sarà autorizzato dai votanti specifici dell'azienda (nei AccessDecisionManagers) a decidere se hanno già visto il loro numero assegnato di film. Se è necessario aggiungere una nuova logica aziendale in un secondo momento, si tratta semplicemente di scrivere nuovi / più elettori e di iniettarli nel proprio Manager.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top