Mini-tutorial de autenticação usando o Acegi-Plugin
03/05/2008 00:00
0
Bom, resolvi aproveitar que nesta semana foi o lançamento do Acegi Plugin 0.3 e também que todo sistema tem sua área restrita que necessita de login, e vim colocar esse mini-tutorial que explica basicamente como usar o mecanismo de autenticação do Acegi Plugin 0.3 (que usa por trás Spring Security).

Vamos começar criando uma app chamada 'seguranca' e acessando ela.

grails create-app seguranca 
cd seguranca


O proximo passo é instalar o plugin AcegiSecurity

grails install-plugin acegi


O AcegiPlugin trabalha com 3 conceitos basicos:

* Person: Um usuario do site, contempla login, senha, campo booleano que diz se o email será mostrado, se o usuário está ativo e outras coisas básicas.

* Role: É um perfil de acesso, no caso geralmente tem os administradores, os usuários normais, etc.

* RequestMap: É a relação entre uma URL do sistema, e os perfis que podem acessá-la.

Vamos criar as classes de autenticação com os nomes de "Usuario" para Person, e "Permissão" para Role. Se estes 2 nomes não forem passados como parâmetro, serão usados os defaults (Person, Authority). Depois disso, vamos criar todo o mecanismo de páginas e gerenciamento destas entidades.

grails create-auth-domains Usuario Permissao

grails generate-manager


Prontinho, já temos um sistema de segunça na app, vamos criar uma simples classe para testar o mecanismo de acesso as URLs. Para isso uma simples entidade de teste (Pessoa), e colocar o codigo abaixo.

grails create-domain-class Pessoa

vi grails-app/domain/Pessoa.groovy

class Pessoa {
String nome
String email

static constraints = {
nome(blank:false)
email(blank:false, email:true)
}
}


Vamos gerar as views/controller para a Pessoa

grails generate-all Pessoa


E enfim, rodar a nossa app, com sistea de segurança!

grails run-app


Pronto,

Agora basta acessarmos o RoleController para definir quais serão os perfils de acesso (ex. user e admin). Depois acessar o UsuarioController para cadastrar usuarios.
Para o teste, é legal cadastrar um usuario "user_usuario" com a role (perfil) de "user", e outro "user_admin" com a role "admin". Não esqueçam de manter a caixa "enabled" marcada do usuário.

Agora, devemos vincular as URLs da app aos perfis que podem acessá-las. Isso pode ser feito através do RequestMapController. Neste exemplo, vou manter a listagem acessível para o usuárrio e para o admin, já aadicionar, editar e deletar, serão privilégios exclusivos do administrador. Então basta cadastrar os RequestMaps desta maneira:

URL: /pessoa/create
Role: admin

URL: /pessoa/edit
Role: admin

URL: /pessoa/delete
Role: admin

URL: /pessoa/list
Role: admin,user


Pronto, agora, se tentarmos acessar o controller de Pessoa, já teremos a tela de login. Basta logarmos como usuário e pronto, conseguiremos listar, já não conseguiremos adicionar e nem dar manutenção em nenhum registro. Teremos o erro de 403 na tela.
Se efetuarmos o logout (existe um link para este controller no inicio), e efetuarmos o login como administardor, prontinho, todo o acesso as operações está liberado!

PS: Consideração importante: Manter os RequestMaps desta maneira, com uma DomainClass e por consequência no banco de dados é uma alternativa, que facilita o cadastro de novas restrições (através da tela vista a pouco), porém gera um custo de uma ida ao banco de dados a cada request do usuário para verificar sua permissão na URL que está sendo acessada. Caso o modelo de acesso as URLs não mude com frequeência, pode-se manter estas referências no arquivo estático grails-app/conf/SecurityConfig.groovy. Fica considerávelmente mais rápido, porém para cada alteração deste mecanismo será necessário recarregar o arquivo para reler as permissões.

É isso aí, boa sorte a todos!

[]s,

Lucas
Tags: Snippets


0
Muito bom o tutorial Lucas, parabéns
04/05/2008 00:00


0
Como eu testo se um usuario tem acesso a determinada url para apresenta-la so se ele possuir o direito?
16/04/2009 00:00


0
Como eu testo se um usuario tem acesso a determinada url para apresenta-la so se ele possuir o direito?
16/04/2009 00:00


0
Pode usar a taglib do Acegi para isso.

Dê uma olhada no meu tutorial mais completo sobre acegi, lá explica como usar a taglig e qual é a tag a ser chamada: http://tinyurl.com/1of25-acegi

[]s,
16/04/2009 00:00


0
Tava pensando em criar um sisteminha de login com perfis na mão, mas com esse plugin fica bem melhor... <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->

Valeu Lucas!
04/05/2009 00:00


0
Olá Lucas. Olá comunidade Grails..

Ainda estou tateando no grails e tentei testar o acegi. Segui inicialmente o seu tutorial. Deu quase tudo certo mas ao cadastrar o usuário, o(s) role(s) que escolho não são armazenados, apesar de serem mostrados para seleção na criação de um novo usuário. Depois de salvar as opções de roles selecionadas não aparecem quando peço para mostrar o usuário. Com isso o sistema de acesso não funciona, informando que não tenho direito de acesso ou ainda, informa que o usuário ou password estão incorretos. Testei um outro tutorial e tb obtive os mesmos erros. Por acaso o acegi requer um datasource diferente do default do grails? Estou usando o banco de dados em memória mesmo, configuração padrão do grails.

Desde já agradeço a ajuda..

Mateus
16/11/2009 00:00


0
Fala Mateus!

Também tive essa dificuldade no início.

E também usei o ótimo tutorial do Lucas.

Não sei se vai te ajudar, mas eu adicionava um usuário, uma role(papel) e um requestmap.
Eu fazia isso no Bootstrap.groovy, porque usava a memória mesmo pra testar.

class BootStrap {

def init = { servletContext ->
new Requestmap(url&#58;&quot;/user/**&quot;,configAttribute&#58;&quot;ROLE_ADMIN&quot;).save()
new User(username&#58; 'Nome do Caboclo', userRealName&#58; 'Nome Real do Cidadão', passwd&#58; 'Senha do cabra', enabled&#58; true, email&#58; 'email@algumacoisa.com', emailShow&#58; false, description&#58; 'none').save()
new Role(description&#58; 'description', authority&#58;'ROLE_ADMIN').save()
new Requestmap(url&#58;&quot;/**&quot;,configAttribute&#58;&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot;).save()
new Requestmap(url&#58;'/secure/**', configAttribute&#58;'ROLE_ADMIN').save()
}
}


Você pode acessar a documentação do plugin pra maiores detalhes:
<!-- m --><a class="postlink" href="http://grails.org/AcegiSecurity+Plugin+-+Securing+URLs">http://grails.org/AcegiSecurity+Plugin+-+Securing+URLs</a><!-- m -->

Outro detalhe é que você deve prestar atenção no valor da propriedade 'configAttribute' da classe RequestMap.
Pois você pode estar tentando acessar uma url que não tem permissão.

Espero ter ajudado.

Att,
Rodrigo
17/11/2009 00:00


0
Estou tendo problemas na instalação deste plugin. Quando eu mando instalar o plugin, ele instala no diretório [color=#800000]C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3[/color]. No entanto quando eu executo o comando grails generate-manager, ele busca na pasta do projeto (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy) uma classe que foi instalada em [color=#800000]C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3[/color].

Alguém sabe como resolver?


Código
------------------------------------------------------------------------------------------------------------
C:\java\Projetos\seguranca>grails generate-manager
Welcome to Grails 1.3.4 - <!-- m --><a class="postlink" href="http://grails.org/">http://grails.org/</a><!-- m -->
Licensed under Apache Standard License 2.0
Grails home is set to: C:\java\grails-1.3.4

Base Directory: C:\java\Projetos\seguranca
Resolving dependencies...
Dependencies resolved in 938ms.
Running script C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3\scripts\GenerateManager.groovy
Environment set to development

Error executing script GenerateManager: java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:391)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:427)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:415)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.executeTargets(Gant.groovy:590)
at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
at _SecurityTargets_groovy$_run_closure3.doCall(_SecurityTargets_groovy:95)
at _SecurityTargets_groovy$_run_closure3.doCall(_SecurityTargets_groovy)
at GenerateManager$_run_closure1.doCall(GenerateManager:28)
at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
... 10 more
--- Nested Exception ---
java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
at _SecurityTargets_groovy$_run_closure3.doCall(_SecurityTargets_groovy:95)
at _SecurityTargets_groovy$_run_closure3.doCall(_SecurityTargets_groovy)
at GenerateManager$_run_closure1.doCall(GenerateManager:28)
at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:427)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:415)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.executeTargets(Gant.groovy:590)
at gant.Gant.executeTargets(Gant.groovy:589)
Error executing script GenerateManager: java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
C:\java\Projetos\seguranca>

------------------------------------------------------------------------------------------------------------
09/09/2010 00:00


0
Yarkhs, ja que você esta começando a implementação da parte de segurança, não utilize o Acegi, utilize o plugin spring-security-core, o acegi foi descontinuado.
[quote=&quot;Yarkhs&quot;]Estou tendo problemas na instalação deste plugin. Quando eu mando instalar o plugin, ele instala no diretório [color=#800000]C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3[/color]. No entanto quando eu executo o comando grails generate-manager, ele busca na pasta do projeto (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy) uma classe que foi instalada em [color=#800000]C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3[/color].

Alguém sabe como resolver?


Código
------------------------------------------------------------------------------------------------------------
C:\java\Projetos\seguranca>grails generate-manager
Welcome to Grails 1.3.4 - <!-- m --><a class="postlink" href="http://grails.org/">http://grails.org/</a><!-- m -->
Licensed under Apache Standard License 2.0
Grails home is set to: C:\java\grails-1.3.4

Base Directory: C:\java\Projetos\seguranca
Resolving dependencies...
Dependencies resolved in 938ms.
Running script C:\Documents and Settings\daniel.costa\.grails\1.3.4\projects\seguranca\plugins\acegi-0.5.3\scripts\GenerateManager.groovy
Environment set to development

Error executing script GenerateManager: java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
java.io.FileNotFoundException: C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy (C:\java\Projetos\seguranca\grails-app\conf\SecurityConfig.groovy)
...

------------------------------------------------------------------------------------------------------------[/quote]
09/09/2010 00:00


0
A vlw. Vou dar uma olhada neste daí sim.

Engraçado que no site fala sobre isso e eu nem percebi ¬¬. Estava tão afobado para fazer o acegi funcionar que nem vi isto.
10/09/2010 00:00


0
Exatamente, o acegi foi descontinuado e modularizado em vários plugins.

Spring Security Core plugin
Spring Security OpenID plugin
Spring Security ACL plugin
Spring Security CAS plugin
Spring Security LDAP plugin
Spring Security UI plugin

As documentações estão em <!-- m --><a class="postlink" href="http://burtbeckwith.github.com/">http://burtbeckwith.github.com/</a><!-- m -->

[]s,
16/09/2010 00:00


0
[quote=&quot;lucastex&quot;]Exatamente, o acegi foi descontinuado e modularizado em vários plugins.

Spring Security Core plugin
Spring Security OpenID plugin
Spring Security ACL plugin
Spring Security CAS plugin
Spring Security LDAP plugin
Spring Security UI plugin

As documentações estão em <!-- m --><a class="postlink" href="http://burtbeckwith.github.com/">http://burtbeckwith.github.com/</a><!-- m -->

[]s,[/quote]

Vixe complicou agora. Eu já viajava na maionese quando era só 1 plugin. Agora que são vários fico perdido Oo. Eu cheguei a tentar instalar o plugin usando o arquivo .zip e direto da net pelo cmd. Os dois estão dando o mesmo erro.

Obs: Só consigo baixar as coisas por trás de um proxy. Procurei na internet e achei um lugar dizendo que era só adicionar &quot;set HTTP_proxy=http://10.2.0.89:3128&quot; no cmd que ele executa por um proxy.


C&#58;\java\Projetos\testeGrails>grails install-plugin spring-security-core
Welcome to Grails 1.3.4 - http&#58;//grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to&#58; C&#58;\java\grails-1.3.4

Base Directory&#58; C&#58;\java\Projetos\testeGrails
Resolving dependencies...
Dependencies resolved in 889ms.
Running script C&#58;\java\grails-1.3.4\scripts\InstallPlugin.groovy
Environment set to development
Resolving plugin spring-security-core. Please wait...

&#58;&#58; problems summary &#58;&#58;
&#58;&#58;&#58;&#58; WARNINGS
module not found&#58; org.grails.plugins#spring-security-core;latest.integration

==== grailsPlugins&#58; tried

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

C&#58;\java\Projetos\testeGrails/lib/spring-security-core-[revision].zip

C&#58;\Documents and Settings\daniel.costa\.grails\1.3.4\projects\testeGrails\plugins\acegi-0.5.3/lib/spring-security-core-[revision].zip

C&#58;\Documents and Settings\daniel.costa\.grails\1.3.4\projects\testeGrails\plugins\hibernate-1.3.4/lib/spring-security-core-[revision].zip

C&#58;\Documents and Settings\daniel.costa\.grails\1.3.4\projects\testeGrails\plugins\tomcat-1.3.4/lib/spring-security-core-[revision].zip

==== grailsHome&#58; tried

C&#58;\java\grails-1.3.4\lib/spring-security-core-[revision].xml

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

C&#58;\java\grails-1.3.4\lib/spring-security-core-[revision].zip

==== grailsHome&#58; tried

C&#58;\java\grails-1.3.4\dist/spring-security-core-[revision].xml

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

C&#58;\java\grails-1.3.4\dist/spring-security-core-[revision].zip

==== grailsHome&#58; tried

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

C&#58;\java\grails-1.3.4/plugins/grails-spring-security-core-[revision].zip

==== grailsCentral&#58; tried

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

http&#58;//svn.codehaus.org/grails-plugins/grails-spring-security-core/tags/LATEST_RELEASE/grails-spring-security-core-[revision].zip

==== grailsCore&#58; tried

-- artifact org.grails.plugins#spring-security-core;latest.integration!spring-security-core.zip&#58;

http&#58;//svn.codehaus.org/grails/trunk/grails-plugins/grails-spring-security-core/tags/LATEST_RELEASE/grails-spring-security-core-[revision].zip

&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;

&#58;&#58; UNRESOLVED DEPENDENCIES &#58;&#58;

&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;

&#58;&#58; org.grails.plugins#spring-security-core;latest.integration&#58; not found

&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;&#58;


Error resolving plugin [name&#58;spring-security-core, group&#58;org.grails.plugins, version&#58;latest.integration].
Plugin not found for name [spring-security-core] and version [not specified]
C&#58;\java\Projetos\testeGrails>
17/09/2010 00:00


0
Certeza que essa sua máquina está com acesso a internet SEM proxy?
Se vc tiver em uma rede que tenha proxy, vai ter que definir com os comandos do grails mesmo...

<!-- m --><a class="postlink" href="http://grails.org/doc/latest/ref/Command%20Line/set-proxy.html">http://grails.org/doc/latest/ref/Comman ... proxy.html</a><!-- m -->

[]s,
17/09/2010 00:00


0
Que legal!!! Ele mesmo deixa gravado <!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Razz" /><!-- s:P -->. E eu o tempo todo tentando usar config do windows para isso ¬¬
17/09/2010 00:00


0
O erro persiste ¬¬. Acho que o problema então não é do proxy, e sim do plugin em questão. Eu adicionei o proxy como vc mostrou falando qual era o host, porta, usuario e senha que uso para ter acesso e na pasta do projeto dei o comando grails &quot;install-plugin spring-security-core&quot;.

A mensagem de erro que aparece ainda é a mesma.
17/09/2010 00:00


0
Como está o seu arquivo BuildConfig.groovy?
20/09/2010 00:00


0
Está assim.


grails.project.class.dir = &quot;target/classes&quot;
grails.project.test.class.dir = &quot;target/test-classes&quot;
grails.project.test.reports.dir = &quot;target/test-reports&quot;
//grails.project.war.file = &quot;target/${appName}-${appVersion}.war&quot;
grails.project.dependency.resolution = {
// inherit Grails' default dependencies
inherits(&quot;global&quot;) {
// uncomment to disable ehcache
// excludes 'ehcache'
}
log &quot;warn&quot; // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
repositories {
grailsPlugins()
grailsHome()
grailsCentral()

// uncomment the below to enable remote dependency resolution
// from public Maven repositories
//mavenLocal()
//mavenCentral()
//mavenRepo &quot;http&#58;//snapshots.repository.codehaus.org&quot;
//mavenRepo &quot;http&#58;//repository.codehaus.org&quot;
//mavenRepo &quot;http&#58;//download.java.net/maven/2/&quot;
//mavenRepo &quot;http&#58;//repository.jboss.com/maven2/&quot;
}
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.

// runtime 'mysql&#58;mysql-connector-java&#58;5.1.5'
}
}
20/09/2010 00:00


0
Consegui resolver o problema. Na verdade não tinha a ver com acegi ou spring-security-core. Eu não consegui instalar nenhum plugin. Provavelmente o problema é do proxy mesmo. Pois o proxy da minha empresa bloqueia transferência de arquivo zip. E quando baixamos os plugins parece que vem compactado em formato .zip. Eu havia tentado instalar offline mas sem sucesso. Só com uma dica do livro &quot;Em busca do Grails&quot; consegui instalar offline.

No livro mostra 2 formas de instalar offline. Uma é dando o comando + local onde está o plugin (tentei sem sucesso). A outra é colocando o zip do plugin na pasta plugins dentro da pasta do grails e executando o comando normal. Nesta segunda forma que consegui instalar <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->.
27/09/2010 00:00



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