Spring Security Plugin e modelos ja existentes
14/07/2012 12:38
0
Pessoal,

Acabei a parte de cadastro da minha aplicação, sendo que para cada um dos usuários (4 tipos) eu tenho 1 tabela no banco.

Bom, ai entra minha dúvida... o Spring Security Plugin me deixou bem confuso, pois ao entrar na documentação do plugin, o pessoal pede para que voce criei um dominio com o script s2-quickstart... tudo bem, dai criei o pacote br.com.app.seguranca, onde as classes Usuario, UsuarioRole e Role foram criadas...

Mas e ai?

Quando dei um runapp o GORM criou essas tabelas no meu banco... mas eu não quero isso, eu ja tenho as tabelas dos meus respectivos usuários...

Como eu devo fazer? criar uma chave para as respectivas tabelas de cada usuário?

Essa classe do Spring Security não deveria ser abstrata, dessa maneira podemos implementa-la nos dominios de cada usuario?

Estou bem perdido nessa etapa, caso alguem possa me ajudar, mandar um link de um tutorial nesse caso... seria uma grande ajuda.

Muito obrigado

dertyu765
Tags: Spring Security Plugin, dominios existentes, implementar, banco de dados, existente


0
Fiz com que cada um dos meus dominios extends o Usuario.... o GORM criou uma tabela Usuario com 50 colunas...

Realmente ainda não entendi o funcionamento do plugin
14/07/2012 13:21


0
Acho que o jeito é criar chaves para cada uma das tabelas de usuario que eu ja tenho, dessa maneira consigo adquirir as respectivas informações adicionais de cada um (nome, cidade etc..) e as informações para login (email e senha) ficam centralizados em uma unica tabela.

Bom pessoal, qual solução seria mais adequada nesse caso?

Realmente creio que devo centralizar as informações de Login, pois seria inviavel procurar em 4 tabelas se o usuario de fato existe, mas seria essa solução que dei logo acima a mais adequada?



14/07/2012 13:42


0
Oi Daniel!

Centralizar seria o mais adequado, os seus usuários extendem as informações básicas da classe gerada pelo Spring, e você adiciona os campos extras na sua classe(a antiga).

Mas, só uma pergunta... Pq vc precisa separar os usuários em tantas classes diferentes?
14/07/2012 20:37


0
Luciado,

Eu divide minha aplicacao entre Cliente, Empresa, Profissional e Administrador.

O porque disso eh simples:

1) Estou oferecendo um servico de pesquisa, dessa maneira terei um numero de Clientes bem maior que de Profissionais e Empresas... como estou pesquisando pelos dois ultimos, se unisse todos atores em uma unica tabela, a longo prazo a aplicacao ficaria mais lenta, pois seria necessario navegar por uma quantidade consideravel de registros descartaveis (Clientes).

2) As propriedades de cada usuario sao bem distintas, tendo pouquissimos campos em comum , isso geraria uma tabela grande (50 colunas)e complicaria o relacionamento entre tabela do banco.

Estou pensando realmente em criar uma tabela com email e senha (com o script s2 da spring) seguido das chaves estrangeiras para os dados adicionais do respectivo usuario .

Nesse caso vou ter que fazer uma relacao de 1 para 1 com os 4 atores apartir da tabela de login.

Gostaria de opiniao de voces, pois sou novo no Grails e tive como bibliografia somente Grails in Action, que ja trata de uma versao inferior do framework, alem de oferecer um exemplo muito simples(pelo menos no meu ponto de vista)



14/07/2012 21:26


0
Olá Daniel, entendi agora seus requisitos.

Bom, como vc mesmo comentou, realmente o GORM vai unir todas as tabelas que extendem a classe usuário em uma única tabela na base de dados. Isso vai ter uma influência significativa se você trabalhar com um GRANDE número de dados, caso contrário a busca terá uma alteração mínima e quase imperceptível.

Em minhas aplicações, faço a extensão da classe usuário. Mas minha tabela é relativamente pequena, e não chega a ter 50 colunas.

Você poderia criar o domínio SecUser pelo spring normalmente, e seus domínios fazendo um relacionamento. Exemplo:
class Cliente{
SecUser user
String nomeCliente
String foneCliente



class SecUser {
...
static belongsTo = [cliente: Cliente]
...


Não sei se é o mais recomendado, o pessoal mais experiente do fórum poderá nos ajudar. Além disso, separando desta forma vale ressaltar que embora você ganhe algum desempenho de busca, o custo de manipulação e inserção será maior. Para cada modificação, ou inserção você terá de acessar diferentes tabelas na base.

Você deve ponderar, se o ganho que você terá com a otimização da busca, compensará o custo que você terá para inserir e editar informações. Além disso, será que a quantidade de informações registradas será tamanha que terá resultados de atraso significativo nos SGBD's atuais?

[]'s
15/07/2012 22:42


0
Muito obrigado pela ajuda Luciano.

Realmente voce tem razao, acho que foi um pouco de exagero...

Agora estou com um ultimo problema, pois criei o SecUser, mas nao consigo colocar CONSTRAINTS nos campos username e password... quando deixo eles como o padrao de fabrica eles funcionam, caso contrario o postgres simplesmente nao salva o usuario e apresenta-->



URI
/udoctor/cadastro/cadastroInicialCliente
Class
java.sql.BatchUpdateException
Message
Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '3') foi abortada. Chame getNextException para ver a causa.

2012-07-16 19:01:02,712 [http-bio-7070-exec-3] ERROR StackTrace - Full Stack Trace:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at br.com.udoctor.seguranca.UsuarioRegra.create(UsuarioRegra.groovy:32)
at br.com.udoctor.cadastro.CadastroController.cadastroInicialCliente(CadastroController.groovy:40)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '2') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2752)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
... 5 more
2012-07-16 19:01:02,712 [http-bio-7070-exec-3] ERROR StackTrace - Full Stack Trace:
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at br.com.udoctor.seguranca.UsuarioRegra.create(UsuarioRegra.groovy:32)
at br.com.udoctor.cadastro.CadastroController.cadastroInicialCliente(CadastroController.groovy:40)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into usuario_regra (regra_id, usuario_id) values ('1', '2') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2752)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
... 5 more




username blank: false, unique: true// email: true, size: 7..128
//password blank: false ---> FUNCIONA
password validator: { String password, user ->
if (user.username && user.username.equals(password)) {
return 'user.password.error.username'
}

if (password && password.length() >= 8 && password.length() <= 64 &&
(!password.matches('^.*\p{Alpha}.*$') ||
!password.matches('^.*\p{Digit}.*$') ||
!password.matches('^.*[!@#$%^&].*$'))) {
return 'user.password.error.username'
}
}


Nao consigo usar CONSTRAINTS nos campos username e password, e nao estou entendendo esse erro somente nesse caso.

Segue o controller -->

				if(cliente.save(flush: true, failOnError: true)){
UsuarioRegra.create (cliente, regra, true)
chain(action:"formularioCliente", model:[cliente: cliente])




16/07/2012 22:42


0
Daniel, em minha aplicação faço integração com LDAP, então não preciso validar a senha. Não sei ao certo todos os detalhes, mas se eu não estiver enganado você precisa criar um segundo campo de senha transient para fazer as validações.


[]'s

Luciano

17/07/2012 13:03



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