<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Alessandro Lazarotti Blog</title>
	<atom:link href="http://alessandrolazarotti.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://alessandrolazarotti.wordpress.com</link>
	<description>Relaxe e programe (ou quase isso)</description>
	<lastBuildDate>Tue, 10 Feb 2009 02:19:56 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='alessandrolazarotti.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/bb1b51a844b4a24925062c7c82f2a7fd?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Alessandro Lazarotti Blog</title>
		<link>http://alessandrolazarotti.wordpress.com</link>
	</image>
			<item>
		<title>JAAS e Seam &#8211; O útil ao agradável</title>
		<link>http://alessandrolazarotti.wordpress.com/2009/02/10/jaas-e-seam-o-util-ao-agradavel/</link>
		<comments>http://alessandrolazarotti.wordpress.com/2009/02/10/jaas-e-seam-o-util-ao-agradavel/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 02:19:56 +0000</pubDate>
		<dc:creator>alessandrolazarotti</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[seam segurança]]></category>

		<guid isPermaLink="false">http://alessandrolazarotti.wordpress.com/?p=14</guid>
		<description><![CDATA[Quando se fala em autorização e autenticação Java, nada mais natural do que pensar em JAAS &#8211; Java Authentication and Authorization Service.
Na realidade o poder do JAAS provém de sua arquitetura plugável, o que permite aos Servidores de Aplicação JavaEE utilizarem sua estrutura tanto para autenticação/autorização em componentes EJB, como em aplicações web ou serviços [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alessandrolazarotti.wordpress.com&blog=5213624&post=14&subd=alessandrolazarotti&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quando se fala em autorização e autenticação Java, nada mais natural do que pensar em <a title="JAAS" href="http://java.sun.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html" target="_blank">JAAS</a> &#8211; <em>Java Authentication and Authorization Service.</em></p>
<p>Na realidade o poder do JAAS provém de sua arquitetura plugável, o que permite aos Servidores de Aplicação JavaEE utilizarem sua estrutura tanto para autenticação/autorização em componentes EJB, como em aplicações web ou serviços de mensageria. Além disso a implementação do acesso aos dados de autenticação também fica abstraída da sua aplicaçao, ou seja, não é necessario saber se esta autenticando em LDAP, database ou file-systems, quem resolve isso é a configuração login-module do JAAS de seu Servidor.</p>
<p>Mas mesmo assim o Security Service do servidor de aplicação é limitado. Como não poderia deixar de ser, o JAAS implementado pelo container só pode agir sobre objetos gerenciados pelo container como EJBs e Servlets, ou seja, os POJOs de sua aplicação fica de fora. Outra limitação é que embora possa restringir contextos de páginas pelo serviço de segurança JAAS do container, ele não é capaz de restringir acesso ou visibilidade de &#8220;trechos&#8221; de uma página, como uma caixa de texto por exemplo.</p>
<p>Por essas e outras, soluções &#8220;paralelas&#8221; de segurança começaram explodir pela marginalidade da especificação, tendo destaque o Spring Security (ACEGI) e o <a title="Seam Security" href="http://docs.jboss.com/seam/2.1.1.GA/reference/en-US/html/security.html" target="_blank">Seam Security</a>, cobrindo as brechas deixadas pelos servidores.</p>
<p>A solução do Seam para segurança é bastante completa e pode ser uma simples configuração de papéis e credenciais, uma elaborada solução de Identity Managment out-of-box para databases ou LDAP, marcadores baseados em anotações com políticas de acesso para POJOs, EJBs, páginas e trechos de páginas ou ainda complexas regras codificadas em um engine de regras (Drools) externas a aplicação. Na verdade, apenas com a configuração de credenciais e papéis já dá pra fazer MUITA coisa.</p>
<p>Por exemplo:</p>
<pre><strong><span style="color:#2e8b57;">public</span> <span style="color:#2e8b57;">class</span> Authenticator <span style="color:#2e8b57;">implements</span> AuthenticatorI{

    <span style="color:#a020f0;">@In</span> Identity identity;
    <span style="color:#a020f0;">@In</span> Credentials credentials;
    <span style="color:#a020f0;">@In</span> UserRepository userRepository;
    <span style="color:#a020f0;">@Out</span>(required=<span style="color:#ff00ff;">false</span>) User user;

    <span style="color:#2e8b57;">public</span> <span style="color:#2e8b57;">boolean</span> authenticate(){

        <span style="color:#0000ff;">//aqui lógica de autenticacao XPTO</span>
        User user  = userRepository.getByCredentials(
                        credentials.getUsername(),
                        credentials.getPassword());

        <span style="color:#a52a2a;">if</span>(user!=<span style="color:#ff00ff;">null</span>){
                <span style="color:#a52a2a;">for</span>(Role role:user.getRoles()){
                    identity.addRole(role);
                }
                <span style="color:#a52a2a;">return</span> <span style="color:#ff00ff;">true</span>;
        }
        <span style="color:#a52a2a;">return</span> <span style="color:#ff00ff;">false</span>
    }
}
</strong></pre>
<p>Na autenticação bem tradicional do Seam logo acima, vários papéis(roles) são adicionados a identity no login. Com isso é possível fazer:</p>
<p>- proteger uma classe:</p>
<p><span style="color:#808080;"> @Restrict(&#8220;#{s:hasRole(&#8216;auditor&#8217;)}&#8221;)</span><br />
<span style="color:#993300;">public class </span>Inventory(){<br />
&#8230;.<br />
}</p>
<p>- um método:<br />
<span style="color:#808080;"><br />
@Restrict(&#8220;#{s:hasRole(&#8216;mailer&#8217;)}&#8221;)</span><br />
<span style="color:#993300;">public void</span> sender(Mail mail){<br />
&#8230;.<br />
}</p>
<p>- trechos de páginas</p>
<p><span style="color:#333399;">&lt;h:commandButton action=#{car.run} value=&#8221;Run&#8221; rendered=&#8221;#{s:hasRole(&#8216;booster&#8217;)}&#8221;&gt;</span></p>
<p><span style="color:#333399;"><span style="color:#000000;"><strong>O problema é: as vezes uma aplicação baseada em Seam Security precisa acessar EJBs protegidos no Security Service do servidor de aplicação</strong>. Pra piorar, o Seam apesar de lidar bem com seus componentes, ele nativamente não propaga sua autenticação/autoriazação para os objetos gerenciados apenas pelo container.</span></span></p>
<p>Para superar isso no JBoss é simples. No diretório do JbossWeb (tomcat embarcado) no servidor, existe um jar chamado jbossweb-service.jar. Este jar possui a classe responsável pela autenticação JAAS do container web, e propaga isso também para o container EJB. Então, apenas é necessário adicionar este jar ao classpath e alterar a classe de autenticação para algo como:<br />
&#8230;</p>
<pre>    <span style="color:#2e8b57;"><strong>public</strong></span> <span style="color:#2e8b57;"><strong>boolean</strong></span> authenticate(){

        <span style="color:#0000ff;">//aqui lógica de autenticacao XPTO</span>
        User user  = userRepository.getByCredentials(
                                credentials.getUsername(),
                                credentials.getPassword());

        <span style="color:#a52a2a;"><strong>if</strong></span>(user!=<span style="color:#ff00ff;">null</span>){
                <span style="color:#a52a2a;"><strong>for</strong></span>(Role role:user.getRoles()){
                    identity.addRole(role);
                }

                <span style="color:#0000ff;">//propagando para o container</span>
<strong>                WebAuthentication webAuthentication = <span style="color:#a52a2a;">new</span> WebAuthentication();
                webAuthentication.login(credentials.getUsername(),
                                        credentials.getPassword());</strong>

                <span style="color:#a52a2a;"><strong>return</strong></span> <span style="color:#ff00ff;">true</span>;
        }
     }</pre>
<p>&#8230;</p>
<p>Além de fornecer as credenciais para o container, também é necessário dizer qual a Application-Policy JAAS do container será usada para fornecer as roles desta autenticação. Para tal, basta adicionar o arquivo jboss-web.xml no war do projeto (em WEB-INF), contendo:</p>
<pre>&lt;jboss-web&gt;
    &lt;security-domain flushOnSessionInvalidation="true"&gt;
       java:/jaas/nomeDaSuaRelmJAAS
    &lt;/security-domain&gt;
&lt;/jboss-web&gt;</pre>
<p>Beleza, agora você pode acessar tanto EJBs e POJOs protegidos pelo Seam, como EJBs isolados protegidos pelo container.</p>
<p>Hmmm, mas perae, ainda parece não estar legal. Parece que estou duplicando código. O mesmo código que uso para pesquisar o usuário, recuperar suas Roles e adicionar para o Seam, o container vai ter que fazer também. Então porque não uso diretamente o código de autenticacao do container também para o Seam? Isso me parece razoável e possível.</p>
<p>Para isso temos que modificar a tag security do components.xml:</p>
<p>disso:</p>
<pre>&lt;security:identity authenticate-method="#{authenticator.authenticate}" /&gt;</pre>
<p>para isso:</p>
<pre>&lt;security:identity  jaas-config-name="nomeDaSuaRelmJAAS"/&gt;</pre>
<p>Quando é feita essa configuração não precisamos mais implementar uma classe de Autenticação que fara uma pesquisa em algum lugar retornando o usuário e seus direitos, o container faz isso pra gente. Isso é possível porque o Seam obedece a mesma estrutura de Autenticação/Autorização do container, ou seja, também é baseada em JAAS, logo pode delegar para o Server esta tarefa.</p>
<p>Mas o problema de propagação para o container ainda existe, aquele código de WebAuthentication ainda é necessário. Mas agora fica a pergunta, se não temos mais a classe de autenticação já que o container esta fazendo isso, onde colocar este código extra?</p>
<p>O Seam possui suporte a configuração de Listeners e Observers para QUALQUER um de seus componentes. É bem simples fazer uma configuração que represente a idéia: &#8220;Sempre que ocorrer um evento de Login, execute determinado código&#8221;. Na prática isso seria:</p>
<p>login.page.xml</p>
<pre>   &lt;navigation from-action="#{identity.login}"&gt;
     &lt;rule if="#{identity.loggedIn}"&gt;
         <strong>&lt;raise-event type="loginEvent"/&gt;</strong>
         &lt;redirect view-id="/home.xhtml"/&gt;
      &lt;/rule&gt;
   &lt;/navigation&gt;</pre>
<p>Com isso configuramos um evento chamado loginEvent. Agora o Observer do evento:</p>
<pre><span style="color:#a020f0;">@Name</span>(<span style="color:#ff00ff;">"loginListener"</span>)
<span style="color:#2e8b57;"><strong>public</strong></span> <span style="color:#2e8b57;"><strong>class</strong></span> LoginListener {
        <span style="color:#a020f0;">@In</span>
        <span style="color:#2e8b57;"><strong>private</strong></span> Identity identity;

        <span style="color:#a020f0;">@Observer</span>(<span style="color:#ff00ff;">"loginEvent"</span>)
        <span style="color:#2e8b57;"><strong>public</strong></span> <span style="color:#2e8b57;"><strong>void</strong></span> configJaas(){
                WebAuthentication webAuthentication = <span style="color:#a52a2a;"><strong>new</strong></span> WebAuthentication();
                webAuthentication.login(identity.getCredentials().getUsername(),
                                        identity.getCredentials().getPassword());
        }
}</pre>
<p>Pronto!!! Agora através da mesma configuração no servidor podemos ter configurados EJBs Standalones, Webservices, Filas de mensagem e a própria aplicação Seam, tudo no servidor. Se a configuração da aplicação para buscar usuarios e direitos mudar de banco de dados para LDAP, FileSystem ou qualquer outra coisa, nenhuma linha da aplicação precisará ser alterada.</p>
<p>Ops, tem uma pegadinha neste &#8220;identity.getCredentials().getPassword()&#8221; do último código que deixo para o próximo post <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alessandrolazarotti.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alessandrolazarotti.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alessandrolazarotti.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alessandrolazarotti.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alessandrolazarotti.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alessandrolazarotti.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alessandrolazarotti.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alessandrolazarotti.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alessandrolazarotti.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alessandrolazarotti.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alessandrolazarotti.wordpress.com&blog=5213624&post=14&subd=alessandrolazarotti&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alessandrolazarotti.wordpress.com/2009/02/10/jaas-e-seam-o-util-ao-agradavel/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/076243b1dad1508947830246080c1201?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Alessandro Lazarotti</media:title>
		</media:content>
	</item>
		<item>
		<title>De volta Para o Futuro</title>
		<link>http://alessandrolazarotti.wordpress.com/2008/11/09/de-volta-para-o-futuro/</link>
		<comments>http://alessandrolazarotti.wordpress.com/2008/11/09/de-volta-para-o-futuro/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 04:27:03 +0000</pubDate>
		<dc:creator>alessandrolazarotti</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[off-topicsss]]></category>

		<guid isPermaLink="false">http://alessandrolazarotti.wordpress.com/?p=3</guid>
		<description><![CDATA[Depois de muito tempo &#8220;ensaiando&#8221;, estou voltando a blogar.
Para quem não me conhece, meu nome é Alessandro Lazarotti (err, o nome do blog) &#8211; Jundiaiense torcedor do Palmeiras -  trabalho atualmente na divisão JBoss da Red Hat em São Paulo na área de consultoria e treinamentos. Algumas pessoas me chamam de Alessandro/Ale/Lê/Lezinho/Laza, qualquer um destes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alessandrolazarotti.wordpress.com&blog=5213624&post=3&subd=alessandrolazarotti&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Depois de muito tempo &#8220;ensaiando&#8221;, estou voltando a blogar.</p>
<p>Para quem não me conhece, meu nome é Alessandro Lazarotti (err, o nome do blog) &#8211; Jundiaiense torcedor do Palmeiras -  trabalho atualmente na divisão JBoss da Red Hat em São Paulo na área de consultoria e treinamentos. Algumas pessoas me chamam de Alessandro/Ale/Lê/Lezinho/Laza, qualquer um destes codinomes perigosos, eu atendo.</p>
<p>Como não poderia deixar de ser, o foco deste blog vai ser mesmo tencologia e afins, contudo algum besteirol cotidiano também será serventia da casa.<a href="http://alessandrolazarotti.files.wordpress.com/2008/11/back_to_the_future.jpg"><img class="size-full wp-image-10 alignleft" title="back_to_the_future" src="http://alessandrolazarotti.files.wordpress.com/2008/11/back_to_the_future.jpg?w=252&#038;h=216" alt="back_to_the_future" width="252" height="216" /></a></p>
<p>Alguns dos primeiros assuntos que abordarei irão ser retroativos, para poder colocar a ordem em casa, portanto que ninguém se assuste comigo falando de JustJava agora em novembro.</p>
<p>Eu auto-apresentado, blog apresentado, só falta agora o conteúdo =)<br />
Já Já eu volto com &#8220;algunas cositas más&#8221;.</p>
<p>Abraços e sejam bem-vindos</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alessandrolazarotti.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alessandrolazarotti.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alessandrolazarotti.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alessandrolazarotti.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alessandrolazarotti.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alessandrolazarotti.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alessandrolazarotti.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alessandrolazarotti.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alessandrolazarotti.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alessandrolazarotti.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alessandrolazarotti.wordpress.com&blog=5213624&post=3&subd=alessandrolazarotti&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alessandrolazarotti.wordpress.com/2008/11/09/de-volta-para-o-futuro/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/076243b1dad1508947830246080c1201?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Alessandro Lazarotti</media:title>
		</media:content>

		<media:content url="http://alessandrolazarotti.files.wordpress.com/2008/11/back_to_the_future.jpg" medium="image">
			<media:title type="html">back_to_the_future</media:title>
		</media:content>
	</item>
	</channel>
</rss>