terça-feira, 16 de fevereiro de 2010

Componentes e Serviços.

Neste post eu farei uma rápida revisão do artigo da JavaWorld.com http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html que discute algumas boas práticas da arquitetura baseada em serviços, utilizando o JEE 6. Pretendo apenas ressaltar alguns pontos específicos, deixando toda a parte de implementação para o texto original.

Começarei por uma frase que me chamou a atenção logo de cara:

"Component contracts are comparable to SOA's services, except for their heavier dependence on particular technology and general lack of operations-related metadata..."

Agora em "Plain Old Portuguese Words": "Os contratos definidos pelos componentes de software são comparados aos serviços do SOA, excetuando-se o fato de que aqueles são pesadamente dependentes de uma determinada tecnologia e uma relativa falta de metadados relativos às operações disponibilizadas...". O que gosto desta frase é que mostra o caráter evolucionista e não revolucionário da arquitetura baseada em serviços.

A arquitetura exposta pelo autor é voltada à camada lógica e suas 3 estruturas internas:
  • Facade (ou Boundary): único ponto de acesso da camada cliente; exporta funcionalidades de nível de negócio; e coordena os serviços internos mantendo inclusive controle transacional.
  • Service (ou Control): serviços de "nível programacional", ou seja, que mantêm os princípios de componentes como alta coesão e baixo acoplamento.
  • Domain (ou Entity): encapsula entidades com estado persistente.
OK! não acredito que estas estruturas sejam novidade para grande parte dos leitores, mas o interessante do artigo aqui comentado são as reflexões sobre esta arquitetura e sua implementação no JEE, tais como:
  • O anti-pattern "Objetos anêmicos" é praticamente sugerido como padrão para SOA, pois: podem aumentar a produtividade dado que são facilmente geráveis de forma automática; entidades persistentes podem ser exportadas para o cliente sem correr o risco de se disponibilizar lógica de negócio.
  • O padrão DAO é posto em xeque, chegando-se a conclusão de que a forma original de definição do mesmo é irreal para grande parte dos componentes SOA; o autor sugere então a utilização de Generics para a implementação de um CRUDService... (isso eu já sabia, né Ed?).
É isso... espero ter conseguido ao menos despertar a curiosidade do leitor para a leitura do artigo revisado, e dizer que as dicas são preciosas para se introduzir a idéia de componentes de software no processo de desenvolvimento.

Leia Mais?

segunda-feira, 9 de novembro de 2009

"Sun Tech Days" - Vamos?

Nos próximos dias 8 e 9 de Dezembro estará acontecendo o "Sun Tech Days 2009-2010" em São Paulo. Ninguém menos que James Gosling estará presente, e junto a ele, muitos experts em várias tecnologias desenvolvidas e lideradas pela Sun. Visite a agenda do evento (http://www.suntechdays.com.br/agenda.html) e veja porque EU não vou perder, e porque você deve pensar seriamente em ir! =]

Aqui na UMMM (assim como nas minhas atividades de ensino e pesquisa) tenho buscado ir cada vez mais fundo no conhecimento de tecnologias como o JEE. OK! Muitos reclamam de uma impressão antiga de que as soluções "enterprise" são pesadas, desnecessariamente complexas, etc. Concordo em parte com isso quando se fala do passado, mas mesmo assim, precisamos guardar o momento histórico e olhar os arredores... Há alguns anos, todos estavam buscando as soluções mais adequadas, e acredito que apenas agora, a união entre inúmeras empresas, organizações e indivíduos, chegaram a soluções mais produtivas. É por isso que tenho acompanhado o surgimento do JEE 5 e 6, Glassfish v3, e outras questões relacionadas a infra-estruturas de Cloud Computing e de Software Social. Eu particularmente prefiro soluções Sun por serem abertamente discutidas, amplamente adotadas, e por terem implementações livres, permitindo-me estudos avançados. Várias soluções JEE estarão abordadas no http://www.suntechdays.com.br, no track de "Enterprise Computing", que cobrirei ao vivo via Twitter.

Para aqueles que preferem outras linhas de estudo da Sun, ainda acontecerão duas outras traks de palestras em paralelo, e uma de laboratório e prática (pena que ainda não inventaram uma forma de estar em dois lugares ao mesmo tempo, ou sim?). No "lado cliente" da coisa, acontecerão talks sobre JavaFX e JDK 7, discutindo questões mais que importantes como linguagens de script sobre a JVM. A outra linha de palestras é a do OpenSolaris, sistema operacional da Sun que há poucos anos surgiu da abertura do código do Solaris (desenvolvido para servidores) e hoje é uma solução viável para computadores pessoais. (EU testei e aprovei!). Por fim, paralelamente, acontecerão os "hands-on", ou "mãos-a-obra" temáticos, abordando praticamente tudo que é discutido nas palestras (Preciso dar um jeito de ir ao de "Comet e AJAX Push" em paralelo! =\ ).

Eu já estou com as páginas de companhias aéreas e hotéis da cidade abertas. Para mim que estou um tanto longe, vai ser além de tudo uma boa oportunidade para expandir minha rede de contatos, além de - é claro - poder visitar novamente a grande São Paulo.

Abraços, e fica a dica!

Leia Mais?

terça-feira, 28 de julho de 2009

Java Authentication and Authorization Service (JAAS)

Pessoal.

Neste post irei falar rapidamente sobre o JAAS (Java Autentication and Authorization Service), o mecanismo padrão Java para autenticação e autorização de aplicações corporativas.

Antes de tudo, eu gostaria de separar dois conceitos bastante distintos: autenticação e autorização.

Informalmente, por autenticação entende-se como a capacidade de determinar quem é o utilizador do sistema. Isto normalmente é feito através de uma combinação de nome de usuário e senha, chave pública e chave estrangeira, assinatura digital, etc. Enfim, a autenticação é responsável apenas por saber quem é quem.

Quanto a autorização, podemos definir como, dado que sabemos quem é o utilizador, determinar que recursos, a partir das credenciais do utilizador, este pode ou não ter acesso.

Mas afinal, o que é o JAAS? JAAS é um conjunto de APIs Java, que adiciona as funcionalidades de autenticação e autorização Java, implementando a especificação PAM (Puggable Authentication Module). Ou seja, JAAS é uma implementação de referência, porém podem existir outras implementações que se seguirem a
especificação PAM, podem ser plugadas a outras aplicações/contêineres JEE.


Conceitos básicos:

JAAS é composto por um número bastante pequeno de classes/interfaces. É importante conhecê-las rapidamente antes de começar a utilizar a tecnologia. Basicamente JAAS é formado por: Principal, Role, Login Module, Authentication Realm e Login Config.

  • Principal - Interface que define um usuário do sistema, um Principal deve ter pelo menos um nome que o identifique;
  • Role - Classe que define credenciais de usuário (ex: administradores, auditores, usuários, etc);
  • Login Module - Interface que define o comportamento a ser implementado por classes que devam realizar autenticação. Implementações desta interface devem registrar no contexto de segurança as informações do Princial e das Roles associadas a ele;
  • Authentication Realm - Implementações de Login Modules, definidas pelo servidor de aplicação, que podem ser instanciadas e parametrizadas diretamente no servidor de aplicação para serem acessadas por quaisquer aplicações utilizando JNDI para isto. A utilização de realms é interessante pois desacopla a estratégia de autenticação da implementação da aplicação;
  • Login Config - Informação configurada no arquivo WEB-INF/web.xml da aplicação que define a forma como a aplicação irá apresentar a autenticação para os seus usuários. É possível escolher entre as seguintes possibilidades: none, basic, digest, certificate e form.
Falaremos mais um pouco sobre as diferentes opções para a configuração do login (login config):
  • None - Nesta opção, padrão, não é realizado nenhum tipo de autenticação;
  • Basic - Utilizando esta opção, o browser irá mostrar uma janela onde o utilizador deverá entrar com o seu login/senha que serão enviados ao login module para verificação dos dados informados;
  • Digest - Semelhante ao basic, também e exibido um formulário para digitação do login/senha, porém as informações são criptografadas de agosto com um algoritmo configurado no próprio arquivo WEB-INF/web.xml. Existem algumas implementações padrão, como SHA e MD5, porém os desenvolvedores podem definir seus próprios algoritmos de criptografia;
  • Certificate - Autenticação baseada em certificados públicos e privados, desta forma, não há a necessidade de solicitar informações aos usuários, já que o certificado traz toda a informação necessária para a autenticação;
  • Form - Autenticação realizada através de um formulário web definido pelos desenvolvedores do sistema (configuração mais comum para login).
Estudo de caso

Iremos aplicar JAAS em um projeto web existente. Para isto iremos utilizar o Netbeans juntamente com o servidor de aplicação Glassfish. Neste exemplo utilizaremos um JDBC Realm e Form como Login Config.

Primeiro passo, vamos configurar o nosso authentication realm. Para realizar esta tarefa no Glassfish (para este exemplo utilizamos a versão 2.1) é necessário entrar no console de administração do servidor de aplicações.

Normalmente a URL do console de administração é http://localhost:4848, login - admin, senha - adminadmin:


Para este nosso exemplo, iremos utilizar um JDBC realm. Para utilizar esta implementação é necessário antes de criar um authentication realm, realizar das tabelas que irão armazenar a informação de autenticação bem como a definição do datasource no servidor de aplicações.

O esquema de banco de dados a ser criado (no nosso caso, utilizaremos o MySQL como tecnologia de banco de dados) deve ser constituído por pelo menos duas tabelas, uma com a informação dos usuários e outra com a informação das credenciais associadas a estes usuários:

CREATE TABLE USUARIO (
LOGIN VARCHAR(50) NOT NULL,
SENHA VARCHAR(50) NOT NULL,
PRIMARY KEY (LOGIN)
)

CREATE TABLE GRUPO_USUARIO (
GRUPO VARCHAR(50) NOT NULL,
LOGIN VARCHAR(50) NOT NULL,
PRIMARY KEY (GRUPO, LOGIN),
FOREIGN KEY (LOGIN) REFERENCES USUARIO(LOGIN)
)

... no Servidor de Aplicação

A definição de um data source é feita diretamente no servidor de aplicações. Esta estratégia de separar definição/configuração de uso foi tomada como padrão para o desenvolvimento de aplicações JEE e é bastante interessante pois consegue desacoplar o código de negócio das aplicações dos recursos externos utilizados por este código.

No Glassfish um data source é definido em dois passos: criação de um connection pool e criação de um data source propriamente dito. No primeiro passo são definidos os atributos da conexão com o banco de dados (classe do driver, url da conexão, usuário, senha, etc) bem como a definição de uma connection pool (número de conexões mínimo, número de conexões máximo, timeout de inatividade para conexões, etc) que intermediará o acesso entre a aplicação e o banco de dados.

Para criar uma connection pool no Glassfish devemos selecionar a opção Resources -> JDBC -> Connection Pools, em seguida devemos clicar no botão "New ...". Esta definição é feita em dois passos.

Passo 1 (definição do nome, classe do connection pool e tecnologia de banco de dados):


Entre com os valores e pressione o botão "Next".

Passo 2 (é mostrado uma enormidade de propriedades de configuração, 182, porém apenas é necessário mudar o valor das propriedades Url/URL, User e Password):

Em seguida, clique no botão "Finish".

Com o connection pool criado, vamos agora definir um data source, para isto devemos selecionar a opção Resources -> JDBC -> JDBC Resources, em seguida devemos clicar no botão "New ...".

Em seguida, precisamos apenas informar um nome JNDI (no formato: jdbc/nome_data_source) para o data source, selecionar o respectivo connection pool, definir uma breve descrição (opcional) e clicar no botão "Ok":



Agora iremos adicionar um authentication realm. Para isto devemos selecionar a opção Configuration -> Security -> Realms, em seguinda devemos clicar no botão "New ...". No formulário que será exibido, devemos entrar com os dados para a criação do realm (nome, implementação e propriedades relativas à implementação do realm):


É importante falar sobre algumas das propriedades informadas (lembre-se que estamos utilizando o JDBC e por isso precisamos escolher esta op
ção no ¨Class Name¨:
  • JNDI: Nome JDNI do data source criado anteriormente;
  • User table: Nome da tabela existente do data source informado que contém a informação dos usuários;
  • User name column: Nome da coluna na tabela de usuários que contém a informação do login para o usuário;
  • Password column: Nome da coluna na tabela de usuários que contém a informação da senha para o usuário;
  • Group table: Nome da tabela que contém as informações das credencias associadas aos usuários. Esta tabela deve estar definida no data source informado;
  • Group name column: Nome da coluna na tabela de grupos que contém a informação da credencial do usuário. Observação: Não é pedido para informar o nome da chave estrangeira na tabela de grupos associada à tabela de usuários, pois infere-se que esta coluna deverá ter o mesmo nome nas duas tabelas. No nosso caso, tanto na tabela USUARIO quanto na tabela GRUPO_USUARIO esta coluna chama-se LOGIN;
  • Digest algorithm: Nome do algoritmo de criptografia utilizado para armazenar as senhas. Existem algumas alternativas pré-definidas (none, SHA e MD5).
... na Aplica
ção Web

Após realizar a configuração necessária no servidor de aplicações é chegado o instante de configurar a aplicação para utilizar o JAAS. Esta configuração é feita em 3 níveis: arquivo WEB-INF/web.xml, anotações nos métodos e definição de exibição de componentes, mediante credenciais, nos arquivos JSP.

Começaremos configurando o arquivo WEB-INF/web.xml. Para isto, iremos abrir este arquivo no Netbeans (do projeto no qual queremos adicionar o JAAS) e utilizaremos o seu editor gráfico para facilitar esta tarefa:

Devemos selecionar a aba "Segurança":

Neste formulário iremos definir a princípio qual o realm ("nome do território" na tradução para português do Netbeans) e qual a configuração de login que iremos utilizar. Para isto devemos informar o nome do realm que criamos no servidor de aplicação e devemos selecionar qual configuração de login desejada, no nosso caso será form (ou formulário).

Para este exemplo, informamos que a página que será utilizada como formulário de autenticação será definida pela url "/login.jsf" e que caso a autenticação não corra bem, será exibida uma outra página definida pela url "/login_error.jsf".

Logo abaixo, vê-se as áreas para a definição das credenciais (papéis de segurança / security roles) e para a configuração das restrições de segurança para a aplicação:

Na área reservada para os papéis de segurança, deve-se informar quais são as credenciais (nome e descrição) que estarão envolvidas na aplicação. Em todos os outros pontos, quando forem referidos papéis, deve-se utilizar apenas os nomes que foram configurados nesta área.

Quanto à área reservada para as restrições de segurança, deve-se configurar que papéis podem acessar determinadas áreas da aplicação (definidas através de padrões de url).

Neste exemplo, criamos os papéis admin-role e user-role. Estes papéis definem, respectivamente, os usuários com privilégios administrativos e usuários em geral da aplicação.

Em seguida, iremos criar pelo menos duas restrições de segurança, uma chamada "Área Administrativa" que define que apenas usuários com credenciais "admin-role" podem acessar urls com o padrão "/admin/*"; e outra restrição de segurança, chamada "Zona Privativa" que define que apenas usuários com credenciais "admin-role" e "user-role" podem acessar urls com o padrão "/privado/*". Logo, infere-se, que quaisquer outros padrões de urls da aplicação podem ser acessados por usuários que não estejam autenticados. Em um caso extremo, onde nenhuma página pode ser acessada por usuários não autenticados, o desenvolvedor pode configurar uma restrição de segurança para o padrão de url "/*".

Vejamos a seguir o diálogo para definição de uma restrição de segurança:

Vejamos agora como foram definidos os formulários de login em caso de sucesso e em caso de erro.

Trecho do arquivo login.xhtml:

Atenção para a ação do formulário e os nomes dos campos de login e de senha. Estes nomes (j_security_check, j_username e j_password, respectivamente) são definidos pelo JAAS e são encaminhados automaticamente para o login module configurado (no nosso caso, para o JDBC Realm).

O arquivo login_error.xhtml não possui nada de especial, ele apenas exibe uma mensagem de erro para o usuário.

Se você chegou até este ponto do post, parabéns!, você já deve ter uma aplicação JEE com segurança JAAS funcionando. Podem executar e testar a aplicação.

... na Lógica de Negócio

Porém os mecanismos de segurança que a plataforma JEE nos provê são muito mais abrangentes. Veremos agora como definir restrições de acesso para os métodos da aplicação. Estas restrições devem ser adicionadas nos métodos das facades, para impedir/regular o acesso a estes métodos. Alguém pode pergutar-se acerca da necessidade de adicionar este nível de restrição de segurança, já que na camada de apresentação (a partir de padrões de URL) a aplicação já está segura. Existem duas respostas simples: programadores são falíveis e podem esquecer alguma restrição importante na camada de apresentação; invasores e/ou programadores maliciosos podem tentar acessar diretamente às fachadas da aplicação (principalmente se estas forem acessíveis remotamente via JNDI ou WebServices, por exemplo).

As restrições de segurança para os métodos são definidas utilizando-se a anotação @RolesAllowed (aplicadas a métodos e/ou classes). Quando esta anotação é aplicada a um método, ela define que papéis podem executar este método, quando ela é aplicada a uma classe ela define as restrições de acesso para todos os métodos desta classe. É importante destacar que estas anotações apenas surtirão efeito em classes instanciadas pelo servidor de aplicação (EJBs, WebServices, Backing Beans, etc).

Exemplo:

... na Camada de Visão

Finalmente, ainda é possível condicionar a exibição de componentes nas nossas páginas jsp (jspx, xhtml, etc) mediante as credenciais do usuário autenticado. No nosso caso, utilizamos a tecnologia JSF, implementação de referência da Sun (Mojarra) com a biblioteca de componentes Richfaces (ufa!).

Para realizar esta verificação devemos utilizar o atributo rendered, existente em todos os componentes de biblioteca padrão JSF bem como nos componentes definidos pelo Richfaces. Neste atributo deve-se informar uma expressão booleana (em EL - expression language) que irá determinar a exibição (caso a expressão retorne true) ou a ocultação (caso a expressão retorne false) do componente em questão.

Além disto, o Richfaces provê uma função no contexto EL, chamada rich:isUserInRole que deve ser usada nos atributos rendered para o condicionamento da exibição mediante às credenciais do usuário corrente.

Exemplo:

rendered="#{rich:isUserInRole('usuario-role, admin-role')}"

Conclusão:

Pessoal, espero ter conseguido passar uma introdução à tecnologia JAAS de uma forma rápida (sintam-se livres para postar perguntas).

Espero também que todos vejam esta tecnologia como uma ótima alternativa no instante de implementar autorização/autenticação em suas aplicações ao invés de estarmos sempre implementando nossos próprios esquemas de segurança ad-hoc.

Abraços.

Leia Mais?

Java Specialists

Pessoal, vou aproveitar aqui o espaço para compartilhar com vocês um blog importantíssimo para quem gosta, usa e/ou precisa de Java. Chama-se Java Specialists e é escrito por Dr. Heinz Kabutz, um alemão (parabéns pelo nome) que atualmente mora e trabalha na Grécia e que é um Java Champion, titulação oferecida pela Sun para alguns poucos mortais que realmente entendem de Java.
Este blog começou pela preocupação do autor em verificar que os profissionais de Java não entendem muito bem como a concorrência funciona. As pessoas limitam-se a criar Threads e pouco se importam com condições de corrida, sinais, dead-locks, etc. Com a intenção de melhor esclarecer os profissionais da área sobre estes tópicos, o Dr. Heinz começou a escrever as leis da concorrência, que são um conjunto de leis, com nomes bem legais e fáceis de decorar (lei de ponto cego, lei do trânsito em Creta, lei do pescador distraído, etc), com uma historinha legal e que passa alguns conceitos bem interessantes.
Porém o blog cresceu e hoje existem discussões sobre vários aspectos importantes da tecnologia Java, tais quais:

  • É melhor contenar Strings utilizando o operador de concatenação (+), um StringBuffer ou um StringBuilder ? (link)
  • É possível adicionar valores à enumerações em tempo de execução ? (link 1, link 2)
  • Quem é mais rápido ArrayList ou LinkedList ? (link)
  • Como crir um interpretador de BASIC em Java com cerca de 100 linhas ? (link)
  • O que fazer quando capturar InterruptedExceptions ?
  • Deve-se criar Threads dentro de aplicações Swing ?
Finalmente o blog conta com alguns artigos variados, como por exemplo a construção de um resolvedor de Sudokus (link) ou uma ótima discussão do esforço necessário para se tornar especialista em algo (ótimo artigo para reflexão - link).

Por fim, segue o link para o blog, espero que todos gostem, leiam os artigos e gerem feedback aqui para nós.

[]'s

Leia Mais?

sexta-feira, 24 de julho de 2009

Segurança de aplicações Java

Galera, finalmente escrevo aqui no blog. Para o meu post inicial escolhi um tema bastante comentado em nossas conversas: segurança em aplicações Java.
Antes de tudo, vou falar sobre a segurança nativa a qualquer aplicação Java, provida já pela JRE. Esta segurança é feita através de um mecanismo de permissões associadas a um gerenciador de segurança (instância da classe SecurityManager), associados a uma execução do sistema (representada pela classe System).
Um SecurityManager é responsável por aplicar uma política de segurança ao sistema. Esta classe define vários métodos, com a assinatura do tipo "checkXXX(argumento, ...)", responsáveis por verificar se uma determinada operação é possível de ser executada.
Por exemplo os seguintes métodos:

  • checkAccept(String host, int port) - indica se é possível aceitar conexões de Sockets a partir de um determinado host e de uma determinada porta;
  • checkExit(int status) - indica se é possível terminar a execução da JVM com um determinado status;
  • checkDelete(String file) - indica se é permitido remover um determinado arquivo.
Um programador pode obter o SecurityManager atual a partir da chamada System.getSecurityManager( ) e pode definí-lo através de código, System.setSecurityManager(securityManager), passando como parâmetro uma subclasse de SecurityManager, ou definindo no momento da inicialização da JVM um "policy file" contendo as definições de segurança para a aplicação: -Djava.security.policy=arquivo.policy.
Este "arquivo de polícia" pode ser definido manualmente (utililizando um editor de textos qualquer) ou através da ferramenta policytool (que acompanha qualquer distribuição do JDK).

O formato deste arquivo é o seguinte:
grant {

permission CLASSE_DA_PERMISSÃO "PARÂMETRO_1", "PARÂMETRO_2", "PARÂMETRO_N";

};
Exemplo:
grant {

permission java.io.FilePermission "C:\\users\\cathy\\foo.bat", "read";

};
Ao iniciar uma aplicação a JVM verifica se foi definido algum Security Manager, caso negativo, ele introduz uma implementação de acordo com o tipo da aplicação. Para applets, é introduzido um Security Manager altamente restritivo, que não permite que as aplicações acessem os recursos da máquina em que executa, por exemplo; para aplicações web o servidor web/servidor de aplicações introduz o seu próprio Security Manager, que normalmente não permite a leitura/escrita em áreas protegidas do sistema de arquivos; finalmente, para aplicações desktop, o Security Manager padrão não realiza quaisquer restrições.
Façamos agora um pequeno estudo de caso. Aplicações RMI merecem bastante atenção em relação à segurança, já que instâncias de classes serão carregadas dinâmicamente pela rede, ou seja, caso um usuário malicioso conheça o endereço do "RMI registry" e as interfaces utilizadas, é muito fácil introduzir um código malicioso neste registro, que poderá vir a ser executado por outros usuários desavisados.
No caso do RMI, a implementação atual de Java define um gerenciador de segurança (RMISecurityManager) e algumas classes de permissão que devem ser parametrizadas para a correta configuração da aplicação.
Para utilizar o gerenciador de segurança RMI, um usuário deve simplesmente fazer:
System.setSecurityManager(new RMISecurityManager());
As classes de permissão definidas para ser utilizadas por este gerenciador são:
  • java.io.FilePermission;
  • java.net.SocketPermission;
  • java.security.SecurityPermission;
  • java.lang.RuntimePermission.
Estas permissões podem ser configuradas a partir de um objeto Properties, passado para o gerenciador de segurança, ou a patir de um arquivo de polícia (opção mais comum e recomendada). Um exemplo típico de um arquivo de polícia para uma aplicação RMI é:

grant {

permission java.net.SocketPermission "*:1024-", "connect,accept";

permission java.io.FilePermission "/home/public_html/classes/-", "read";

};

grant codeBase "http://exemplo.com/classes/" {

permission java.security.AllPermission;

}


Neste exemplo acima nós podemos ver que para aplicação em questão é permitido o acesso à porta 1024 a partir de qualquer host; também é permitido apenas a leitura aos arquivos contidos no diretório "/home/public_html/classes"; finalmente, é permitido o download de classes a partir da url "http://exemplo.com/classes".
Também é possível definir as suas próprias permissões e utilizá-las em suas aplicações. Para isto, nos métodos onde serão verificadas as permissões, deve-se adicionar um código de verificação tal como:

SecurityManager sm = System.getSecurityManager();

if (sm != null) {

sm.checkPermission(new ClasseDePermissao());

}

Desta forma, se não for definido nenhum gerente de segurança a aplicação irá correr normalmente, porém caso seja definido um, a sua execução será condicionada pelas permissões definidas. Para definir permissões personalizadas, um usuário tanto pode criar subclasses da classe abstrata Permission, ou pode simplesmente parametrizar a classe RuntimePermission, ex:

SecurityManager sm = System.getSecurityManager();

if (sm != null) {

sm.checkPermission(new RuntimePermission("excluirRegistro"));

}

Finalmene, uma dica bem legal é utilizar um ProfilingSecurityManager, que registra todas as tentativas de acesso de uma determinada aplicação aos recursos de segurança da JVM. Desta forma nós poderemos encontrar "furos" e/ou realizar um ajuste fino da sua configuração de segurança. No link a seguir podemos ver uma discussão pormenorizada sobre a implementação/utilização de um ProfilingSecurityManager:

Link

Pessoal, é isso, concluo aqui este meu primeiro post, espero que vocês tenham gostado e que comentem, prometo complementá-lo com mais dois contendo informações sobre JAAS e Spring Security.

Leia Mais?

domingo, 17 de maio de 2009

O eBay e a visão de um futuro com "Webtop"

Fazendo uma de minhas andanças desinteressadas por uma livraria de Recife, acabei encontrando o livro "Web 2.0 Heroes" da Digerati Books, que é uma compilação de algumas entrevistas realizadas por Bradley L. Jones com nomes relacionados a grandes empreendimentos da Web. A primeira delas foi feita a Max Mancini da eBay a qual irei comentar.

Os tópicos discutidos não deveriam - obviamente - estar distantes da evolução da Web, e as palavras chaves aqui são: mashups, interfaces web ricas e e-commerce social. A coisa mais interessante aos meus olhos foi a opinião de Mancini sobre o próximo passo, o que às vezes é denominado de Web 3.0. Para ele, a Web Semântica vai ter que dar a vez para um "ofuscamento das linhas entre o Desktop e a Web".

"A Adobe está pulando algo (...) a web não tem a ver com o navegador (...) apenas vivenciamos isso dessa forma hoje."
Os exemplos que constatam esta afirmação vêm de dois lados: a guerra de plataformas para RIA; e a corrida para a criação e abertura de padrões para a criação de portais via Gadgets. Do primeiro lado estão tecnologias como o Adobe Flex and Air - que utiliza-se da vantagem de disseminação do Flash; JavaFX, que chegou mais tarde, mas tem uma comunidade fiel de desenvolvedores; e o Microsoft Silverlight que certamente buscará levar vantagem de sua plataforma unificada Windows+.Net! Estas certamente não são as únicas, mas são as soluções propostas por figurões da TI.

Na segunda face da moeda estão as plataformas que buscam avançar computador a dentro, objetivando a popularização de negócios e a facilitação de acesso aos mesmos pelos usuários. Os exemplos normalmente partem de redes sociais - um dos grandes trunfos da Web 2 - como Facebook, LinkedIn e Orkut/OpenSocial. Yahoo e Google são duas gigantes que vivem de clicks e que têm total interesse em ganhar o mercado dos Gadgets, que são pedaços de software focados em levar um serviço Web para o "momento-a-momento" dos milhões de usuários da Internet, infiltrar-se nas tarefas corriqueiras e estar lá para lembrar que o usuário "pode contar com tal serviço". Como dito anteriormente, RIA e Gadgets seriam os dois pontos de base para a idéia de um "Webtop".

Dentre outros pontos mais comuns abordados estão os problemas com a monetização e segurança na Web 2.0, questões estas que deverão ser postas em xeque com o aumento do número de negócios baseados nas inovações desta "nova Web". Um outro ponto é a ascensão do modelo de negócio denominado Software como Serviço (SaaS), que traça uma linha entre aqueles (normalmente) pequenos negócio que preferem investir em agilidade e as grandes corporações que preferem manter o controle sobre toda a pilha de soluções.

Para encerrar este rápido comentário sobre a entrevista, algumas citações de Mancini:

Sobre web-semântica
"Para a Web Semântica realmente acontecer, é preciso que haja uma mudança na habilidade e disposição das pessoas em ajudar a organizar as tags!"
Sobre SaaS:
"É bem mais barato desenvolver coisas com uma API baseada em REST, mas a fase inicial é cara, embora não tanto quanto para o Desktop."
Sobre Gadgets:
"Do meu ponto de vista, em cinco anos, o eBay será muito mais acerca do eBay espalhado na Web (Widgets, Desktop, TV Digital, Celulares) do que ser o eBay.com"
Sobre a visão do negócio:
"A diferença não será investir muito dinheiro, mas sim a experiência do usuário, e quais informações você está combinando de maneira correta!"

Leia Mais?

quinta-feira, 7 de maio de 2009

Web X.0 + Clouds + SaaS

Este Blog é um esforço conjunto de alguns estudiosos e empreendedores da área de Tecnologia da Informação e Comunicação, e buscará ser uma referência para interessados no assunto, principalmente nas áreas da WWW, Cloud Computing e SaaS. Da World Wide Web, ou simplesmente web, pouco se precisa falar. O número crescente de "moradores" desde novo mundo já diz tudo, usuários estes que sem querer criaram uma força de incentivo a inovação constante. As ferramentas melhoraram, e a união de muitas novas idéias têm recebido nomes como Web 2.0 ou 3.0. Trataremos sobre isso aqui!

Depois do bum do comércio eletrônico, empresas como a Amazon tiveram que construir super infra-estruturas para suportar as transações. Empresas como a Google se especializaram em minerar dados de seus usuários para fazer dinheiro em milhões de clicks patrocinados. Estes enormes clusters de hardware, deram suporte ao crescimento de uma tendência denominada Computação nas Nuvens. A nuvem é um ambiente onde o software é posto para executar de forma escalável e facilitada, onde startups de TIC podem, com investimento reduzido, dar vazão a seus negócios. Este é mais um ponto de intere para este Blog.

A união entre Web 2 e Clouds normalmente vai desaguar em uma tendência denominada Software as a Service, ou venda de aplicações computacionais como serviço. As facilidades de conectividade disponibilizadas pela Internet, e as infra-estruturas de software desenvolvidas por empresas como Microsoft (Azure), Google (App Engine) e Amazon (EC2); tornaram possíveis a construção de soluções computacionais que podem ser disponibilizadas inteiramente na Web, aumentando o mercado a ser atingido.

Estas soluções são o foco da UMMM Serviços Computacionais, empresa sertanejo-paraibana, que patrocinará a manutenção do conhecimento aqui disponibilizado e discutido.

Sejam bem vindos ao mundo da invoção do software!

Leia Mais?