Utilizando o Lagrangeano para Provar Matematicamente que um Objeto Livre no Espaço Cairá

Você poderia dizer que é óbvio que se uma caneta for solta ela vai cair, ou melhor, vai cair até que encontre um obstáculo que a impeça de chegar ao centro da Terra. Sendo ainda mais preciso (e chato), a caneta não “cai”, mas sim “viaja” no espaço-tempo curvado pela massa da Terra segundo a Teoria da Relatividade de Einstein. Para Einstein, a gravidade é uma força que empurra e não uma força diferente de todas as outras e que “puxa” como Newton a entendia – ou não entendia. Como complemento, para uma simples medição feita por uma balança, a força que empurra é a normal, que é cancelada pelo peso.

Você sabe que a caneta vai cair porque já viu muitas canetas e objetos similares se comportando da mesma forma quando soltos a uma determinada altura. A caneta que cai é a caneta ideal tal como definido no mundo das idéias de Platão. O que de fato determina se um corpo vai cair – independente de gostarmos mais de Newton ou de Einstein – é o que convencionamos como aceleração da gravidade (g).

A atração gravitacional e a quantidade de massa de um objeto é o que determina a intensidade da força peso. A gravidade não é idêntica em todos os pontos da Terra embora na escola convenciona-se que ela vale 10m/s2, o que se lê como: “para se deslocar 10 metros, um corpo demorará o quadrado do tempo em segundos”. Na verdade, a gravidade depende da composição do solo (tipos de materiais, presença de aquedutos, distância para o centro da Terra, etc). Se você não está precisando lançar um foguete, um bom valor médio para a aceleração da gravidade é 9,7/s2.

Mecânica Clássica

De acordo com a Segunda Lei de Newton:

A mudança de movimento é proporcional à força motora imprimida, e é produzida na direção de linha reta na qual aquela força é aplicada

Figura 1 – Isaac Newton

Ou seja:

F=m*a

Podemos utilizar a Segunda Lei de Newton conforme previsto pela mecânica clássica para estudar a aceleração da caneta. Como a força que está atuando em um corpo em queda livre é o peso (P=m*g), podemos afirmar que:

P=F
m*g = m*a

g = a

Conclusão

Sendo assim, de acordo com a mecânica clássica e conforme previsto pela Segunda Lei de Newton, o corpo cai porque sua aceleração é igual à aceleração da gravidade – o vetor aceleração está orientado para baixo.

Mecânica Analítica

Todo símbolo, toda notação, revela algumas coisas e esconde várias outras. Esse é o resultado do processo epistêmico. As setas (→) acima dos símbolos de aceleração e força foram introduzidas séculos depois de Newton para indicar que são grandezas vetoriais, ou seja, têm direção, orientação e intensidade. Isso aumentou a noésis da marca, mas não revelou o principal: ela trata das forças que atuam em um sistema, mas esconde as energias que se transformam nessas forças para dar movimento ao sistema – a força é derivada da energia. Podemos provar que a caneta cai estudando as energias que estão atuando no sistema por meio da lagrangeana.

A Mecânica Analítica de Lagrange é a mecânica de Newton escrita com a matemática de Leibnitz. O formalismo lagrangeano permite obter as equações de movimento de um sistema de um modo elegante de acordo com sua natureza geométrica – uma coordenada para cada dimensão. Contrariamente aos métodos baseados nas leis de Newton, este formalismo não exige a identificação das forças envolvidas, o que torna a análise mais abstrata. Dessa forma, é possível simplificar o tratamento de sistemas de maior complexidade, especialmente quando não é relevante ou não é diretamente possível a determinação das forças associadas às restrições ao movimento das suas partículas.

Figura 2 – Joseph Louis Lagrange

Para definir completamente a posição de um sistema com n graus de liberdade são necessárias n variáveis independentes. Essas variáveis são designadas coordenadas generalizadas (q) e a forma como são selecionadas (parametrizadas) permite a simplificação do tratamento matemático do problema.

Na formulação da mecânica lagrangeana, cada sistema mecânico é caracterizado por uma determinada função. No caso geral, esta função depende das coordenadas generalizadas (q), das suas derivadas temporais (q0) e também do tempo (t). Esta função designa-se lagrangeana do sistema, sendo representada habitualmente por ℒ(q,q0,t).

Isso posto, vamos analisar as energias que atuam no momento em que a caneta é liberada.

Coordenadas generalizadas

Nosso sistema só tem um grau de liberdade, pois a caneta só pode se deslocar na vertical. Vamos chamar essa coordenada vertical de x.

q = x
qo = xo

Energia cinética

A energia cinética, conforme notação adaptada por Gaspard-Gustave de Coriolis, é expressa assim:

T = 1/2 mV2

Você poderia substituir o T da equação por Ec. Agora, atenção para uma conexão importante entre a equação do espaço e fórmula da energia cinética. Vamos derivar a equação do espaço em função da velocidade (V).

S = S0 + Vt
So = V

A primeira derivada do espaço (So) é a velocidade (V) e a velocidade influencia diretamente o valor da energia cinética. Como estamos trabalhando com a coordenada x (espaço) e sua primeira derivada, que é velocidade (V) como acabamos de deduzir, podemos afirmar que:

V = xo

Sendo assim, nossa equação da energia cinética será adaptada para trabalhar com a primeira derivada do espaço na coordenada x, o que será importante para substituição no lagrangeano:

T = 1/2 mxo2

Energia potencial

Daniel Bernoulli, em seu trabalho sobre hidrodinâmica, descobriu que a força é derivada da energia potencial em uma coordenada qualquer:

F = – [∂V/∂qo]

Modernamente, expressamos energia potencial como:

V = mgx

Por que a energia potencial é importante para nosso estudo? Porque um corpo que tem energia potencial é capaz de converter essa energia em energia cinética – cada energia atuante nos interessa. Como assumimos que nosso referencial está na parte superior do sistema, a equação fica negativa:

V = – mgx

Se você preferir, pode substituir o V por Ep, mas vamos respeitar os originais.

Lagrangeana

A langrangeana pode ser escrita na forma ℒ = T − U onde T é a soma das energias cinéticas das partículas do sistema e U é a sua energia potencial, onde se incluem os efeitos de todas as forças conservativas.

ℒ = T – V
ℒ = 1/2 mxo2 – (-mgx)

Lagrangeano

O lagrangeano, conforme a mecânica analítica de Lagrange, é expresso como:

d/dt[∂ℒ/∂qo] – ∂ℒ/∂q = 0

Como estamos trabalhando em função da coordenada espacial x:

d/dt[∂ℒ/∂xo] – ∂ℒ/∂x = 0
d/dt[mxo] – mg = 0
mxoo = mg

xoo = g

Conclusão

Como o sistema está sob a ação da gravidade “g”, a caneta “cai”.

Referências

1. [http://paginas.fe.up.pt/~mines/publicacoes_pedagogicas/apontamentos/IMC_Lagrange.pdf]

Como Integrar o Ehcache ao Spring

O Princípio de Pareto (regra 80-20), quando aplicado à análise da frequência com a qual nossa aplicação faz uso dos recursos, nos ajuda a estabelecer um critério para selecionar que eventos ou que entidades serão cacheadas. Esse princípio serve apenas para chamar nossa atenção para o fato de que há poucos eventos onerando uma boa parte da memória e do processamento, mas você deve utilizar ferramentas para investigar o que está acontecendo com seu aplicativo, como o VisualVM ou o JProfiler.

Conhecendo o que está onerando a memória, você pode decidir cachear ou bufferizar. Cache e buffer são conceitos diferentes, mas muitas vezes nós os utilizamos como sinônimos. Um buffer é estrutura temporária que media o relacionamento entre uma entidade rápida e outra lenta: o buffer diminui o tempo que a entidade rápida deve esperar pela disponibilidade da lenta oferecendo acesso direto a blocos inteiros ao invés de pedaços, o que melhora a performance.

Enquanto o buffer é uma estrutura conhecida por pelo menos uma das entidade comunicantes, o cache é feito sem que as entidades tomem conhecimento. Permitindo que uma entidade possa ser acessada muitas vezes, há ganho de performance, pois os recursos (persistência, storage, serviços) não precisarão ser acessados desnecessariamente e a entidade não precisará ser recriada.

O Ehcache é um dos mais famosos frameworks de cache. Ele oferece flexibilidade para escolhermos a estratégia de cache da nossa aplicação, como onde ele será armazenado (memória, disco), qual a quantidade máxima de entradas e quanto tempo uma entidade permanecerá em cache. Nesse artigo, vou mostrar como integrar o Ehcache ao framework Spring. Comecemos as configurações adicionando as dependências do Ehcache e do Spring.

<dependency>
   <groupId>net.sf.ehcache</groupId>
   <artifactId>ehcache</artifactId>
   <version>2.9.0</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>4.1.4.RELEASE</version>
</dependency>

Adicione o arquivo ehcache.xml ao seu classpath. Esse arquivo contém as estratégias de cache que você está utilizando – você pode definir quantas quiser. No exemplo abaixo, criei uma estratégia chamada “cacheUsuarios” que armazena até 10000 itens em memória durante 300 segundos.

<?xml version="1.0"?>
<ehcache
   xsi:noNamespaceSchemaLocation="ehcache.xsd"
   updateCheck="true"
   monitoring="autodetect"
   dynamicConfig="true">
   <cache name="cacheUsuarios"
      maxEntriesLocalHeap="10000"
      timeToLiveSeconds="300" 
      eternal="false"
      memoryStoreEvictionPolicy="LRU">
      <pinning store="localMemory"/>
   </cache>
</ehcache>

Você deve dizer ao Spring via @Configuration para ele ativar as anotações de cache definidas por @EnableCaching.

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

@Configuration
@EnableCaching
public class CacheConfig {
   @Bean
   public CacheManager cacheManager() {
      return new EhCacheCacheManager(ehCacheCacheManager().getObject());
   }
   @Bean
   public EhCacheManagerFactoryBean ehCacheCacheManager() {
      EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
      cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
      cmfb.setShared(true);
      return cmfb;
   }
}

Crie a classe Usuario. Instâncias dessa classe serão cacheadas:

public class Usuario{
   private Integer id;
   private String nome;
}

Por último, basta anotar o método que devolve a entidade que será cacheada.

@Service
public class UsuarioServiceImpl implements UsuarioService {
   @Autowired
   private UsuarioDao dao;

   @Override
   @Transactional(readOnly = true)
   @Cacheable(value = "cacheUsuarios", key = "#nome")
   public Usuario find(String nome) throws Exception {
      return dao.find(nome);
   }
}

Note que definimos que a entrada onde a entidade será armazenada no cache tem como chave o “nome” do usuário, que foi informado via parâmetro. Poderíamos definir uma chave mais complexa à partir das propriedades de uma outra entidade. Se for esse o caso, você poderia definir algo assim:

#entidade.propriedade1.propriedade3.propriedade3.propriedade4

Referências

1. [https://www.mkyong.com/spring/spring-caching-and-ehcache-example/]
2. [http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html]
3. [http://www.codingpedia.org/ama/spring-caching-with-ehcache/]
4. [http://www.baeldung.com/spring-cache-tutorial]
5. [http://stackoverflow.com/questions/26140702/spring-cacheable-how-to-configure-a-complex-key]

Categorias:Programação

Criando sua Própria Tag Library do Shiro

Se você precisa de mais granularidade na checagem de permissões em uma página web, como por exemplo determinar se um botão deve ou não ser exibido, o Shiro oferece uma API que te permite fazer sua implementação nos métodos do seu controller/managed bean – não faça scriplets! No exemplo do botão, você poderia condicionar sua exibição assim:

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:p="http://primefaces.org/ui">
   <body>
      <p:commandLink action="#{appMB.executar()}" 
          rendered="#{appMB.podeExecutar()}">Executar</p:commandLink>
   </body>
</html>

A implementação do método podeExecutar() utiliza a API do Shiro para verificar se o usuário tem determinada permissão:

public boolean podeExecutar() throws IOException {
   Subject subject = SecurityUtils.getSubject();
   return subject.isPermitted("PERMISSAO_EXECUCAO");
}

O problema é que você tende a reescrever esse mesmo código ou um muito parecido em cada managed bean que precisar de autorização. Felizmente, o Shiro possui uma tag library útil para quem trabalha com arquivos JSP, mas se você trabalha com JSF, não há nada pronto para utilizar. Porém, é possível criar sua própria biblioteca reutilizável à partir daquele código de checagem que você inseriu no managed bean. Vamos definir a assinatura de uma tag chamada “hasPermissao” que receba como parâmetro uma permissao:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
   version="2.2"
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
   http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
   <namespace>http://app.com.br/security</namespace>
   <tag>
      <description><![CDATA[Verifica a permissao do usuario]]></description>
      <tag-name>hasPermissao</tag-name>
      <component>
         <component-type>permitido</component-type>
      </component>
      <attribute>
         <description><![CDATA[Permissao a ser verificada.]]></description>
         <name>permissao</name>
         <required>true</required>
         <type>java.lang.String</type>
      </attribute>
   </tag>
</facelet-taglib>

Uma vez criada a biblioteca, ela deve ser cadastrada no web.xml:

<context-param>
   <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
   <param-value>/WEB-INF/app.taglib.xml</param-value>
</context-param>

Em seguida, vamos criar uma classe que extende UIComponentBase e é anotada como @FacesComponent. Essa implementação “esconde” todos os componentes visuais delimitados pela tag caso o usuário não esteja autorizado:

@FacesComponent(createTag = true, 
   namespace = "http://app.com.br/security", 
   tagName = "hasPermissao", 
   value = "hasPermissao")
public class PermissaoTag extends UIComponentBase {

   @Override
   public String getFamily() {
      return "app";
   }

   @Override
   public void encodeBegin(FacesContext context)
      throws IOException {
      String permissao = (String)getAttributes().get("permissao");
      Subject subject = SecurityUtils.getSubject();
      if (!subject.isPermitted(permissao)) {
         getChildren().stream().forEach(
            s -> s.setRendered(false));
      }
   }
}

Por último, importe a tag em seu arquivo xhtml e utilize no trecho de código sujeito à autorização:

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:p="http://primefaces.org/ui"
   xmlns:app="http://app.com.br/security">
   <body>
     <app:hasPermissao permissao="PERMISSAO_EXECUCAO">
       <p:commandLink action="#{appMB.executar()}">Executar</p:commandLink>
     </app:hasPermissao>
   </body>
</html>

Referências

1. [https://www.mkyong.com/jsf2/custom-tags-in-jsf-2-0/]
2. [https://shiro.apache.org/web.html#Web-taglibrary]
3. [https://shiro.apache.org/java-authorization-guide.html#programmatic-authorization]

Implementação de um Cliente Jersey

Escrevi um artigo que demonstrava como implementar um cliente RESTEasy, que é a implementação REST que vem com o JBoss. Nesse artigo, vou fazer a implementação com Jersey, que é a implementação de referência da JAX-RS API. Você poderia manter as duas implementações se utilizasse aquela estratégia de injeção de dependência que expliquei.

public Autorizacao autenticar() throws Exception  {
   Client client = Client.create();

   JSONObject jsonInput = new JSONObject();
   jsonInput.put("usuario", "usuario");
   jsonInput.put("senha", "senha");

   WebResource target = client.
    resource("http://localhost:8080").
    path("/autenticar/");
   ClientResponse response = target.
    type(MediaType.APPLICATION_JSON).
    post(ClientResponse.class, jsonInput.toString());

   String value = response.readEntity(String.class);
   response.close();
   ObjectMapper map = new ObjectMapper();
   return map.readValue(value, Autorizacao.class);
}

public List<Usuario> listarUsuarios(Autorizacao autorizacao)
   throws Exception {
   Client client = Client.create();
   WebResource target = client.
    resource("http://localhost:8080").
    path("/usuario/listar/");

   ClientResponse response = target.
      accept(MediaType.APPLICATION_JSON).
      header("Token", autorizacao.getToken()).get(ClientResponse.class);

   String value = response.readEntity(String.class);
   response.close();
   ObjectMapper map = new ObjectMapper();
   Map<String, List<Usuario>> mapItens = map.
     readValue(value,
      new TypeReference<Map<String, List<Usuario>>>() {
     });
   return mapItens.get("usuarios");
}

Referências

1. [http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/]
2. [http://howtodoinjava.com/jersey/jersey-restful-client-examples/]
3. [http://crunchify.com/how-to-create-restful-java-client-with-jersey-client-example/]
4. [https://gist.github.com/jmertic/5844627]

Categorias:Programação

Os Níveis do Ser Humano

Achei um texto que imprimi em um passado remoto. Não sei de onde veio aquele texto e nem qual era o autor. O texto é curioso e nos faz refletir sobre a natureza humana, onde estamos e o que queremos ser. Como o texto é meio longo e eu não queria digitá-lo, segue uma versão que encontrei aqui.

Os Níveis do Ser Humano

Há alguns anos, um buscador aproximou-se de um Mestre da Arte Real (um verdadeiro Místico) e perguntou-lhe:

– Mestre, gostaria muito de saber por que razão os seres humanos guerreiam-se e por que não conseguem entender-se, por mais que apregoem estar buscando a paz e o entendimento; por mais que apregoem o amor e por mais que afirmem abominar o ódio.

– Essa é uma pergunta muito séria. Gerações e gerações a têm feito e não conseguiram uma resposta satisfatória, por não se darem conta de que tudo é uma questão de nível evolutivo. A grande maioria da Humanidade do Planeta Terra está vivendo atualmente no nível 1. Muitos outros, no nível 2 e alguns outros no nível 3. Essa é a grande maioria. Alguns poucos já conseguiram atingir o nível 4, pouquíssimos o nível 5, raríssimos o nível 6 e somente de mil em mil anos aparece algum que atingiu o nível 7.

– Mas, Mestre, que níveis são esses?

– Não adiantaria nada explicá-los, pois além de não entender, também, logo em seguida, você os esqueceria e esqueceria também a explicação.

Assim, prefiro levá-lo numa viagem mental, para realizar uma série de experimentos e aí, então, tenho certeza, você vivenciará e saberá exatamente o que são esses níveis, cada um deles, nos seus mínimos detalhes.

Colocou, então, as pontas de dois dedos na testa do consulente e, imediatamente, ambos estavam em um outro local, em outra dimensão do Espaço e do Tempo.

Nível 1

O local era uma espécie de bosque, e um homem se aproximava deles. Ao chegar mais perto, disse-lhe o Mestre:

– Dê-lhe um tapa no rosto.

– Mas por quê? Ele não me fez nada…

– Faz parte do experimento. Dê-lhe um tapa, não muito forte, mas dê-lhe um tapa!

E o homem aproximou-se mais do Mestre e do consulente. Este, então, chegou até o homem, pediu-lhe que parasse e, sem nenhum aviso, deu-lhe um tapa que estalou. Imediatamente, como se fosse feito de mola, o desconhecido revidou com uma saraivada de socos e o consulente foi ao chão, por causa do inesperado do ataque. Instantaneamente, como num passe de mágica, o Mestre e o consulente já estavam em outro lugar, muito semelhante ao primeiro e outro homem se aproximava. O Mestre, então comentou:

– Agora, você já sabe como reage um homem do nível 1. Não pensa. Age mecanicamente. Revida sem pensar. Aprendeu a agir dessa maneira e esse aprendizado é tudo para ele, é o que norteia sua vida, é sua “muleta”. Agora, você testará da mesma maneira, o nosso companheiro que vem aí, do nível 2.

Nível 2

Quando o homem se aproximou, o consulente pediu que parasse e lhe deu um tapa. O homem ficou assustado, olhou para o consulente, mediu-o de cima a baixo e, sem dizer nada, revidou com um tapa, um pouco mais forte. Instantaneamente, já estavam em outro lugar muito semelhante ao primeiro.

– Agora, você já sabe como reage um homem do nível 2. Pensa um pouco, analisa superficialmente a situação, verifica se está à altura do adversário e aí, então, revida. Se se julgar mais fraco, não revidará imediatamente, pois irá revidar à traição. Ainda é carregado pelo mesmo tipo de “muleta” usada pelo homem do nível 1. Só que analisa um pouco mais as coisas e fatos da vida. Entendeu? Repita o mesmo com esse aí que vem chegando.

Nível 3

A cena repetiu-se. Ao receber o tapa, o homem parou, olhou para o consulente e assim falou:

– O que é isso, moço?… Mereço uma explicação, não acha? Se não me explicar direitinho por que razão me bateu, vai levar uma surra!
Estou falando sério!

– Eu e o Mestre estamos realizando uma série de experimentos e este experimento consta exatamente em fazer o que fiz, ou seja, bater nas pessoas para ver como reagem.

– E querem ver como reajo?

– Sim. Exatamente isso…

– Já reparou que não tem sentido?

– Como não? Já aprendemos ótimas lições com as reações das outras pessoas. Queremos saber qual a lição que você irá nos ensinar…

– Ainda não perceberam que isso não faz sentido? Por que agredir as pessoas assim, gratuitamente?

– Queremos verificar – interferiu o Mestre – as reações mais imediatas e primitivas das pessoas. Você tem alguma sugestão ou consegue atinar com alguma alternativa?

– De momento, não me ocorre nenhuma. De uma coisa, porém, estou certo: – Esse teste é muito bárbaro, pois agride os outros. Estou, realmente, muito assustado e chocado com essa ação de vocês, que parecem pessoas inteligentes e sensatas. Certamente, deverá haver algo menos agressivo e mais inteligente. Não acham?

– Enfim – perguntou o buscador – como você vai reagir? Vai revidar? Ou vai nos ensinar uma outra maneira de conseguir aprender o que desejamos?

– Já nem sei se continuo discutindo com vocês, pois acho que estou perdendo meu tempo. São dois malucos e tenho coisas mais importantes para fazer do que ficar conversando com dois malucos. Afinal, meu tempo é precioso demais e não vou desperdiçá-lo com vocês. Quando encontrarem alguém que não seja tão sensato e paciente como eu, vão aprender o que é agredir gratuitamente as pessoas. Que outro, em algum outro lugar, revide por mim. Não vou nem perder meu tempo com vocês, pois não merecem meu esforço… São uns perfeitos idiotas… Imagine só, dar tapas nos outros… Besteira… Idiotice… Falta do que fazer… E ainda querem me convencer de que estão buscando conhecimento… Picaretas! Isso é o que vocês são! Uns picaretas! Uns charlatães!

Imediatamente, aquela cena apagou-se e já se encontravam em outro luar, muito semelhante a todos os outros. Então, o Mestre comentou:

– Agora, você já sabe como age o homem do nível 3. Gosta de analisar a situação, discutir os pormenores, criticar tudo, mas não apresenta nenhuma solução ou alternativa, pois ainda usa as mesmas “muletas” que os outros dois anteriores também usavam. Prefere deixar tudo “pra lá”, pois “não tem tempo” para se aborrecer com a ação, que prefere deixar para os “outros”. É um erudito e teórico que fala muito, mas que age muito pouco e não apresenta nenhuma solução para nenhum problema, a não ser a mais óbvia e assim mesmo, olhe lá… É um medíocre enfatuado, cheio de erudição, que se julga o “Dono da Verdade”, que se acha muito “entendido” e que reclama de tudo e só sabe criticar. É o mais perigoso de todos, pois costuma deter cargos de comando, por ser, geralmente, portador de algum diploma universitário em nível de bacharel (mais uma outra “muleta”) e se pavoneia por isso. Possui instrução e muita erudição. Já consegue ter um pouquinho mais de percepção das coisas, mas é somente isso. Ainda precisa das “muletas” para continuar vivendo, mas começa a perceber que talvez seja melhor andar sem elas. No entanto, por “preguiça vital” e simples falta de força de vontade, prefere continuar a utilizá-las. De resto, não passa de um medíocre enfatuado que sabe apenas argumentar e tudo criticar. Vamos, agora, saber como reage um homem do nível 4. Faça o mesmo com esse que aí vem.

Nível 4

E a cena repetiu-se.

O caminhante olhou para o buscador e perguntou:

– Por que você fez isso? Eu fiz alguma coisa errada? Ofendi você de alguma maneira? Enfim, gostaria de saber por que motivo você me bateu. Posso saber?

– Não é nada pessoal. Eu e o Mestre estamos realizando um experimento para aprender qual será a reação das pessoas diante de uma agressão imotivada.

– Pelo visto, já realizaram este experimento com outras pessoas. Já devem ter aprendido muito a respeito de como reagem os seres humanos, não é mesmo?

– É… Estamos aprendendo um bocado. Qual será sua reação? O que pensa de nosso experimento? Tem alguma sugestão melhor?

– Hoje, vocês me ensinaram uma nova lição e estou muito satisfeito com isso e só tenho a agradecer por me haverem escolhido para participar deste seu experimento. Apenas acho que vocês estão correndo o risco de encontrar alguém que não consiga entender o que estão fazendo e revidar à agressão. Até chego a arriscar-me a afirmar que vocês já encontraram esse tipo de pessoa, não é mesmo? Mas também se não corrermos algum risco na vida, nada, jamais, poderá ser conseguido, em termos de evolução. Sob esse ponto de vista, a metodologia experimental que vocês imaginaram é tão boa como outra qualquer. Já encontraram alguém que não entendesse o que estão a fazer e igualmente reações hostis, não é mesmo? Por outro lado, como se trata de um aprendizado, gostaria muito de acompanhá-los para partilhar desse aprendizado. Aceitar-me-iam como companheiro de jornada? Gostaria muito de adquirir novos conhecimentos. Posso ir com vocês?

– E se tudo o que dissemos for mentira? E se estivermos mal-intencionados? – perguntou o Mestre – Como reagiria a isso?

– Somente os loucos fazem coisas sem uma razão plausível. Sei, muito bem, distinguir um louco de um são e, definitivamente, tenho a mais cristalina das certezas de que vocês não são loucos. Logo, alguma razão vocês deverão ter para estarem agredindo gratuitamente as pessoas. Essa razão que me deram é tão boa e plausível como qualquer outra. Seja ela qual for, gostaria de seguir com vocês para ver se minhas conjecturas estão certas, ou seja, de que falaram a verdade e, se assim o for, compartilhar da experiência de vocês. Enfim, desejo aprender cada vez mais, e esta é uma boa ocasião para isso. Não acham?

Instantaneamente, tudo se desfez e logo estavam em outro ambiente, muito semelhante aos anteriores. O Mestre assim comentou:

– O homem do nível 4 já está bem distanciado e se desligando gradativamente dos afazeres mundanos. Já sabe que existem outros níveis mais baixos e outros mais elevados e está buscando apenas aprender mais e mais para evoluir, para tornar-se um sábio. Não é, em absoluto um erudito (embora até mesmo possa possuir algum diploma universitário) e já compreende bem a natureza humana para fazer julgamentos sensatos e lógicos. Por outro lado, possui uma curiosidade muito grande e uma insaciável sede de conhecimentos. E isso acontece porque abandonou suas “muletas” há muito pouco tempo, talvez há um mês ou dois. Ainda sente falta delas, mas já compreendeu que o melhor mesmo é viver sem elas. Dentro de muito pouco tempo, só mais um pouco de tempo, talvez mais um ano ou dois, assim que se acostumar, de fato, a sequer pensar nas muletas, estará realmente começando a trilhar o caminho certo para os próximos níveis. Mas vamos continuar com o nosso aprendizado. Repita o mesmo com este homem que aí vem, e vamos ver como reage um homem do nível 5. O tapa estalou.

Nível 5

– Filho meu… Eu bem o mereci por não haver logo percebido que estavas necessitando de ajuda. Em que te posso ser útil?

– Não entendi… Afinal, dei-lhe um tapa. Não vai reagir?

– Na verdade, cada agressão é um pedido de ajuda. Em que te posso ajudar, filho meu?

– Estamos dando tapas nas pessoas que passam, para conhecermos suas reações. Não é nada pessoal…

– Então, é nisso que te posso ajudar? Ajudar-te-ei com muita satisfação pedindo-te perdão por não haver logo percebido que desejas aprender. É meritória tua ação, pois o saber é a coisa mais importante que um ser humano pode adquirir. Somente por meio do saber é que o homem se eleva. E se estás querendo aprender, só tenho elogios a te oferecer. Logo aprenderás a lição mais importante que é a de ajudar desinteressadamente as pessoas, assim como estou a fazer com vocês, neste momento. Ainda terás um longo caminho pela frente, mas se desejares, posso ser o teu guia nos passos iniciais e te poupar de muitos transtornos e dissabores. Sinto-me perfeitamente capaz de guiar-te nos primeiros passos e fazer-te chegar até onde me encontro. Daí para diante, faremos o restante do aprendizado juntos. O que achas da proposta? Aceitas-me como teu guia?

Instantaneamente, a cena se desfez e logo se viram em outro caminho, um pouco mais agradável do que os demais, e o Mestre assim se expressou:

– Quando um homem atinge o nível 5, começa a entender que a Humanidade, em geral, digamos, o homem comum, é como uma espécie de adolescente que ainda não conseguiu sequer se encontrar e, por esse motivo, como todo e qualquer bom adolescente, é muito inseguro e, devido a essa insegurança, não sabe como pedir ajuda e agride a todos para chamar atenção sobre si mesmo e pedir, então, de maneira velada e indireta, a ajuda de que necessita. O homem do nível 5 possui a sincera vontade de ajudar e de auxiliar a todos desinteressadamente, sem visar vantagens pessoais. É como se fosse uma Irmã Dulce, um Chico Xavier ou uma Madre Teresa de Calcutá da vida. Sabe ser humilde e reconhece que ainda tem muito a aprender para atingir níveis evolutivos mais elevados. E deseja partilhar gratuitamente seus conhecimentos com todos os seres humanos. Compreende que a imensa maioria dos seres humanos usa “muletas” diversas e procura ajudá-los, dando-lhes exatamente aquilo que lhe é pedido, de acordo com a “muleta” que estão usando ou com o que lhes é mais acessível no nível em que se encontram. A partir do nível 5, o ser humano adquire a faculdade de perceber em qual nível o seu interlocutor se encontra. Agora, dê um tapa nesse homem que aí vem. Vamos ver como reage o homem do nível 6.

Nível 6

E o buscador iniciou o ritual. Pediu ao homem que parasse e lançou a mão ao seu rosto. Jamais entenderá como o outro, com um movimento quase instantâneo, desviou-se e a sua mão atingiu apenas o vazio.

– Meu filho querido! Por que você queria ferir-se a si mesmo? Ainda não aprendeu que agredindo os outros você estará agredindo a si mesmo? Você ainda não conseguiu entender que a Humanidade é um organismo único e que cada um de nós é apenas uma pequena célula desse imenso organismo? Seria você capaz de provocar, deliberadamente, em seu corpo, um ferimento que vai doer muito e cuja cicatrização orgânica e psíquica vai demorar e causará muito sofrimento inútil?

– Mas estamos realizando um experimento para descobrir qual será a reação das pessoas a uma agressão gratuita.

– Por que você não aprende primeiro a amar? Por que, em vez de dar um tapa, não dá um beijo nas pessoas? Assim, em lugar de causar-lhes sofrimento, estará demonstrando Amor. E o Amor é a Energia mais poderosa e sublime do Universo. Se você aprender a lição do Amor, logo poderá ensinar Amor para todas as outras células da Humanidade, e tenho a mais concreta certeza de que, em muito pouco tempo, toda a Humanidade será um imenso organismo amoroso que distribuirá Amor por todo o planeta e daí, por extensão, emitirá vibrações de Amor para todo o Universo. Eu amo a todos como amo a mim mesmo. No instante em que você compreender isso, passará a amar a si mesmo e a todos os demais seres humanos da mesma maneira e terá aprendido a Regra de Ouro do Universo: – Tudo é Amor! A vida é Amor! Nós somos centelhas de Amor! E por tanto amar você, jamais poderia permitir que você se ferisse, agredindo a mim. Se você ama uma criança, jamais permitirá que ela se machuque ou se fira, porque ela ainda não entende que se agir de determinada maneira perigosa irá ferir-se e irá sofrer. Você a amparará, não é mesmo? Você deverá aprender, em primeiro lugar, a Lição do Amor, a viver o Amor em toda sua plenitude, pois o Amor é tudo e, se você está vivo, deve sua vida a um Ato de Amor. Pense nisso, medite muito sobre isso. Dê Amor gratuitamente. Ensine Amor com muito Amor e logo verá como tudo a seu redor vai ficar mais sublime, mais diáfano, pois você estará flutuando sob os influxos da Energia mais poderosa do Universo, que é o Amor. E sua vida será sublime…

Instantaneamente, tudo se desfez e se viram em outro ambiente, ainda mais lindo e repousante do que este último em que estiveram. Então o Mestre falou:

– Este é um dos níveis mais elevados a que pode chegar o Ser Humano em sua senda evolutiva, ainda na Matéria, no Planeta Terra. Um homem que conseguiu entender o que é o Amor, já é um Homem Sublime, Inefável e quase Inatingível pelas infelicidades humanas, pois já descobriu o Começo da Verdade, mas ainda não a conhece em toda sua Plenitude, o que só acontecerá quando atingir o nível 7. Logo você descobrirá isso. Dê um tapa nesse homem que aí vem chegando.

Nível 7

E o buscador pediu ao homem que parasse. Quando seus olhares se cruzaram, uma espécie de choque elétrico percorreu-lhe todo o corpo e uma sensação mesclada de amor, compaixão, amizade desinteressada, compreensão, de profundo conhecimento de tudo que se relaciona à vida e um enorme sentimento de extrema segurança encheram-lhe todo o seu ser.

– Bata nele! – ordenou o Mestre.

– Não posso, Mestre, não posso…

– Bata nele! Faça um grande esforço, mas terá que bater nele! Nosso aprendizado só estará completo se você bater nele! Faça um grande esforço e bata! Vamos! Agora!

– Não, Mestre. Sua simples presença já é suficiente para que eu consiga compreender a futilidade de lhe dar um tapa. Prefiro dar um tapa em mim mesmo. Nele, porém, jamais!

– Bate-me – disse o Homem com muita firmeza e suavidade – pois só assim aprenderás tua lição e saberás finalmente, porque ainda existem guerras na Humanidade.

– Não posso… Não posso… Não tem o menor sentido fazer isso…

– Então – tornou o Homem – já aprendeste tua lição. Quem, dentre todos em quem bateste, a ensinou para ti? Reflete um pouco e me responde.

– Acho que foram os três primeiros, do nível 1 ao nível 3. Os outros apenas a ilustraram e a complementaram. Agora, compreendo o quão atrasados eles estão e o quanto ainda terão que caminhar na senda evolutiva para entender esse fato. Sinto por eles uma compaixão muito profunda. Estão de “muletas” e não sabem disso. E o pior de tudo é que não conseguem perceber que é até muito simples e muito fácil abandoná-las e que, no preciso instante em que a s abandonarem, começarão a progredir. Era essa a lição que eu deveria aprender?

– Sim, filho meu. Essa é apenas uma das muitas facetas do Verdadeiro Aprendizado. Ainda terás muito que aprender, mas já aprendeste a primeira e a maior de todas as lições. Existe a Ignorância! – volveu o Homem com suavidade e convicção – Mas ainda existem outras coisas mais que deves ter aprendido. O que foi?

– Aprendi, também, que é meu dever ensiná-los para que entendam que a vida está muito além daquilo que eles julgam ser muito importante – as suas “muletas” – e também sua busca inútil e desenfreada por sexo, status social, riquezas e poder. Nos outros níveis, comecei a entender que para se ensinar alguma coisa para alguém é preciso que tenhamos aprendido aquilo que vamos ensinar. Mas isso é um processo demorado demais, pois todo mundo quer tudo às pressas, imediatamente…

– A Humanidade ainda é uma criança , mal acabou de nascer, mal acabou de aprender que pode caminhar por conta própria, sem engatinhar, sem precisar usar “muletas”. O grande erro é que nós queremos fazer tudo às pressas e medir tudo pela duração de nossas vidas individuais. O importante é que compreendamos que o tempo deve ser contado em termos cósmicos, universais. Se assim o fizermos, começaremos, então, a entender que o Universo é um organismo imenso, ainda relativamente novo e que também está fazendo seu aprendizado por intermédio de nós – seres vivos conscientes e inteligentes que habitamos planetas disseminados por todo o Espaço Cósmico. Nossa vida individual só terá importância, mesmo, se conseguirmos entender e vivenciar, este conhecimento, esta grande Verdade: – Somos todos uma imensa equipe energética atuando nos mais diversos níveis energéticos daquilo que é conhecido como Vida e Universo, que, no final das contas, é tudo a mesma coisa.

– Mas sendo assim, para eu aprender tudo de que necessito para poder ensinar aos meus irmãos, precisarei de muito mais que uma vida. Ser-me-ão concedidas mais outras vidas, além desta que agora estou vivendo?

– Mas ainda não conseguiste vislumbrar que só existe uma única Vida e tu já a estás vivendo há milhões e milhões de anos e ainda a viverás por mais outros tantos milhões, nos mais diversos níveis? Tu já foste energia pura, átomo, molécula, vírus, bactéria, enfim, todos os seres que já apareceram na escala biológica. E tu ainda és tudo isso. Compreende, filho meu, nada se cria, nada se perde, tudo se transforma.

– Mas mesmo assim, então, não terei tempo, neste momento atual de minha manifestação no Universo, de aprender tudo o que é necessário ensinar aos meus irmãos que ainda se encontram nos níveis 1, 2 e 3.

– E quem o terá jamais, algum dia? Mas isso não tem a menor importância, pois tu já estás a ensinar o que aprendeste, nesta breve jornada mental. Já aprendeste que existem 7 níveis evolutivos possíveis aos seres humanos, aqui, agora, neste Planeta Terra. O Autor deste conto conseguiu transmiti-lo, há alguns milênios, através da Tradição Oral, durante muitas e muitas gerações. O Autor deste trabalho, ao ler esse conto, há muitos anos atrás, também aprendeu a mesma lição e agora a está transmitindo para todos aqueles que vierem a lê-lo e, no final, alguns desses leitores, um dia, ensinarão essa mesma lição a outros irmãos humanos. Compreendes, agora, que não será necessário mais do que uma única vida como um ser humano, neste Planeta Terra, para que aprendas tudo e que possas transmitir esse conhecimento a todos os seres humanos, nos próximos milênios vindouros? É só uma questão de tempo, não concordas, filho meu?

Conclusão

Agora, se quem deste aprendizado tomar conhecimento e, assim mesmo, não desejar progredir, não quiser deixar de lado as “muletas” que está usando ou não quiser aceitar essa verdade tão cristalina, o problema e a responsabilidade já não serão mais teus. Tu e todos os demais que estão transmitindo esse conhecimento já cumpriram as suas partes. Que os outros, os que dele estão tomando conhecimento, cumpram as suas. Para isso são livres e possuem o discernimento e o livre-arbítrio suficientes para fazer suas escolhas e nada tens com isso. Entendeste, filho meu?

Categorias:Atitude

O Centenário de Roberto Campos

Roberto Campos, Bobby Fields para os comunistas e para os socialistas carnívoros, foi um economista, diplomata e político brasileiro que ocupou os cargos de deputado federal, senador e ministro do Planejamento no governo de Castello Branco. Com frequência, vejo referências a ele quase como uma lanterna a iluminar debates sobre economia quando a centralização estatal dos progressistas autoritários é confrontada pelo liberalismo econômico. Para homenagear o centenário de um dos mais brilhantes pensadores brasileiros, o jornalista Augusto Nunes listou 20 frases de Roberto Campos que nos ajudam a ter uma ideia de como ele pensava. Como disse Churchill, “frases nos fazem pensar”.

Figura 1 – Roberto Campos

Todos sabemos que a ajuda externa não pode substituir em nenhum país o esforço próprio da economia, do qual depende fundamentalmente o desenvolvimento econômico.

Contemplando nossa paisagem, onde sobram vestígios de persistente irracionalidade no trato de certos problemas, como o desenvolvimento petrolífero ou o controle populacional, assaltam-me frequentemente cruéis dúvidas sobre os instintos democráticos do Criador, na distribuição de talento.

Para Karl Marx a ditadura do proletariado seria apenas um estágio na evolução dialética. Abolidas as classes e a propriedade privada, assistiríamos ao ‘fenecimento do Estado’ e a floração da liberdade. Infelizmente Marx era bom filósofo, medíocre profeta e mau político.

O desafio brasileiro é dual: elevar o nível de renda por habitante e diminuir a brecha que nos separa dos países mais industrializados. O primeiro objetivo visa a evitar a mutilação da pessoa humana pelo espectro da pobreza. O segundo é um requisito de poder nacional e um antídoto para o ressentimento e frustração oriundos da inferioridade econômica.

Há um sério desafio à diplomacia latino-americana. Sobram construtores de muros. Precisa-se urgentemente de construtores de pontes.

A psicologia de berçário, que herdamos do hino nacional (‘gigante … deitado eternamente em berço esplêndido…’) e o ufanismo das riquezas naturais (as quais são apenas recursos à espera de investimentos), que mamamos nos livros escolares, têm agido como narcotizantes da vontade nacional de desenvolvimento, transformando-nos no país do futuro, enquanto afanosamente conquistam o presente. Infelizmente, como já disse alhures, a chupeta do otimismo é mau substituto para a bigorna do realismo.

O importante para nós é maximizar a velocidade do crescimento da renda, da criação de empregos, da absorção de tecnologia. O resto é sentimentalismo.

São cinco as potências que dispõem de armas nucleares, multiplicando a tentação da imprudência e o risco de acidentes. Há demasiadas mãos no gatilho neste pobre planeta.

Persistem em nossa cultura e em nosso caráter elementos antagonísticos ao desenvolvimento. O primeiro desses elementos é o baixo nível de racionalidade de nosso comportamento, associado talvez ao tipo de educação beletrista e memorativa. A capacidade de exteriorizar emoções é mais prezada que a capacidade de resolver problemas.

No socialismo as intenções são melhores que os resultados, e no capitalismo os resultados melhores que as intenções.

No primeiro quarto deste século, vingou a utopia socialista. O segundo quarto assistiu ao nascimento, paixão e morte do nazifascismo. No terceiro quarto, capitalismo e comunismo se digladiaram na guerra fria. Neste último quarto de século, os velhos ‘ismos’ cada vez mais cedem lugar ao liberalismo.

A diplomacia é como um filme pornográfico: é melhor participar do que assistir.

A Revolução Francesa declarou os direitos do homem, mas certamente não os praticou. Só quase um século depois é que a França descobriria a democracia. Agora, que foi um bom artigo de exportação, isso foi… Várias revoluções do mundo nela buscaram inspiração, inclusive as revoluções latino-americanas, que nunca se celebrizaram pela tenacidade democrática ou sua afeição aos direitos humanos. O diabo das revoluções é que têm um ‘r’ demais.

Marx foi o pior dos profetas: vaticinou a explosão do capitalismo e o que ocorreu foi a implosão do socialismo. Aliás, o iracundo profeta que denunciou a espoliação burguesa era um espoliador nato. Vivia às custas de Engels e, em vez de botar salário no bolso de sua pobre empregada em Londres, botou-lhe um filho no ventre.

A vantagem do capitalismo é que, por ter exemplos de sucesso, admite fracassos e tem mecanismos de correção. Para os socialistas, ao invés, o fracasso é apenas um sucesso mal explicado.

Os comunistas brasileiros têm razão ao dizer que não é verdade que comam criancinhas. No ‘socialismo real’ a preferência histórica é por matar adultos.

No Brasil quase todos os presidenciáveis falam no capitalismo, conquanto não se saiba bem se querem a cabeça ou gostam do bolso dos capitalistas.

Se me perguntassem sobre o nível do debate econômico do país, eu diria que é uma razoável aproximação do Q.I. das ameba.

O Brasil é a grande amante de todos nós. Continuaremos amando-a, ainda que corneados.

É uma ilusão dos nossos esquerdistas imaginarem, idilicamente, que em 1964 havia uma opção entre uma democracia liberal e uma democracia social. A opção era entre dois autoritarismos, o da esquerda, ideológico, feroz, capaz de levar pessoas para o paredón, que levaria anos e anos para se autodestruir, e o da direita, envergonhado, encabulado, que toda hora falava em democracia, que procurava pelo menos manter o ritual de eleições, procurava manter o Congresso aberto. Essa era a real opção.

Categorias:Geral Tags:

Como Integrar o Apache Shiro a uma Aplicação JSF

O Shiro é um framework de segurança da Apache escrito em Java que permite a criação de soluções para autenticação, autorização, criptografia, gerenciamento de sessão e ainda fornece várias implementações de cache. Ele é simples de configurar e tem vários pontos de extensão que nos permitem intervir sobre seu funcionamento – são características de um framework bem projetado -, mas as configurações padrão já são suficientes para uma aplicação de pequeno porte.

Figura 1 – Arquitetura do Shiro

Nesse artigo, vou mostrar um exemplo de como integrar o Shiro a uma aplicação JSF. Nosso modelo será composto por uma enum chamada Permissao, uma enum Perfil para agrupar as permissões, e a entidade Usuario, que possui um Perfil:

public enum Permissao {
   CRIAR_PEDIDO, 
   LISTAR_PEDIDOS;
}

public enum Perfil {
   ADMINISTRADOR(Permissao.CRIAR_PEDIDO, Permissao.LISTAR_PEDIDOS);
   private List<Permissao> permissoes;
   private Perfil(Permissao... permissoes) {
      this.permissoes = Arrays.stream(permissoes).
         collect(Collectors.toList());
   }
}

@Entity
@Table(name = "TBL_USUARIO")
@TypeDefs(value = {@TypeDef(name = "TIPO_PERFIL" ...)})
public class Usuario {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "PK_USUARIO")
   private Long id;
   @Column(name = "NM_USUARIO")
   private String nome;
   @Column(name = "COD_PERFIL")
   @Type(type = "TIPO_PERFIL")
   private Perfil perfil;
}

Há várias formas de configurar o Shiro. Vou mostrar como configurá-lo à partir do arquivo de configuração shiro.ini. Precisamos incluir duas dependências no arquivo pom.xml – isso é o básico para o Shiro ser integrado a uma aplicação web:

<dependency>
   <groupId>org.apache.shiro</groupId>
   <artifactId>shiro-core</artifactId>
   <version>1.3.2</version>
</dependency>
<dependency>
   <groupId>org.apache.shiro</groupId>
   <artifactId>shiro-web</artifactId>
   <version>1.3.2</version>
</dependency>

Em seguida, vamos configurar o arquivo shiro.ini, que deve ficar no classpath – eu costumo colocar em /src/main/resources. As seções desse arquivo agrupam propriedades que determinam o comportamento do Shiro. Basicamente, informamos qual é o Realm utilizado (será explicado mais adiante), qual é a página de autenticação para a qual o Shiro redirecionará o usuário não autenticado, para onde o usuário será redirecionado após o logout e também permite que informemos que há páginas privadas que só podem ser acessadas por usuários que tenham determinadas permissões. No nosso exemplo, a página “criarpedido.xhtml” só pode ser acessada por usuários que contenham a permissão “CRIAR_PEDIDO”.

[main]
apprealm = br.com.app.autorizacao.AppRealm
securityManager.realms = $apprealm
authc.loginUrl = /publico/index.xhtml
logout.redirectUrl = /publico/index.xhtml

[users]

[roles]
ADMINISTRADOR = *

[urls]
/privado/criarpedido.xhtml =  authc, perms["CRIAR_PEDIDO"]

No arquivo web.xml, configuraremos os filtros e listeners do Shiro e também informaremos quais são as páginas que responderão pelos códigos de erro HTTP.

<filter>
   <filter-name>ShiroFilter</filter-name>
   <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>ShiroFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
   <dispatcher>ERROR</dispatcher>
</filter-mapping>

<listener>
   <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener
</listener-class>
</listener>
	
<error-page>
   <error-code>401</error-code>
   <location>/publico/acessonegado.xhtml</location>
</error-page>

<error-page>
   <error-code>403</error-code>
   <location>/publico/acessonegado.xhtml</location>
</error-page>

<error-page>
   <error-code>404</error-code>
   <location>/publico/paginanaoencontrada.xhtml</location>
</error-page>

<error-page>
   <error-code>500</error-code>
   <location>/publico/erro.xhtml</location>
</error-page>

Essa é toda a configuração básica que qualquer aplicação web precisa para ser integrada ao Shiro. De agora em diante, começaremos a implementação do nosso mecanismo de autenticação e autorização. Só então você verá como é simples trabalhar com o Shiro. Uma peça importante do mecanismo de autenticação é o AuthenticationToken, que é a classe que mantém as credenciais do usuário. Você pode escolher uma das implementações dessa interface disponíveis, mas vamos criar uma implementação dela que recebe o ID do usuário:

public class IdAuthenticationToken implements AuthenticationToken {
   private Integer userId;

   public IdAuthenticationToken(Integer userId) {
      this.userId= userId;
   }

   @Override
   public Object getPrincipal() {
      return this.id;
   }

   @Override
   public Object getCredentials() {
      return this.id;
   }
}

Você precisará informar ao Shiro que um usuário está se autenticando. Você pode fazer isso à partir de um servlet, campos de input em um formulário de uma tela que é tratada por um ManagedBean, etc. Eu fiz através de um servlet porque antes que o usuário se autenticasse na minha aplicação era feita client authentication contra um Apache Server para validar o certificado digital. Modifiquei um pouco o código para indicar que as credenciais do usuário estão vindo pela request, que no meu caso era um post realizado pela aplicação que rodava em um JBoss debaixo daquele Apache. A credencial é apenas o atributo “userId”, que foi fornecido pela aplicação que validou o certificado digital.

@WebServlet(displayName = "AutenticacaoServlet", 
   name = "AutenticacaoServlet", urlPatterns = "/autenticar")
public class AutenticacaoServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, 
      HttpServletResponse response)
     throws ServletException, IOException {
   Integer userId = (Integer) request.getAttribute("userId");
   Subject subject = SecurityUtils.getSubject();
   subject.login(new IdAuthenticationToken(token, userId));
   subject.checkPermission("CRIAR_PEDIDO");

   response.sendRedirect(request.getContextPath() + 
      "/private/criarpedido.xhtml?faces-redirect=true";

O Realm é um componente que interpreta os artefatos de segurança da aplicação – como usuários, regras e permissões – para o Shiro. Sendo o Realm a fonte de dados para autorização, podemos dizer, grosso modo, que ele é o DAO, ou melhor, um repository, que serve um modelo de autorização e autenticação.

Figura 2 – Sequência Simples de Autenticação

public class AppRealm extends SimpleAccountRealm {

   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(
       AuthenticationToken token) throws AuthenticationException {
      IdAuthenticationToken authToken = (IdAuthenticationToken) token;
      Optional<Usuario> usuario = usuarioDao.buscar(token.getUserId());
      return new SimpleAuthenticationInfo(
         usuario.get(), usuario.get().getId(), getName());
   }

   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(
        PrincipalCollection principals) {
      Set<String> roles = new HashSet<>();
      Set<String> permissions = new HashSet<>();

      Usuario usuario = (Usuario) SecurityUtils.getSubject().getPrincipal();
      Perfil perfil = usuario.getPerfil();

      roles.add(perfil.name());

      perfil.getPermissoes().forEach(a -> {
         permissions.add(a.nome());
      });

      SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
      info.setRoles(roles);
      info.setStringPermissions(permissions);
      return info;
   }

   @Override
   public String getName() {
      return getClass().getName();
   }

   @Override
   public boolean supports(AuthenticationToken token) {
      return IdAuthenticationToken.class.equals(token.getClass());
   }
}

Utilizamos a implementação SimpleAccountRealm, que é suficiente para o que nos propusemos a fazer. Se você quiser que o Shiro fique automaticamente consultando o banco de dados para carregar as permissões, basta utilizar um JdbcRealm e adicionar a consulta que o Shiro deve utilizar no arquivo shiro.ini.

Nesse momento, já temos um mecanismo que gerencia as credenciais do usuário e autoriza o acesso às páginas informadas na configuração inicial. Se você precisar fazer checagens de permissão ou verificar se o usuário está autenticado programaticamente, você deve acessar o Subject através do SecurityUtils ou utilizar as anotações do Shiro nos métodos das suas classes que devem ser autorizados.

Recomendações para Migração de Aplicações JSF “Puras”

Se você tem uma implementação de PhaseListener que de alguma forma toma decisões com base na URL acessada em sua aplicação JSF, remova-o. Na verdade, você deveria remover filtros, servlets e quaisquer outras implementações interessadas em autorização. Quem cuidará disso é o Shiro – mais especificamente a sua implementação de Realm.

É comum que aplicações JSF tenham uma ExceptionHandlerFactory para interceptar e tratar exceções nas páginas. Isso também não será necessário, pois o Shiro contém a ShiroException e suas variantes. Você também pode definir páginas específicas para tratar os códigos de erro HTTP mapeadas no seu arquivo web.xml.

Referências

1. [http://shiro.apache.org/reference.html]
2. [https://shiro.apache.org/java-authorization-guide.html]
3. [https://shiro.apache.org/authorization.html]
4. [https://shiro.apache.org/architecture.html]
5. [https://shiro.apache.org/configuration.html]
6. [http://galluzzo.com.br/?p=698]
7. [https://dzone.com/articles/java-security-framework-apache]
8. [http://czetsuya-tech.blogspot.com/2012/10/how-to-integrate-apache-shiro-with.html]
9. [http://www.javastutorial.com/2016/03/how-to-use-apache-shiroauthentication.html]