Exclusão de atributos em Lazy Fetching
26/10/2011 22:40
0
Olá, pessoal.

Estou utilizando o plugin do Acegi e adaptando a tela de registro de usuário. Uma coisa que não encontrei no plugin e estou tentando implementar é a exclusão de um Usuário (User) que já esteja associado à um perfil (Role).

As classes estão assim:

class User {
String userId
String password
boolean enabled

static hasMany = [ authorities: Role]
static belongsTo = Role
}


class Role {
String description
String authority

static hasMany = [people: User]
}


O modelo acima gera uma outra tabela no banco de dados, chamada "role_people" que gerencia esse relacionamento através do id de cada entidade.
Sei que posso iterar para descobrir quais usuarios estão associados a determindo perfil desta forma:

def role = Role.get(1)
role.people.each {
println it.userId
}

Mas se eu der um comando no CRUD de Usuario dessa forma:

def user = User.get(1)
user.delete()

Recebo um erro de integridade do Spring, devido ao modelo de associação.

O que devo fazer? Alguém já trabalhou com o Acegi e teve que criar telas para o administrador do sistema tratar esses casos?

Obrigado!
Tags: acegi, lazy fetching, modelagem, plugin


0
Você não pode excluir uma role pois esta pode ter outros usuários que estão vinculados a ela.
Pode ser feito a exclusão usando um "each" antes de deletar o usuário e excluir todas as Roles pertencentes a esse User primeiro, mas isso não parece ser a solução adequada. Acho que a exclusão do usuário não pode ser feita em cascata.
27/10/2011 10:47


0
Olá, Castiel.

Isso significa que se o administrador desejar excluir um User que não vá mais acessar o sistema ele não pode??

Vi que no controller default do Acegi não existe a closure delete...

Teria um exemplo dessa exclusão utilizando o each?

Obrigado!
27/10/2011 12:36


1
Olá CarlosG.

Qual versão do Acegi você está utilizando?

Eu utilizo o Acegi e ele gera automaticamente (no controller e na view) a opção para deletar o usuário.

No PersonController você encontra o código que permite a exclusão do usuário e sua respectiva role:


/**
* Person delete action. Before removing an existing person,
* he should be removed from those authorities which he is involved.
*/
def delete = {

def person = Person.get(params.id)
if (person) {
def authPrincipal = authenticateService.principal()
//avoid self-delete if the logged-in user is an admin
if (!(authPrincipal instanceof String) && authPrincipal.username == person.username) {
flash.message = "You can not delete yourself, please login as another admin and try again"
}
else {
//first, delete this person from People_Authorities table.
Authority.findAll().each { it.removeFromPeople(person) }
person.delete()
flash.message = "Person $params.id deleted."
}
}
else {
flash.message = "Person not found with id $params.id"
}

redirect action: list
}
27/10/2011 13:16


0
CarlosG não entendi corretamente a sua pergunta, achei que vc queria deletar as roles junto,
sobre o código do each não vai ser necessário então, e o arisales enviou um exemplo para o acegi.
27/10/2011 13:32


0
Olá, pessoal...

Após a instalação do Acegi, instalei o plugin de registro com esse comando:
grails generate-registration


Ele gerou o controller "RegisterController" apenas. Mas nenhuma tela de CRUD foi criada para User e Role... Por isso estava quebrando a cabeça. Deixei de fazer alguma coisa?

A minha versão do plugin é a: 0.5.3.2

Obrigado!
27/10/2011 16:20


1
Após instalar o plugin você tem que criar o usuário e as permissões:
grails create-auth-domains Usuario Permissao

Procure por "Acegi" no forum que você irá encontrar diversas discussões sobre o plugin.

Veja também o post http://grailsbrasil.com/post/show/237 em que o Lucastex fez um tutorial do plugin.

27/10/2011 17:27



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto