Ecco una struttura (fittizia) (mi dispiace, so di non avere una forte immaginazione) che assomiglia alla struttura della mia domanda: (Person, SuperPerson e NormalPerson sono astratti):
Mi chiedo se posso assegnare ruoli a ogni classe (così tutte le istanze di questa classe otterranno questi diritti) usando la sicurezza di primavera in Grails.
risposte:
1 per risposta № 1No, Spring Security assegna i ruoli all'istanza, non al livello di classe.
Esistono due modi per concedere le autorizzazioni (autorizzazioni):
- Concedi direttamente a un principio (utente)
- Concederli a un gruppo (ruolo), quindi aggiungere i principi ai gruppi contenenti le autorità necessarie.
Quindi, nel tuo caso, puoi adottare l'approccio basato sui ruoli e far rappresentare ciascuna classe da un ruolo. Quindi, quando si crea un'istanza di una classe, aggiungerla al ruolo appropriato.
Esempio di utilizzo di un servizio per concedere autorizzazioni
class PersonService {
private Map authorityGroups = [
Person: ["Person"],
NormalPerson: ["Person", "NormalPerson"],
Employee: ["Person", "NormalPerson", "Employee"],
...
]
Person create(Class klass, Map props) {
def person = klass.newInstance(props)
def groups = getGroupsForClass(klass)
person.save()
groups.each {
new PersonAuthorityGroup(authorityGroup: it, person: person).save()
}
}
private Collection<AuthorityGroup> getGroupsForClass(Class klass) {
authoritiyGroups[klass.simpleName].collect {
AuthorityGroup.findByName(it)
}
}
}
Il servizio può quindi essere utilizzato in questo modo:
def a = personService.create(Person, [first: "John", last: "Galt"])
def b = personService.create(SuperPerson, [first: "Jane", last: "Smith"])