<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Fernando Mantoan</title>
	
	<link>http://fernandomantoan.com</link>
	<description>Desenvolvimento e tecnologia da informação no geral</description>
	<lastBuildDate>Fri, 18 May 2012 13:08:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/fernandomantoan" /><feedburner:info uri="fernandomantoan" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Estudo de Caso de uma Estrutura de Autenticação Única utilizando o protocolo OAuth</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/myikkVisNXI/</link>
		<comments>http://fernandomantoan.com/monografia-2/estudo-de-caso-de-uma-estrutura-de-autenticacao-unica-utilizando-o-protocolo-oauth/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 16:37:47 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Monografia]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[monografia]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[play framework]]></category>
		<category><![CDATA[spring mvc]]></category>
		<category><![CDATA[spring security]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=962</guid>
		<description><![CDATA[Este é meu tema de trabalho de conclusão de curso da especialização em Projeto e Desenvolvimento de Sistemas Baseados em Objetos para Ambiente Internet pela Universidade Tecnológica Federal do Paraná (UTFPR). Tive como orientador o professor especialista Diego de Carvalho, &#8230; <a href="http://fernandomantoan.com/monografia-2/estudo-de-caso-de-uma-estrutura-de-autenticacao-unica-utilizando-o-protocolo-oauth/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este é meu tema de trabalho de conclusão de curso da especialização em <a href="http://www.md.utfpr.edu.br/pos/informaticaV" target="_blank">Projeto e Desenvolvimento de Sistemas Baseados em Objetos para Ambiente Internet</a> pela <a title="UTFPR" href="http://www.utfpr.edu.br" target="_blank">Universidade Tecnológica Federal do Paraná</a> (UTFPR). Tive como orientador o professor especialista Diego de Carvalho, do campus de Pato Branco.</p>
<h2>Objetivo Geral</h2>
<p>Propor uma estrutura para fornecer autenticação única com o protocolo<br />
OAuth na plataforma Java, e implementar duas mini-aplicações que utilizem esta<br />
estrutura de autenticação, sendo elas de plataformas de programação diferentes.</p>
<h2>Conteúdo</h2>
<p>O trabalho começa com uma pesquisa bibliográfica sobre diversos tópicos que abrangem o protocolo OAuth. Primeiramente sobre os conceitos de segurança de software, autenticação, autorização, cloud computing, o protocolo HTTP, protocolos similares (OpenID e CAS), e uma pesquisa aprofundada no protocolo OAuth, tendo como base principalmente sua <a href="http://tools.ietf.org/html/rfc5849" target="_blank">especificação</a>.</p>
<h2>Tecnologias</h2>
<p>Para o desenvolvimento das aplicações utilizadas no estudo de caso foram utilizadas as seguintes tecnologias:</p>
<ul>
<li>Spring MVC e Spring Security OAuth</li>
<li>Hibernate</li>
<li>Zend Framework</li>
<li>Play Framework</li>
<li>HTML5 e CSS3.</li>
</ul>
<h2>Implementação</h2>
<p>Foi definido um servidor OAuth que fornece uma base de usuários e as funcionalidades de autorizar ou revogar o acesso de aplicações consumidoras. Foram implementados dois consumidores que utilizam este servidor para autenticação, um utilizando Zend Framework que é um sistema simples de cadastro de despesas e outro utilizando o Play Framework que é uma agenda de contatos. Os códigos dos três encontram-se na <a title="GitHub" href="https://github.com/fernandomantoan" target="_blank">minha página do GitHub</a>:</p>
<ul>
<li><a title="Servidor OAuth" href="https://github.com/fernandomantoan/oauth-provider-sample" target="_blank">Servidor</a></li>
<li><a title="Controle de Despesas" href="https://github.com/fernandomantoan/oauth-consumer-sample-zf" target="_blank">Controle de Despesas</a></li>
<li><a title="Agenda de Contatos" href="https://github.com/fernandomantoan/oauth-consumer-sample-play" target="_blank">Agenda de Contatos</a></li>
</ul>
<h2>Trabalhos Futuros</h2>
<ul>
<li>Adicionar os tokens gerados pelo framework Spring Security OAuth a um banco de dados, ao invés de uma fonte de dados volátil como a memória RAM. Isso pode ser implementado criando-se um novo serviço de tokens, que implemente a interface OAuthProviderTokenServices;</li>
<li>Após implementar o serviço de tokens mencionado acima, implementar um serviço de consumidores, permitindo que um administrador de sistema cadastre novas aplicações que podem tentar consumir dados dos proprietários de recursos capazes de se autenticar no sistema. Para isso é necessário implementar um novo serviço de consumidores, que implemente a interface ConsumerDetailsService;</li>
<li>Com estas duas melhorias implementadas, outro trabalho futuro é a capacidade de listar para o usuário as aplicações que o mesmo autorizou e, permitir que o mesmo possa revogar o acesso das aplicações cadastradas;</li>
<li>Outra melhoria é, ao revogar o acesso de uma aplicação, a capacidade de limpar os dados do usuário armazenados nessa aplicação, permitindo que a base de dados não fique inconsistente já que o proprietário do recurso não autoriza mais que o consumidor utilize seus dados.</li>
<li>Essas melhorias estão relacionadas à aplicação desenvolvida aqui, porém, quando a versão 2.0 do OAuth, que até esta data encontra-se em rascunho, se tornar uma especificação estável, uma melhoria importante é a estrutura para utilizar esta versão.</li>
</ul>
<h2>O Trabalho</h2>
<p>Confira abaixo o PDF contendo o trabalho completo:</p>
<div style="width:477px" id="__ss_12190875"><iframe src="http://www.slideshare.net/slideshow/embed_code/12190875" width="477" height="510" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">documents</a> from <a href="http://www.slideshare.net/fernandouhu" target="_blank">Fernando Geraldo Mantoan</a> </div>
</p></div>
<h2>Agradecimentos</h2>
<p>À minha namorada, aos meus pais e ao orientador professor Diego de Carvalho.</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/monografia-2/estudo-de-caso-de-uma-estrutura-de-autenticacao-unica-utilizando-o-protocolo-oauth/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/monografia-2/estudo-de-caso-de-uma-estrutura-de-autenticacao-unica-utilizando-o-protocolo-oauth/</feedburner:origLink></item>
		<item>
		<title>Introdução ao Quartz Enterprise Job Scheduler</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/LQCRN94EHJ4/</link>
		<comments>http://fernandomantoan.com/java/introducao-ao-quartz-enterprise-job-scheduler/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 14:24:53 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=903</guid>
		<description><![CDATA[Neste artigo apresento um estudo sobre a ferramenta de agendamento de tarefas Quartz. Este estudo foi desenvolvido para o Instituto de Tecnologia Aplicada e Inovação, onde atuo como Analista de Sistemas, visando uma introdução e explicação sobre os principais conceitos &#8230; <a href="http://fernandomantoan.com/java/introducao-ao-quartz-enterprise-job-scheduler/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Neste artigo apresento um estudo sobre a ferramenta de agendamento de tarefas Quartz. Este estudo foi desenvolvido para o Instituto de Tecnologia Aplicada e Inovação, onde atuo como Analista de Sistemas, visando uma introdução e explicação sobre os principais conceitos do Quartz, para utilização em um projeto.</p>
<h2>Introdução</h2>
<p>O Quartz é um serviço de agendamento de tarefas que pode ser integrado, ou utilizado virtualmente, em qualquer aplicação Java SE ou Java EE. A ferramenta pode ser utilizada para criar agendas simples ou complexas que executam dezenas, centenas ou até milhares de tarefas, as quais são definidas utilizando componentes padrão da plataforma Java, que são codificados para suprir as necessidades da aplicação. O Quartz Scheduler fornece diversos recursos corporativos, como suporte a transações JTA ou clusterização.</p>
<h2>Scheduler</h2>
<p>O <strong>Scheduler</strong> é o componente principal do Quartz, e é responsável por gerenciar a execução de <em>jobs</em> (tarefas). A partir do <strong>Scheduler</strong> o desenvolvedor pode agendar, iniciar a execução e parar a execução de <em>jobs</em>. Para construir um <strong>Scheduler</strong> deve-se utilizar uma classe que implementa o padrão de projeto <em>Factory</em>, no Quartz representado pela <em>interface</em> <strong>SchedulerFactory</strong>. Existem duas classes que implementam esta <em>interface</em>: <strong>StdSchedulerFactory</strong> e <strong>DirectSchedulerFactory</strong>. A primeira classe permite a utilização de um arquivo <em>properties</em> para configuração e a segunda implementa um segundo padrão de projeto: o <em>Singleton</em>.</p>
<p>Após obter um <strong>Scheduler</strong>, pode-se iniciar a execução do agendamento a partir do método <strong>start()</strong>, agendar novos <em>jobs</em> com o método <strong>scheduleJob()</strong> e parar o agendador com o método <strong>shutdown()</strong>. Ao se agendar um <em>job</em> com o método <strong>scheduleJob()</strong>, é necessário definir dois parâmetros:</p>
<ul>
<li>O primeiro define o <em>job</em> que será executado, representado pela interface <strong>Job</strong>;</li>
<li>O segundo define o <em>trigger</em>, representado pela <em>interface</em> <strong>Trigger</strong>, que corresponde às condições de agendamento para execução do <em>job</em> em questão.</li>
</ul>
<h2>Job</h2>
<p>Um <em>job</em> é uma tarefa a ser executada, que no Quartz nada mais é do que uma classe que implementa a <em>interface</em> <strong>Job</strong>, e que agrega todo o código necessário para fazer a funcionalidade específica do <em>job</em> em questão. Um <em>job</em> pode também receber parâmetros para seu correto funcionamento e isso é feito a partir da classe <strong>JobDetail</strong>.</p>
<p>Ao se implementar a <em>interface</em> <strong>Job</strong>, deve-se implementar também o método <strong>execute()</strong>, que recebe como parâmetro um <strong>JobExecutionContext</strong> e lança uma exceção do tipo <strong>JobExecutionException</strong>. Dentro do método <strong>execute()</strong> estará todo o código referente ao <em>job</em> em questão. Um exemplo de <em>job</em> é uma varredura automática de <em>spams</em> em um e-mail, ou, uma busca por <em>tags</em> duplicadas de um produto para limpeza em um banco de dados de algum comércio eletrônico.</p>
<p>Para a criação de um <em>job</em> é utilizada a classe <strong>JobBuilder</strong>, que define a classe do <em>job</em> implementado a partir do método <strong>newJob()</strong>, a identidade do <em>job</em> no método <strong>withIdentity()</strong> e a instanciação do mesmo no método <strong>build()</strong>.</p>
<h2>Trigger</h2>
<p>Um objeto <em>trigger</em> é utilizado para disparar a execução de <em>jobs</em>. Quando um <em>job</em> é agendado, é feita a instância de um <em>trigger</em> e suas propriedades são configuradas para satisfazer o agendamento necessário para a aplicação. Existem alguns <em>triggers</em> pré-definidos na biblioteca Quartz, como, por exemplo, o <strong>SimpleTrigger</strong> e o <strong>CronTrigger</strong>.</p>
<p>Para a construção de um <em>trigger</em> é utilizada a classe <strong>TriggerBuild</strong> que implementa métodos utilizando <em>Domain Specific Language</em> (DSL) e permite a configuração dos dados do <em>trigger</em>, como, por exemplo, sua identidade a partir do método <strong>withIdentity()</strong>, seus dados de agendamento a partir do método <strong>withSchedule()</strong>, e a instanciação do <em>trigger</em> a partir do método <strong>build()</strong>. O método <strong>build()</strong> retorna uma classe que implementa a <em>interface</em> <strong>Trigger</strong>.</p>
<p>O <strong>CronTrigger</strong> é um tipo de <em>trigger</em> que é útil para agendamentos baseados em calendários, como, por exemplo, “uma execução deve ocorrer às quartas e quintas às 12:00h” ou “uma execução deve ocorrer todos os dias às 08:00h”, e assim por diante.</p>
<p>Um <strong>CronTrigger</strong> é construído ao se definir no método “<strong>TriggerBuild.withSchedule</strong>” um agendamento do tipo <strong>CronSchedule</strong>. Este tipo de agendamento é construído a partir do método estático <strong>cronSchedule</strong> da classe <strong>CronScheduleBuilder</strong> que recebe como parâmetro uma expressão <em>cron</em>.</p>
<p>Para formar uma expressão <em>cron</em>, alguns requisitos devem ser satisfeitos. Primeiramente deve-se conhecer a ordem dos parâmetros:</p>
<ul>
<li>Segundos;</li>
<li>Minutos;</li>
<li>Horas;</li>
<li>Dia do mês;</li>
<li>Mês;</li>
<li>Dia da semana;</li>
<li>Ano (opcional).</li>
</ul>
<p>Por exemplo, uma expressão <em>cron</em> que será executada todas às quartas-feiras às 12:00PM é escrita da seguinte forma: “0 0 12 ? * WED”. Outro exemplo de expressão demonstra uma tarefa executada todos os dias, às 08:00AM e 12:00PM: “0 0 8,12 * * *”.</p>
<h2>Exemplo</h2>
<p>Para ilustrar todos os conceitos apresentados anteriormente foi desenvolvido um exemplo simples, que simula a utilização de um <strong>CronTrigger</strong> e define um <em>job</em> customizado que implementa a <em>interface</em> <strong>Job</strong>.</p>
<p>Este <em>job</em> será responsável por exibir uma mensagem de texto simples indicando que foi executado a cada 10 segundos todos os dias. O código do <em>job</em> foi definido conforme a listagem abaixo.</p>
<pre class="brush: java; title: ; notranslate">
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        System.err.println(&quot;Servico executado conforme agendamento&quot;);
    }
}
</pre>
<p>A classe principal que faz a execução deste <em>job</em> foi definida conforme a listagem a baixo.</p>
<pre class="brush: java; title: ; notranslate">
public class Main {
    public static void main(String[] args) {
        try {
            SchedulerFactory schedFact = new StdSchedulerFactory();
            Scheduler sched = schedFact.getScheduler();
            sched.start();

            JobDetail job = JobBuilder.newJob(MyJob.class)
                .withIdentity(&quot;myJob&quot;, &quot;group1&quot;)
                .build();

            Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity(&quot;myTrigger&quot;, &quot;group1&quot;)
                .withSchedule(CronScheduleBuilder.cronSchedule(&quot;0/10 * * * * ?&quot;))
                .build();

            sched.scheduleJob(job, trigger);
        } catch (Exception e) {
            System.out.println(&quot;erro&quot;);
            e.printStackTrace();
        }
    }
}
</pre>
<p>Neste exemplo de código é obtido uma instância de <strong>Scheduler</strong> a partir da <em>Factory</em> <strong>StdSchedulerFactory</strong>, o agendamento é iniciado, é criado um novo <em>job</em> do tipo <strong>MyJob</strong>, um novo <strong>CronTrigger</strong> que possui a expressão <em>cron</em> “0/10 * * * * ?” que significa “a cada 10 segundos”, e o <em>job</em> é agendado conforme o <em>trigger</em> criado.</p>
<h2>Conclusão</h2>
<p>Apesar de ser um exemplo simples, com ele é possível verificar o funcionamento de cada componente necessário para a execução de um <em>job</em> agendado, e a partir dele é possível ver sua aplicabilidade no cenário de alguma aplicação que tenha estas necessidades.</p>
<h2>Referências</h2>
<ul>
<li><a href="    http://quartz-scheduler.org/documentation/quartz-2.1.x/" target="_blank">http://quartz-scheduler.org/documentation/quartz-2.1.x/</a>;</li>
<li><a href="http://adminschoice.com/crontab-quick-reference" target="_blank">http://adminschoice.com/crontab-quick-reference</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/java/introducao-ao-quartz-enterprise-job-scheduler/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/java/introducao-ao-quartz-enterprise-job-scheduler/</feedburner:origLink></item>
		<item>
		<title>Artigo na SQL Magazine</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/bN3qol8cBiY/</link>
		<comments>http://fernandomantoan.com/frameworks/zend-framework/artigo-na-sql-magazine/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 15:58:30 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=884</guid>
		<description><![CDATA[Já aconteceu a muito tempo, porém eu não havia compartilhado essa conquista aqui no blog. Um artigo meu entitulado &#8220;Implementação em MVC utilizando o Zend Framework&#8221; foi publicado na SQL Magazine edição 84. Para ver o conteúdo da revista clique &#8230; <a href="http://fernandomantoan.com/frameworks/zend-framework/artigo-na-sql-magazine/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 135px"><img src="http://www.devmedia.com.br/loja/img/capaSQL84_M.jpg" alt="" width="125" height="170" /><p class="wp-caption-text">SQL Magazine 84</p></div>
<p>Já aconteceu a muito tempo, porém eu não havia compartilhado essa conquista aqui no blog. Um artigo meu entitulado &#8220;<strong>Implementação em MVC utilizando o Zend Framework</strong>&#8221; foi publicado na SQL Magazine edição 84. Para ver o conteúdo da revista <a title="Revista SQL Magazine 84" href="http://www.devmedia.com.br/post-19073-Revista-SQL-Magazine-84.html" target="_blank">clique aqui</a>. Para acessar o artigo <a title="Implementação em MVC utilizando o Zend Framework" href="http://www.devmedia.com.br/post-19072-Implementacao-em-MVC-utilizando-o-Zend-Framework.html" target="_blank">clique aqui</a>.</p>
<p>Espero que nesse ano que virá eu consiga mais publicações <img src='http://fernandomantoan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/frameworks/zend-framework/artigo-na-sql-magazine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/frameworks/zend-framework/artigo-na-sql-magazine/</feedburner:origLink></item>
		<item>
		<title>Voltando a ativa</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/C2BqQ8K18DU/</link>
		<comments>http://fernandomantoan.com/offtopic/voltando-a-ativa/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 13:40:58 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=863</guid>
		<description><![CDATA[Olá pessoal, tudo bem? Estou retomando as atividades aqui no blog, estava envolvido em diversas coisas pessoais e finalmente conclui elas. Estou dando uma revisada em alguns artigos aqui e estou removendo os referentes à arquitetura de software com CodeIgniter. &#8230; <a href="http://fernandomantoan.com/offtopic/voltando-a-ativa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, tudo bem? Estou retomando as atividades aqui no blog, estava envolvido em diversas coisas pessoais e finalmente conclui elas. Estou dando uma revisada em alguns artigos aqui e estou <strong>removendo</strong> os referentes à arquitetura de software com CodeIgniter. Essa atitude é necessária, pois ficou óbvio que a arquitetura proposta se tornou obsoleta principalmente por não suportar as versões recentes do framework e por eu ter adotado o Zend Framework como escolha padrão para as aplicações. Se alguém ainda assim se interessar pelos artigos me disponibilizo a gerar um PDF compilado com todo o conteúdo.</p>
<p>Estou escrevendo artigos sobre o Zend Framework que serão publicados até o final de semana aqui no blog e, provavelmente, no iMasters. Nesses artigos estarei abordando: <strong>Zend_Db</strong>, <strong>Zend_Locale</strong>, <strong>Zend_Translate</strong>, <strong>Doctrine2</strong> e iniciarei novas áreas aqui no blog: <strong>Play! Framework</strong>, <strong>JSF </strong>e <strong>OAuth</strong>.O OAuth foi o tema do meu trabalho de conclusão de curso da minha especialização na Universidade Tecnológica Federal do Paraná, estou viabilizando a disponibilização do PDF do trabalho e a criação de um repositório no Github para as aplicações desenvolvidas neste trabalho.</p>
<p>Instalei também no blog um plugin &#8220;social&#8221;, para permitir um &#8220;Curtir&#8221; no Facebook, compartilhar no Twitter e Linkedin, acho que isso vai ser muito bom para saber o que o pessoal anda achando do conteúdo. Bom, é isso que queria passar a todos, aguardem mais um pouco que logo logo saem novos artigos de Zend Framework. Vale a pena esperar! <img src='http://fernandomantoan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/offtopic/voltando-a-ativa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/offtopic/voltando-a-ativa/</feedburner:origLink></item>
		<item>
		<title>Zend Certified Engineer PHP 5.3</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/K5CCM61APj4/</link>
		<comments>http://fernandomantoan.com/php/zend-certified-engineer-php-5-3/#comments</comments>
		<pubDate>Sat, 01 Oct 2011 10:37:33 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Certificações]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php5.3]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=796</guid>
		<description><![CDATA[Olá pessoal, tudo bem? Ontem às 10 horas da manhã fiz o teste da Zend para obter a certificação de PHP 5.3, e vou detalhar aqui meu processo de estudo e o material que eu  utilizei, para dar uma luz &#8230; <a href="http://fernandomantoan.com/php/zend-certified-engineer-php-5-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.zend.com/topics/zce-php5-3-logo.gif" alt="Zend Certified Engineer PHP5.3" width="73" height="68" />Olá pessoal, tudo bem? Ontem às 10 horas da manhã fiz o teste da Zend para obter a <a href="http://www.zend.com/services/certification/php-5-certification/" target="_blank">certificação de PHP 5.3</a>, e vou detalhar aqui meu processo de estudo e o material que eu  utilizei, para dar uma luz a quem quer se preparar pra prova e não consegue achar muitas informações na internet.</p>
<p>Material que utilizei para estudo:</p>
<ul>
<li><a href="http://www.phparch.com/books/phparchitects-zend-php-5-certification-study-guide-2nd-edition/" target="_blank">php|architect&#8217;s Zend PHP 5 Certification Study Guide</a>;</li>
<li><a href="http://www.zend.com/en/download/487" target="_blank">Zend PHP 5.3 Study Guide</a>;</li>
<li><a href="http://www.slideshare.net/lornajane/zend-certification-preparation-tutorial" target="_blank">Zend Certification Preparation Tutorial</a>;</li>
<li><a href="http://www.php.net/manual/en/index.php" target="_blank">PHP Manual</a>.</li>
</ul>
<p>Os exercícios e testes práticos que fiz são os do próprio guia de estudos da Zend e, também os seguintes:</p>
<ul>
<li><a href="http://www.phpriot.com/quiz/" target="_blank">PHPRiot Quiz</a>;</li>
<li>Vulcan Zend PHP Certification Mock Test.</li>
</ul>
<p>Lembrando que, os mocks da Vulcan não estão mais disponíveis, eu apenas reutilizei créditos que tinha da certificação de PHP 5.</p>
<p>Uma dica que dou é que estudem a fundo o manual do PHP. Muita coisa da prova não é abordado nos outros PDFs, mas a partir do manual as coisas ficam mais fáceis.</p>
<p>Agradeço a Deus, minha namorada, meus familiares e amigos pelo apoio. E boa sorte para quem vai fazer a prova.</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/php/zend-certified-engineer-php-5-3/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/php/zend-certified-engineer-php-5-3/</feedburner:origLink></item>
		<item>
		<title>Simplicidade de Código</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/gOLcOJAxuqk/</link>
		<comments>http://fernandomantoan.com/programacao/simplicidade-de-codigo/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 18:44:21 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Pensamentos]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[pensamentos]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[qualidade]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=758</guid>
		<description><![CDATA[O blog está completamente empoeirado e com teias de aranha. A culpa é completamente minha, tenho tido vários problemas pessoais que me tiraram todo o tempo livre que eu dedicava à escrita de artigos. É difícil de se acostumar e &#8230; <a href="http://fernandomantoan.com/programacao/simplicidade-de-codigo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O blog está completamente empoeirado e com teias de aranha. A culpa é completamente minha, tenho tido vários problemas pessoais que me tiraram todo o tempo livre que eu dedicava à escrita de artigos. É difícil de se acostumar e se organizar de acordo com as novidades da vida. Mas hoje, para tirar um pouco a poeira e as teias de aranha, vou falar de um assunto que tem se passado por minha cabeça a alguns meses, uma visão pessoal sobre <strong>Simplicidade de Código</strong>.</p>
<p>Minha idéia é fazer uma reflexão breve e esperar o feedback de vocês leitores, para refletirmos sobre este assunto tão comentado e fomentado por empresas nacionais e internacionais.</p>
<h2>O que você entende por Simples?</h2>
<p>A primeira pergunta a se fazer é: O que você entende por simples? Bom, isso é algo que deve-se pensar muito para responder, principalmente para não dizer coisas confusas. Mas será que existe uma forma de falar sobre isso claramente? Vamos tentar.</p>
<p>Para mim algo simples é algo facilmente compreensível e identificável. Em User Experience, o termo simples é a chave de tudo, já que os usuários podem facilmente aproveitar o uso de alguma ferramenta, software, etc. Este termo é bastante empregado na definição dos produtos da Apple, talvez por este termo sempre ter sido pregado em seus produtos ou por realmente os produtos serem simples.</p>
<h2>Código-fonte</h2>
<p>Mas trazendo para o código, realmente existe o termo simplicidade? Sim  e não. Códigos desenvolvidos por outras pessoas tendem a ser difíceis  de se entender, principalmente por cada um ter uma visão particular  sobre a melhor forma de se fazer uma determinada tarefa. Mesmo com  documentação e tudo mais, existe um esforço mínimo para a compreensão da  visão que o outro desenvolvedor tem.</p>
<p>Mas utilizando princípios de DRY (Don&#8217;t Repeat Yourself) e KISS (Keep It Simple, Stupid), é possível minimizar esta complexidade. Utilizar métodos e funções já prontas da própria linguagem de programação, padronizar códigos repetitivos, utilizar orientação a objetos, utilizar Domain Specific Language, separar melhor o código em camadas, delegação de responsabilidades etc.</p>
<p>Só que tendo estas premissas em mente, você acaba trazendo a complexidade para si próprio. Como assim? Você pensa e repensa antes de codificar algo, o que pode afetar até sua produtividade. Realmente não existe muita mágica para diminuir complexidade de código&#8230; Só que existe algo que pode ser o melhor amigo do programador.</p>
<h2>Refatoração</h2>
<p>Refatorar código é uma ótima forma de minimizar a complexidade de código. Agora talvez seja a hora onde você, leitor, fale bastante mal de mim, por escrever tanta coisa e chegar em um ponto tão óbvio para todos. Mas essa é a mais pura verdade, refatorar é ótimo e ajuda muito a diminuir a complexidade do seu código.</p>
<p>Só que não se limite a apenas você mesmo refatorar o seu código, passe ele para amigos, colegas, para seu chefe e etc. vendo a opinião e as alterações de cada um, o que pode acabar tendendo a uma quantidade mínima de linhas e uma clareza maior.</p>
<h2>Mantenha o foco</h2>
<p>Por último, uma dica importante é manter o foco. Por experiência própria digo que esquentar a cabeça com a melhor forma de programar pode acabar te trazendo problemas de produtividade. Resolva o problema, faça funcionar, escreva os testes para garantir que seu código faz o que deveria fazer e refatore após tudo pronto.</p>
<p>Simples assim&#8230; Você já terá algo pronto e testado, poderá se dedicar a refatorar este código e não vai ficar horas e horas quebrando a cabeça para tentar achar a solução mais perfeita do que você está fazendo. Não tenho experiência suficiente para falar sobre BDD (Behavior Driven Development) mas dizem que utilizar ele da maneira correta traz muitos benefícios na questão de testes, entendimento e legibilidade de código, DSL e etc.</p>
<p>Bom, esse é um assunto que pode gerar uma discussão boa e quero agora ver de <strong>você</strong>, leitor, uma opinião sobre tudo isso. Como você faz para diminuir a complexidade do seu código? Você gosta e acredita na refatoração?</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/programacao/simplicidade-de-codigo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/programacao/simplicidade-de-codigo/</feedburner:origLink></item>
		<item>
		<title>Meu ambiente de trabalho em 7 itens</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/HJ7QzYuNeFc/</link>
		<comments>http://fernandomantoan.com/offtopic/meu-ambiente-de-trabalho-em-7-itens/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 22:30:12 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Offtopic]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=739</guid>
		<description><![CDATA[Há algum tempo atrás o @duodraco bolou o meme &#8220;Seu ambiente de trabalho em 7 itens&#8221; e o @brgomes me indicou para participar, portanto aí vai: OS: Ubuntu 10.10: Distro GNU/Linux baseada no Debian, consegue unir o ótimo gerenciador de &#8230; <a href="http://fernandomantoan.com/offtopic/meu-ambiente-de-trabalho-em-7-itens/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás o <a href="http://duodra.co/post/seu-ambiente-de-trabalho-em-7-itens/">@duodraco</a> bolou o meme &#8220;Seu ambiente de trabalho em 7 itens&#8221; e o <a href="http://www.brgomes.com/blog/meu-ambiente-de-trabalho-em-7-itens/">@brgomes</a> me indicou para participar, portanto aí vai:</p>
<ol>
<li><strong>OS: Ubuntu 10.10:</strong> Distro GNU/Linux baseada no Debian, consegue unir o ótimo gerenciador de pacotes <strong>apt-get</strong> com um visual muito bonito, além de ser bem estável.</li>
<li><strong>IDE: Zend Studio 8:</strong> IDE baseada em Eclipse criada pela Zend, possui suporte ao Zend_Tool, virtualização, debugger, code hint, PHPDoc, PHPUnit, etc. Para mim é de longe a melhor IDE para PHP e não vejo grandes gargalos de performance.</li>
<li><strong>Subversion:</strong> Sistema de controles de versão bem famoso, possui conector nativo no Zend Studio, além de diversos programas que oferecem integração direta ao SO (como Tortoise ou RabbitCVS). Apesar de eu estar interessado no GIT, ainda não consegui estudá-lo, então continuo no SVN.</li>
<li><strong>PostgreSQL:</strong> Não muito famoso para aplicações web, mas um ótimo sistema gerenciador de banco de dados. Possui muitas das funcionalidades de outros bancos de dados (como MySQL), além do grande plugin postgis.</li>
<li><strong>PHPUnit:</strong> Usado na criação de testes unitários das aplicações que desenvolvo. Possui uma ótima integração com o Zend Studio, além de ser de fácil instalação/configuração.</li>
<li><strong>Browsers:</strong> Para o desenvolvimento de aplicações web todos os browsers mais famosos são necessários. Isso inclui Internet Explorer, Mozilla Firefox, Opera, Safari e Google Chrome.</li>
<li><strong>Frameworks: Zend Framework + Doctrine 2:</strong> Uma dupla quase perfeita, o Doctrine 2 simplifica toda a persistência das aplicações, além de permitir o trabalho com entidades PHP simples, sem atributos ou heranças obrigatórias. O Zend Framework me fornece todas as ferramentas para construir as aplicações, desde um framework MVC completo, até componentes de validação, internacionalização, acesso a serviços web e etc.</li>
</ol>
<p>Bom, esses são os principais itens que gostaria de destacar sobre meu ambiente de trabalho. Agora passando a bola pra frente, indico os seguintes nomes:</p>
<p><a href="http://blog.will.eti.br/2011/meu-ambiente-de-trabalho-em-7-itens/">@wcomnisky</a><br />
@giolvani<br />
@faustovaz</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/offtopic/meu-ambiente-de-trabalho-em-7-itens/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/offtopic/meu-ambiente-de-trabalho-em-7-itens/</feedburner:origLink></item>
		<item>
		<title>Slides da palestra Desfrutando os Componentes do Zend Framework</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/EwBVMoJip8M/</link>
		<comments>http://fernandomantoan.com/frameworks/zend-framework/slides-da-palestra-desfrutando-os-componentes-do-zend-framework/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 17:20:24 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Latinoware]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=728</guid>
		<description><![CDATA[Olá pessoal, tudo bem? Hoje às 10 horas apresentei na Latinoware a palestra &#8220;Desfrutando os Componentes do Zend Framework&#8221;. Apesar do atraso e de ter me decepcionado bastante com a organização do evento, no final tudo deu certo e espero &#8230; <a href="http://fernandomantoan.com/frameworks/zend-framework/slides-da-palestra-desfrutando-os-componentes-do-zend-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, tudo bem? Hoje às 10 horas apresentei na <a href="http://latinoware.org">Latinoware</a> a palestra &#8220;Desfrutando os Componentes do Zend Framework&#8221;. Apesar do atraso e de ter me decepcionado bastante com a organização do evento, no final tudo deu certo e espero que a palestra tenha sido boa. Críticas e sugestões são sempre bem-vindas, por favor podem enviar nos comentários.</p>
<p>Segue abaixo os slides da palestra:</p>
<div id="__ss_5725965" style="width: 425px;"><a title="Desfrutando os Componentes do Zend Framework" href="http://www.slideshare.net/fernandouhu/desfrutando-os-componentes-do-zend-framework-5725965">Desfrutando os Componentes do Zend Framework</a><object id="__sse5725965" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=desfrutandocomponenteszffinal-101110074126-phpapp01&amp;stripped_title=desfrutando-os-componentes-do-zend-framework-5725965&amp;userName=fernandouhu" /><param name="name" value="__sse5725965" /><param name="allowfullscreen" value="true" /><embed id="__sse5725965" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=desfrutandocomponenteszffinal-101110074126-phpapp01&amp;stripped_title=desfrutando-os-componentes-do-zend-framework-5725965&amp;userName=fernandouhu" name="__sse5725965" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/fernandouhu">Fernando Geraldo Mantoan</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/frameworks/zend-framework/slides-da-palestra-desfrutando-os-componentes-do-zend-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/frameworks/zend-framework/slides-da-palestra-desfrutando-os-componentes-do-zend-framework/</feedburner:origLink></item>
		<item>
		<title>Zend Framework Certified Engineer</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/D7maYTHMkeE/</link>
		<comments>http://fernandomantoan.com/frameworks/zend-framework/zend-framework-certified-engineer/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 17:43:52 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Certificações]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=698</guid>
		<description><![CDATA[Olá pessoal, como havia dito em outro post, estava me preparando para a certificação de Zend Framework, e nesta sexta-feira 10 de Setembro de 2010, fiz a prova e obtive a certificação. Gostaria de agradecer a Deus, minha família e &#8230; <a href="http://fernandomantoan.com/frameworks/zend-framework/zend-framework-certified-engineer/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Zend Framework Certified Engineer" src="http://static.zend.com/img/yellowpages/zf_zce_logo.gif" alt="Zend Framework Certified Engineer" width="73" height="68" /> Olá pessoal, como havia dito em outro post, estava me preparando para a certificação de Zend Framework, e nesta sexta-feira 10 de Setembro de 2010, fiz a prova e obtive a certificação. Gostaria de agradecer a Deus, minha família e a todos que me apoiaram nessa jornada. Eu achei a prova um pouco mais difícil do que a de PHP5, talvez por não haver simulados, ou pelo Zend Framework ser bem extenso, mas no final tudo deu certo.</p>
<p>Para me preparar para a prova utilizei:</p>
<ul>
<li><a title="Zend Framework em Ação" href="http://altabooks.tempsite.ws/product_info.php?products_id=350&amp;osCsid=bskd0o8afeeic9lufapabun6t4" target="_blank">Zend Framework em Ação</a>;</li>
<li><a title="Zend Framework Study Guide" href="http://www.zend.com/en/download/173" target="_blank">Zend Framework Certification Study Guide (Requer login);</a></li>
<li><a title="Zend Framework Componentes Poderosos para PHP" href="http://novatec.com.br/livros/zendframework/" target="_blank">Zend Framework Componentes Poderosos para PHP</a>;</li>
<li><a title="Zend Framework Certification a Refresher" href="http://akrabat.com/wp-content/uploads/ZendCon09-ZF-Certification-Refresher.pdf" target="_blank">Zend Framework Certification a Refresher</a>;</li>
<li><a title="Zend Framework Reference Guide - 1.5.3" href="http://framework.zend.com/releases/ZendFramework-1.5.3/ZendFramework-1.5.3-manual-en.zip" target="_blank">Zend Framework Reference Guide &#8211; 1.5.3</a>.</li>
</ul>
<p>Espero que quem esteja interessado na certificação siga em frente e minha sugestão é que realmente estude e conheça os principais componentes exigidos, interfaces, constantes e os padrões de desenvolvimento com o framework. Um abraço e até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/frameworks/zend-framework/zend-framework-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/frameworks/zend-framework/zend-framework-certified-engineer/</feedburner:origLink></item>
		<item>
		<title>Autorização com Zend Framework</title>
		<link>http://feedproxy.google.com/~r/fernandomantoan/~3/9lvA4IpONgw/</link>
		<comments>http://fernandomantoan.com/frameworks/zend-framework/autorizacao-com-zend-framework/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 23:44:52 +0000</pubDate>
		<dc:creator>Fernando Mantoan</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[zend_acl]]></category>
		<category><![CDATA[zend_auth]]></category>
		<category><![CDATA[zend_form]]></category>

		<guid isPermaLink="false">http://fernandomantoan.com/?p=613</guid>
		<description><![CDATA[Veremos aqui uma explicação detalhada dos componentes de Autorização do Zend Framework, demonstrando como restringir acesso a recursos de um sistema, baseando-se nos privilégios que um usuário autenticado possui. Para este artigo, é essencial o estudo do artigo sobre Autenticação com Zend Framework. <a href="http://fernandomantoan.com/frameworks/zend-framework/autorizacao-com-zend-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Veremos aqui uma explicação detalhada dos componentes de Autorização do Zend Framework, demonstrando como restringir acesso a recursos de um sistema, baseando-se nos privilégios que um usuário autenticado possui. Para este artigo, é essencial o estudo do artigo sobre <a title="Autenticação com Zend Framework" href="http://fernandomantoan.com/frameworks/zend-framework/autenticacao-com-zend-framework/" target="_blank">Autenticação com Zend Framework</a>.</p>
<h2>Conceitos</h2>
<p>Autorização é o ato de verificar as permissões de um usuário já autenticado no sistema e, baseando-se nessas permissões, permitir ou bloquear o acesso deste usuário a determinados recursos da aplicação. Se, por exemplo, em um Sistema de Gestão de Conteúdo (CMS), o usuário logado é um escritor, ele poderia ter acesso à escrita de artigos, porém não poderia ter acesso ao cadastro de novos usuários, pode-se obter este tipo de funcionalidade por meio de um componente de autorização. No Zend Framework este componente é o <strong>Zend_Acl</strong>, que fornece a funcionalidade de Lista de Controle de Acesso (ACL) e gestão de privilégios. Em geral, uma aplicação pode usar esta funcionalidade para controlar o acesso a certos objetos protegidos, requeridos por outros objetos.</p>
<p>Existem alguns termos utilizados para melhor explanar as entidades envolvidas no controle de acesso, cada um deles é detalhado a seguir.</p>
<h4>Papel (role)</h4>
<p>Um papel corresponde a uma responsabilidade de um usuário dentro de um sistema como, por exemplo, o papel de &#8220;colunista&#8221; ou de &#8220;membro&#8221;. Isto é encapsulado através da classe <strong>Zend_Acl_Role</strong>, que é uma classe simples que apenas armazena o nome do papel. Existe também herança de papéis, onde ao se herdar de um papel, é possível fazer tudo que o papel pai faz, além das ações específicas do papel filho. Para se criar um papel e adicioná-lo  na lista de controle de acesso, o seguinte código é necessário:</p>
<pre class="brush: php; title: ; notranslate">
$papelMembro = new Zend_Acl_Role('membro');
$acl = new Zend_Acl();
$acl-&gt;addRole($papelMembro);
</pre>
<p>Para utilizar a herança de papéis basta passar o nome do papel pai como segundo parâmetro do método <strong>addRole()</strong>. Para exemplificar isso o papel &#8220;colunista&#8221; irá herdar de &#8220;membro&#8221;, pois um colunista pode fazer tudo o que um membro pode, além de possuir permissões especiais para criar colunas. O código deste exemplo é apresentado abaixo:</p>
<pre class="brush: php; title: ; notranslate">
$papelMembro = new Zend_Acl_Role('membro');
$papelColunista = new Zend_Acl_Role('colunista');
$acl = new Zend_Acl();
$acl-&gt;addRole($papelMembro);
$acl-&gt;addRole($papelColunista, 'membro');
</pre>
<h4>Recurso (resource)</h4>
<p>Um recurso é algo a ser protegido, o que pode ser um controlador ou uma ação. Um recurso é encapsulado pela classe <strong>Zend_Acl_Resource</strong>, que simplesmente armazena o nome do recurso que será protegido. Assim como no caso do <strong>Zend_Acl_Role</strong>, a classe <strong>Zend_Acl_Resource</strong> oferece suporte a herança, esta sendo definida no segundo parâmetro do método <strong>add()</strong> de <strong>Zend_Acl</strong>. Um exemplo de utilização de recursos é o caso de um sistema de ERP onde usuários do papel &#8220;administrador&#8221; podem ter acesso ao controlador <strong>manutencao</strong>, já usuários do papel &#8220;operador&#8221; podem ter acesso ao controlador <strong>produto</strong>. Para criar estes recursos o seguinte código é necessário:</p>
<pre class="brush: php; title: ; notranslate">
$acl = new Zend_Acl();
$acl-&gt;addResource(new Zend_Acl_Resource('manutencao'));
$acl-&gt;addResource(new Zend_Acl_Resource('produto'));
</pre>
<h3>Privilégio (privilege)</h3>
<p>Um dado recurso pode ter diversas permissões a um determinado papel, estas permissões são, tipicamente, baseadas nas operações que serão executadas. Exemplos destas operações podem ser ações de um controlador, como, por exemplo: &#8220;adicionar&#8221; e &#8220;visualizar&#8221;. Este tipo de acesso exigido é facilmente configurado com dois métodos do Zend_Acl: <strong>allow()</strong> e <strong>deny()</strong>. Um exemplo permitindo e negando ações do controlador <strong>artigos</strong> ao papel <strong>membro</strong> é exibido a seguir:</p>
<pre class="brush: php; title: ; notranslate">
$acl-&gt;allow('membro', 'artigos', 'visualizar');
$acl-&gt;deny('membro', 'artigos', 'adicionar');
</pre>
<p>Após permitir ou negar privilégios é possível verificar se um determinado papel tem acesso a um privilégio com o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
if ($acl-&gt;isAllowed('member', 'artigos', 'visualizar') {
	echo &quot;acesso permitido&quot;;
}
</pre>
<p>Estes são os principais conceitos e métodos relacionados aos componentes de autorização do Zend Framework, agora é hora de implementar um sistema de autorização integrado com o MVC do framework. Existem diversas formas de se implementar esta funcionalidade, a maneira demonstrada neste artigo é apenas uma delas.</p>
<h2>Codificando a Autorização</h2>
<p>Após uma introdução sobre os componentes de autorização do Zend Framework é hora de integrar as funcionalidades para aplicar a autorização ao MVC do framework. Antes de mais nada estou partindo do pressuposto de que o leitor possui todos os fontes do artigo <a title="Autenticação com Zend Framework" href="../frameworks/zend-framework/autenticacao-com-zend-framework/" target="_blank">Autenticação com Zend Framework</a>, para reaproveitar o código desenvolvido neste artigo.</p>
<h3>Banco de Dados e configurações iniciais</h3>
<p>O banco de dados do artigo anterior sofreu algumas modificações, agora foi criada uma tabela para armazenar os perfis (papéis) suportados por essa aplicação. Dois perfis de exemplo são criados, o primeiro corresponde ao perfil de administrador, que pode ter acesso a todos os recursos protegidos e o segundo ao perfil de escritor, que pode apenas acessar o controlador de notícias. Um usuário para cada perfil também foi criado. O SQL do banco de dados é apresentado abaixo:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE `perfil`(
 id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 nome VARCHAR(30)
)ENGINE=InnoDB;
CREATE TABLE `usuario`(
 id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 login VARCHAR(30) NOT NULL UNIQUE,
 senha VARCHAR(60) NOT NULL,
 nome_completo VARCHAR(100) NOT NULL,
 perfil_id INT UNSIGNED NOT NULL,
 FOREIGN KEY(`perfil_id`) REFERENCES `perfil`(`id`)
 ON UPDATE CASCADE
 ON DELETE CASCADE
)ENGINE=InnoDB;
INSERT INTO `perfil`(nome) VALUES ('admin'), ('writer');
INSERT INTO `usuario`(login, senha, nome_completo, perfil_id) VALUES ('admin', SHA1('admin'), 'Administrador', 1), ('escritor', SHA1('escritor'), 'Escritor', 2);
</pre>
<p>O arquivo de configurações <strong>application/configs/application.ini</strong> desenvolvido no artigo anterior não sofrerá alterações impactantes, algumas linhas são adicionadas para configurar as namespaces do <strong>autoloader</strong> do framework e incluir o plugin de autenticação, que cuidará da parte de verificar o usuário logado e suas permissões, implementado mais adiante. Estas linhas podem ser adicionadas logo acima da seção <strong>[staging : production]</strong>:</p>
<pre class="brush: plain; title: ; notranslate">
autoloaderNamespaces[] = &quot;Aplicacao&quot;
resources.frontController.plugins.auth = &quot;Aplicacao_Plugin_Auth&quot;
</pre>
<p>A próxima etapa é adicionar ao <strong>Bootstrap</strong> a inicialização da classe de ACL que irá popular todas as regras de autorização suportadas pela aplicação. Dentro do arquivo <strong>application/Bootstrap.php</strong> basta adicionar o seguinte método à classe <strong>Bootstrap</strong>:</p>
<pre class="brush: php; title: ; notranslate">
protected function _initAcl()
{
	$aclSetup = new Aplicacao_Acl_Setup();
}
</pre>
<p>No artigo anterior foram criados os controladores: <strong>noticias</strong> e <strong>auth</strong>. Agora basta criar o controlador <strong>usuarios</strong>, que será acessível pelo papel <strong>admin</strong>, adicionar novas ações a este novo controlador e ao controlador noticias e, por último, adicionar uma nova ação ao controlador <strong>error</strong>.</p>
<pre class="brush: bash; title: ; notranslate">
zf create controller usuarios
zf create action adicionar noticias
zf create action adicionar usuarios
zf create action forbidden error
</pre>
<p>A ação <strong>forbidden</strong> ficará responsável por informar ao usuário que um determinado acesso não foi autorizado pela aplicação. Para exibir esta mensagem ao usuário basta adicionar o seguinte conteúdo ao arquivo <strong>views/scripts/error/forbidden.phtml</strong>:</p>
<pre class="brush: php; title: ; notranslate">
&lt;div style=&quot;color: #f00;&quot;&gt;Voc&amp;ecirc; n&amp;atilde;o est&amp;aacute; autorizado a ver esta p&amp;aacute;gina&lt;/div&gt;
</pre>
<p>Com isso a parte inicial da aplicação está pronta, agora é hora de implementar a classe responsável por popular o componente Zend_Acl.</p>
<h3>Populando a ACL</h3>
<p>A classe <strong>Bootstrap</strong> irá inicializar uma classe chamada <strong>Aplicacao_Acl_Setup</strong>, que ficará responsável por popular todos os dados relacionados a papéis, recursos e privilégios do componente <strong>Zend_Acl</strong>. Esta classe é apresentada abaixo e deve ser gravada no arquivo <strong>library/Aplicacao/Acl/Setup.php</strong>.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Aplicacao_Acl_Setup
{
	/**
	 * @var Zend_Acl
	 */
	protected $_acl;

	public function __construct()
	{
		$this-&gt;_acl = new Zend_Acl();
		$this-&gt;_initialize();
	}

	protected function _initialize()
	{
		$this-&gt;_setupRoles();
		$this-&gt;_setupResources();
		$this-&gt;_setupPrivileges();
		$this-&gt;_saveAcl();
	}

	protected function _setupRoles()
	{
		$this-&gt;_acl-&gt;addRole( new Zend_Acl_Role('guest') );
		$this-&gt;_acl-&gt;addRole( new Zend_Acl_Role('writer'), 'guest' );
		$this-&gt;_acl-&gt;addRole( new Zend_Acl_Role('admin'), 'writer' );
	}

	protected function _setupResources()
	{
		$this-&gt;_acl-&gt;addResource( new Zend_Acl_Resource('auth') );
		$this-&gt;_acl-&gt;addResource( new Zend_Acl_Resource('error') );
		$this-&gt;_acl-&gt;addResource( new Zend_Acl_Resource('noticias') );
		$this-&gt;_acl-&gt;addResource( new Zend_Acl_Resource('usuarios') );
	}

	protected function _setupPrivileges()
	{
		$this-&gt;_acl-&gt;allow( 'guest', 'auth', array('index', 'login') )
				   -&gt;allow( 'guest', 'error', array('error', 'forbidden') );
		$this-&gt;_acl-&gt;allow( 'writer', 'noticias', array('index', 'adicionar') )
				   -&gt;allow( 'writer', 'auth', 'logout' );
		$this-&gt;_acl-&gt;allow( 'admin', 'usuarios', array('index', 'adicionar') );
	}

	protected function _saveAcl()
	{
		$registry = Zend_Registry::getInstance();
		$registry-&gt;set('acl', $this-&gt;_acl);
	}
}
</pre>
<p>A primeira etapa desta classe é configurar os papéis. Neste caso foram criados os papéis <strong>guest</strong>, <strong>writer</strong> e <strong>admin</strong>. O papel <strong>guest</strong> foi criado como um facilitador, já que não será utilizado. Pode ocorrer de a aplicação liberar determinados acessos a usuários não-logados, aí que entra este papel. O papel <strong>writer</strong> terá os mesmos acessos de <strong>guest</strong>, além de acessos específicos, assim como o papel <strong>admin</strong> terá os mesmos acessos que <strong>guest</strong> e <strong>writer</strong>, além de outras permissões.</p>
<p>Após ter os papéis definidos, são adicionados os recursos protegidos. Neste caso os recursos são os controladores <strong>auth</strong>, <strong>error</strong>, <strong>noticias</strong> e <strong>usuarios</strong>. A próxima etapa, é definir os privilégios de um determinado papel a um determinado recurso. O papel <strong>guest</strong> pode acessar ações de erro e a página de login, já o papel <strong>writer</strong> pode acessar as ações de <strong>guest</strong>, as ações do controlador de notícias e a ação de logout do controlador auth. Já o papel <strong>admin</strong> pode acessar o mesmo que os outros dois papéis, além das ações do controlador de usuários.</p>
<p>Por último esta ACL é adicionada ao <strong>Zend_Registry</strong>, para que em outras partes da aplicação ela esteja acessível e devidamente populada.</p>
<h3>Verificação de permissões</h3>
<p>Tendo a ACL devidamente configurada, agora será possível verificar as permissões do usuário. Para isso foi criado um plugin que é adicionado ao <strong>Zend_Controller_Front</strong> no arquivo de configuração definido na primeira etapa das implementações. Este plugin terá como pai a classe <strong>Zend_Controller_Plugin_Abstract</strong> que possui diversos métodos referentes a cada etapa do processo de despacho das classes do Zend Framework. O método utilizado no plugin é o <strong>preDispatch()</strong> que é chamado antes de uma ação de controlador ser despachada, o que permite re-configurar a rota caso o usuário não possa ter acesso à página em questão. Este plugin é exibido abaixo e deve estar gravado em <strong>library/Aplicacao/Plugin/Auth.php</strong>:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Aplicacao_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
	/**
	 * @var Zend_Auth
	 */
	protected $_auth = null;
	/**
	 * @var Zend_Acl
	 */
	protected $_acl = null;
	/**
	 * @var array
	 */
	protected $_notLoggedRoute = array(
		'controller' =&gt; 'auth',
		'action'     =&gt; 'login',
		'module'     =&gt; 'default'
	);
	/**
	 * @var array
	 */
	protected $_forbiddenRoute = array(
		'controller' =&gt; 'error',
		'action'     =&gt; 'forbidden',
		'module'     =&gt; 'default'
	);

	public function __construct()
	{
		$this-&gt;_auth = Zend_Auth::getInstance();
		$this-&gt;_acl = Zend_Registry::get('acl');
	}

	public function preDispatch(Zend_Controller_Request_Abstract $request)
	{
		$controller = &quot;&quot;;
		$action     = &quot;&quot;;
		$module     = &quot;&quot;;
		if ( !$this-&gt;_auth-&gt;hasIdentity() ) {
			$controller = $this-&gt;_notLoggedRoute['controller'];
			$action     = $this-&gt;_notLoggedRoute['action'];
			$module     = $this-&gt;_notLoggedRoute['module'];
		} else if ( !$this-&gt;_isAuthorized($request-&gt;getControllerName(),
					$request-&gt;getActionName()) ) {
			$controller = $this-&gt;_forbiddenRoute['controller'];
			$action     = $this-&gt;_forbiddenRoute['action'];
			$module     = $this-&gt;_forbiddenRoute['module'];
		} else {
			$controller = $request-&gt;getControllerName();
			$action     = $request-&gt;getActionName();
			$module     = $request-&gt;getModuleName();
		}
		$request-&gt;setControllerName($controller);
		$request-&gt;setActionName($action);
		$request-&gt;setModuleName($module);
	}

	protected function _isAuthorized($controller, $action)
	{
		$this-&gt;_acl = Zend_Registry::get('acl');
		$user = $this-&gt;_auth-&gt;getIdentity();
		if ( !$this-&gt;_acl-&gt;has( $controller ) || !$this-&gt;_acl-&gt;isAllowed( $user, $controller, $action ) )
			return false;
		return true;
	}
}
</pre>
<p>Primeiramente são definidas as rotas padrão para o caso do usuário não estar logado ou não estar autorizado a ver uma determinada página. Estas rotas são, consecutivamente: <strong>auth/login</strong> e <strong>error/forbidden</strong>. No construtor é recuperada a instância atual de <strong>Zend_Auth </strong>e <strong>Zend_Acl</strong>, ambas usadas no processo de verificação do usuário logado.</p>
<p>A primeira etapa do método preDispatch() é verificar se o usuário está logado e, caso não esteja, os parâmetros da requisição são configurados para a rota de login. A segunda etapa é o caso do usuário estar logado, nesta etapa o objeto que representa o usuário logado é recuperado e é feita uma verificação se este usuário possui o privilégio correspondente à ação do controlador requisitado. Caso não possua, ou o recurso que representa o controlador não exista, ele é redirecionado para a rota de acesso proibido. Se nenhuma destas verificações negar o acesso ao usuário significa que ele está apto a acessar a requisição em questão, portanto os parâmetros dessa requisição são mantidos e o fluxo prossegue.</p>
<h3>Models</h3>
<p>Tendo todo o processo de verificação pronto a próxima etapa é criar as classes com regras de negócio da parte de autenticação. Já que, diferente do artigo anterior, este artigo envolve o MVC do Zend Framework, toda a parte de regra de negócio é implementada na camada referente ao <strong>Model</strong>. A primeira classe criada é a classe que representa um usuário da aplicação. Ela implementará a interface <strong>Zend_Acl_Role_Interface</strong>, que permite que ela seja tratada como um papel do componente <strong>Zend_Acl</strong>. Esta classe exige que o método <strong>getRoleId()</strong> seja implementado e retorne o identificador correspondente ao papel em questão. Esta classe é bem simples e possui apenas métodos <strong>getters</strong> e <strong>setters</strong>. Ela deverá estar no arquivo <strong>models/Usuario.php</strong>.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Model_Usuario implements Zend_Acl_Role_Interface
{
	private $_userName;
	private $_roleId;
	private $_fullName;

	public function getUserName()
	{
		return $this-&gt;_userName;
	}

	public function setUserName($userName)
	{
		$this-&gt;_userName = (string) $userName;
	}

	public function getFullName()
	{
		return $this-&gt;_fullName;
	}

	public function setFullName($fullName)
	{
		$this-&gt;_fullName = (string) $fullName;
	}
	/**
	 *
	 */
	public function getRoleId()
	{
		return $this-&gt;_roleId;
	}

	public function setRoleId($roleId)
	{
		$this-&gt;_roleId = (string) $roleId;
	}
}
</pre>
<p>A próxima etapa é implementar a classe que cuidará da regra de negócio de login. Esta classe terá apenas um método estático, responsável por fazer o login do usuário na aplicação. A principal diferença deste método de login com o apresentado no artigo anterior é a modificação da consulta ao banco de dados, para adicionar a tabela <strong>perfil</strong> aos dados retornados pelo <strong>Zend_Auth_Adapter_DbTable</strong>. O método <strong>join()</strong> de <strong>Zend_Db_Select</strong>, adicionará a tabela <strong>perfil</strong> com o alias &#8220;p&#8221;, onde a coluna <strong>perfil_id</strong> da tabela <strong>usuario</strong> seja igual a coluna <strong>id</strong> da tabela <strong>perfil</strong>, retornando a coluna  &#8220;nome&#8221; da tabela &#8220;perfil&#8221; com o alias &#8220;nome_perfil&#8221;. Após validar o login, o objeto retornado pelo adapter é mapeado para um objeto do tipo <strong>Model_Usuario</strong> e, por último, este é armazenado à sessão do Zend Framework. Este model ficará no arquivo <strong>models/Auth.php</strong> e deve possuir o seguinte conteúdo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Model_Auth
{
	public static function login($login, $senha)
	{
		$dbAdapter = Zend_Db_Table::getDefaultAdapter();
		//Inicia o adaptador Zend_Auth para banco de dados
		$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
		$authAdapter-&gt;setTableName('usuario')
					-&gt;setIdentityColumn('login')
					-&gt;setCredentialColumn('senha')
					-&gt;setCredentialTreatment('SHA1(?)');
		//Define os dados para processar o login
		$authAdapter-&gt;setIdentity($login)
					-&gt;setCredential($senha);
		//Faz inner join dos dados do perfil no SELECT do Auth_Adapter
		$select = $authAdapter-&gt;getDbSelect();
		$select-&gt;join( array('p' =&gt; 'perfil'), 'p.id = usuario.perfil_id', array('nome_perfil' =&gt; 'nome') );
		//Efetua o login
		$auth = Zend_Auth::getInstance();
		$result = $auth-&gt;authenticate($authAdapter);
		//Verifica se o login foi efetuado com sucesso
		if ( $result-&gt;isValid() ) {
			//Recupera o objeto do usuário, sem a senha
			$info = $authAdapter-&gt;getResultRowObject(null, 'senha');

			$usuario = new Model_Usuario();
			$usuario-&gt;setFullName( $info-&gt;nome_completo );
			$usuario-&gt;setUserName( $info-&gt;login );
			$usuario-&gt;setRoleId( $info-&gt;nome_perfil );

			$storage = $auth-&gt;getStorage();
			$storage-&gt;write($usuario);

			return true;
		}
		throw new Exception('Nome de usuário ou senha inválida');
	}
}
</pre>
<h3>Controller de Autenticação e demais Views</h3>
<p>Agora que toda a regra de negócio foi delegada à camada Model, o controller de autenticação sofre algumas modificações para utilizar esta classe. Neste caso ele chamará o método estático <strong>Model_Auth::login()</strong>, e, caso este lance alguma exceção, irá armazenar a mensagem ao helper <strong>FlashMessenger</strong> e exibí-la em cima do formulário de login. A classe modificada é apresentada abaixo e, logo em seguida, a <strong>view</strong> correspondente a esta ação de login é apresentada. O formulário de login é o mesmo implementado no antigo anterior.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class AuthController extends Zend_Controller_Action
{

	public function init()
	{
	}

	public function indexAction()
	{
		return $this-&gt;_helper-&gt;redirector('login');
	}

	public function loginAction()
	{
		$this-&gt;_flashMessenger = $this-&gt;_helper-&gt;getHelper('FlashMessenger');
		$this-&gt;view-&gt;messages = $this-&gt;_flashMessenger-&gt;getMessages();
		$form = new Form_Login();
		$this-&gt;view-&gt;form = $form;
		//Verifica se existem dados de POST
		if ( $this-&gt;getRequest()-&gt;isPost() ) {
			$data = $this-&gt;getRequest()-&gt;getPost();
			//Formulário corretamente preenchido?
			if ( $form-&gt;isValid($data) ) {
				$login = $form-&gt;getValue('login');
				$senha = $form-&gt;getValue('senha');

				try {
					Model_Auth::login($login, $senha);
					//Redireciona para o Controller protegido
					return $this-&gt;_helper-&gt;redirector-&gt;goToRoute( array('controller' =&gt; 'noticias'), null, true);
				} catch (Exception $e) {
					//Dados inválidos
					$this-&gt;_helper-&gt;FlashMessenger($e-&gt;getMessage());
					$this-&gt;_redirect('/auth/login');
				}
			} else {
				//Formulário preenchido de forma incorreta
				$form-&gt;populate($data);
			}
		}
	}

	public function logoutAction()
	{
		$auth = Zend_Auth::getInstance();
		$auth-&gt;clearIdentity();
		return $this-&gt;_helper-&gt;redirector('index');
	}
}
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;h2&gt;Login&lt;/h2&gt;
&lt;?php echo ( sizeof( $this-&gt;messages ) &gt; 0 ) ? '&lt;div style=&quot;color: #f00;&quot;&gt;' . $this-&gt;messages[0] . '&lt;/div&gt;' : &quot;&quot;; ?&gt;
&lt;?php echo $this-&gt;form; ?&gt;
</pre>
<p>A última etapa é modificar as views dos controladores <strong>noticias</strong> e <strong>usuarios</strong>. Estas views são extremamente simples e irão conter apenas uma mensagem de boas-vindas e um link para logout. O arquivo <strong>views/scripts/noticias/index.phtml</strong> deve conter o seguinte conteúdo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;h2&gt;Bem-vindo Escritor&lt;/h2&gt;
&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('controller' =&gt; 'auth', 'action' =&gt; 'logout', 'module' =&gt; 'default'), '', true); ?&gt;&quot;&gt;
	Logout
&lt;/a&gt;
</pre>
<p>E, por último, o arquivo <strong>views/scripts/usuarios/index.phtml</strong> possui o seguinte conteúdo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;h2&gt;Bem-vindo Admin&lt;/h2&gt;
&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('controller' =&gt; 'auth', 'action' =&gt; 'logout', 'module' =&gt; 'default'), '', true); ?&gt;&quot;&gt;
	Logout
&lt;/a&gt;
</pre>
<h2>Funcionamento</h2>
<p>Após todas as etapas estarem concluídas a aplicação está devidamente protegida, tanto na questão de permitir apenas usuários logados, como em autorizar aos usuários apenas alguns privilégios baseados em seu perfil. Para o meu caso a URL da aplicação ficou apontada para: <strong>http://localhost/zend_acl</strong>, e qualquer tentativa de acessar controllers internos são redirecionadas à pagina de login. Após o login,  a aplicação permite ou proíbe o acesso, de acordo com o perfil logado.  Abaixo são apresentadas algumas screenshots de cada parte funcional desta aplicação:</p>
<div id="attachment_677" class="wp-caption aligncenter" style="width: 310px"><a href="http://fernandomantoan.com/wp-content/uploads/2010/08/erro_login.png"><img class="size-medium wp-image-677" title="erro_login" src="http://fernandomantoan.com/wp-content/uploads/2010/08/erro_login-300x227.png" alt="" width="300" height="227" /></a><p class="wp-caption-text">Erro ao efetuar login</p></div>
<div id="attachment_678" class="wp-caption aligncenter" style="width: 296px"><a href="http://fernandomantoan.com/wp-content/uploads/2010/08/escritor_bemvindo.png"><img class="size-full wp-image-678" title="escritor_bemvindo" src="http://fernandomantoan.com/wp-content/uploads/2010/08/escritor_bemvindo.png" alt="" width="286" height="146" /></a><p class="wp-caption-text">Escritor logado com sucesso, acessando o controlador noticias</p></div>
<div id="attachment_679" class="wp-caption aligncenter" style="width: 310px"><a href="http://fernandomantoan.com/wp-content/uploads/2010/08/erro_forbidden.png"><img class="size-medium wp-image-679" title="erro_forbidden" src="http://fernandomantoan.com/wp-content/uploads/2010/08/erro_forbidden-300x125.png" alt="" width="300" height="125" /></a><p class="wp-caption-text">Tentativa de acesso ao controlador usuarios, utilizando o perfil escritor</p></div>
<div id="attachment_680" class="wp-caption aligncenter" style="width: 287px"><a href="http://fernandomantoan.com/wp-content/uploads/2010/08/admin_bemvindo.png"><img class="size-full wp-image-680" title="admin_bemvindo" src="http://fernandomantoan.com/wp-content/uploads/2010/08/admin_bemvindo.png" alt="" width="277" height="110" /></a><p class="wp-caption-text">Acesso ao controlador usuarios, usando o perfil admin</p></div>
<h2>Conclusão</h2>
<p>Os componentes do Zend Framework relacionados à autorização apresentam uma API consistente e intuitiva de se utilizar e configurar, o que garante uma baixa curva de aprendizagem para se utilizar as funcionalidades básicas do mesmo. Estes componentes podem ser integrados a todo o processo de despacho da parte MVC do framework através de plugins, o que permite manipular as requisições livremente e, baseado em determinados critérios, redirecionar o usuário para outros pontos da aplicação para informar mensagens de erro ou exigir algum formulário para entrada de dados. O objetivo deste artigo foi demonstrar de forma prática uma maneira de implementar autorização e integrá-la ao MVC, porém, vale ressaltar, que existem diversas formas de se chegar a esta funcionalidade, para maiores informações a seção de referências logo abaixo pode ser de grande valia. No próximo artigo os componentes de Internacionalização e Localização serão abordados, até a próxima pessoal!</p>
<p><a href="https://github.com/fernandomantoan/zf-authorization-tutorial" target="_blank">Faça o download do código-fonte</a>.</p>
<h2>Referências</h2>
<ul>
<li><a id="yjqa" title="Zend_Acl no guia de referência do Zend Framework" href="http://framework.zend.com/manual/en/zend.acl.html">Zend_Acl no guia de referência do Zend Framework</a>;</li>
<li><a href="http://framework.zend.com/manual/en/zend.controller.plugins.html" target="_blank">Plugins no guia de referência do Zend Framework</a>;</li>
<li><a id="swfv" title="Livro Zend Framework em Ação" href="http://altabooks.tempsite.ws/product_info.php?products_id=350&amp;osCsid=dfh1koampc9vmmbtmkt0br4hl0">Livro Zend Framework em Ação</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fernandomantoan.com/frameworks/zend-framework/autorizacao-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		<feedburner:origLink>http://fernandomantoan.com/frameworks/zend-framework/autorizacao-com-zend-framework/</feedburner:origLink></item>
	</channel>
</rss>

