j boss seam

91
JBoss Seam Introdução

Upload: jornaljava

Post on 25-May-2015

4.480 views

Category:

Documents


3 download

DESCRIPTION

Curso de Seam da VerdeSource

TRANSCRIPT

Page 1: J boss seam

JBoss Seam

Introdução

Page 2: J boss seam

O que é Jboss Seam?

Segundo a definição da Palavra:

Seam = Emenda

Seam não é um acrônimo (SEAM):

Stop Enterprise Application Masochism

Software for Enterprise Application Masterpieces

Page 3: J boss seam

O que é Jboss Seam?

Informações gerais:• Criado por Gavin King (criador do Hibernate)• Versão 1.0 Beta 1 em 18/09/2005• Versão 1.0.0.GA lançada em 12/06/2006

Page 4: J boss seam

O que é Jboss Seam?

• Versão atual de produção: 2.1.2.GA• Comunidade extremamente ativa:

www.seamframework.org• Mais de 1.000 usuários registrados no primeiro mês• Atualmente, mais de 5.000 usuários registrados

Page 5: J boss seam

O que é Jboss Seam?

• De acordo com o site oficial : Seam é um framework para Java Enterprise (JavaEE)

• Seam não é simplesmente outro framework de Integração

• Não é também uma resposta ao Spring Framework.

Page 6: J boss seam

O que é Jboss Seam?

• Componente unificado: Managed Beans (EJB3)• Extensão dos contextos Java Servlet, com a

adição do escopo “Conversation”• Gerenciamento do PersistenceContext• Não faz distinção entre os componentes da camada de

apresentação e camada de negócios:business logic components

• Você cria sua arquitetura e define suas camadas

Page 7: J boss seam

O que é Jboss Seam?

 Integração entre  JSF e EJB 3.0

• O JBoss Seam faz todo o “trabalho sujo” de integração entre JSF e EJB 3.0, deixando o desenvolvedor concentrado no domínio de negócios

• O JBoss Seam foi feito para o JSF:Além do JSF, o JBoss Seam permite outras tecnologias  para a camada de apresentação:Wicket, Tapestry, GWT e Flex (GraniteDS e BlazeDS)

• Além de não depender do JSF para a camada de Apresentação, o JBoss Seam funciona com ou sem EJB 3.0

Page 8: J boss seam

O que é Jboss Seam?

Tipos de componentes Seam:

• JavaBeans• EJB 3.0:

– Stateless Session Beans– Stateful Session Beans– Entity Beans– Message-Driven Beans

Page 9: J boss seam

O que é Jboss Seam?

Virtualmente, qualquer classe Java pode se tornar um

componente Seam

@Name (“meuComponente”)

public class meuComponente {

...

...

}

Page 10: J boss seam

O que é Jboss Seam?

• Modelo unificado de componentes:• Não há distinção entre componentes da camada de

apresentação e componentes da camada de negócios:• Não se faz necessário o uso de DTO/VO

<h:form>

<h:inputText value="#{user.name}“ />

<h:inputText value="#{user.telefone}" />

</h:form>

@Entity

@Name(“user”)

public class User {

private String name;

private String telefone;

Page 11: J boss seam

O que é Jboss Seam?

Modelo unificado de componentes (continuação):• O modelo de componentes do JBoss Seam permite a

utilização direta de POJOs como “backing beans” para as

páginas JSF:

• Nada de cadastrar classes no faces-config.xml:

<managed-bean>

<managed-bean-name>cadastro</managed-bean-name>

<managed-bean-class>demo.Cadastro</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

Page 12: J boss seam

O que é Jboss Seam?

• Elimina camadas/artefatos “desnecessários”:

VO/DTO, DAO, Service Locator, OpenSessionInView...

• VOCÊ monta a arquitetura da sua aplicação, define as

camadas e como elas vão interagir

Page 13: J boss seam

O que é Jboss Seam?

Integração com AJAX• Suporte “out of the box” para frameworks open source

baseados em JSF:• Adiciona suporte AJAX sem a necessidade de

codificação de JavaScript pelo desenvolvedor• ICEfaces• JBoss RichFaces:

<h:inputText value="#{user.name}" required="true">

<f:validateLength maximum="30" minimum="3"/>

<rich:ajaxValidator/>

</h:inputText><br/>

Page 14: J boss seam

O que é Jboss Seam?

Possui uma camada de JavaScript remoto:

• Acesso aos componentes Seam direto do JavaScript:

Integração com:• Dojo• GWT

var meuComp = Seam.Component.newInstance(“meuComp”);

meuComp.setXXX(Valor);

Page 15: J boss seam

O que é Jboss Seam?

• Estende os contextos definidos pela especificação de Servlets:

request (event), page, session e application com dois novos contextos:– Conversation– Business process

Page 16: J boss seam

O que é Jboss Seam?

Conversation• Conceito chave no JBoss Seam• A conversação representa uma “unidade de trabalho” do

ponto de vista do usuário:• Geralmente associada a um Caso de Uso• Um usuário pode ter várias conversações ao mesmo

tempo:• Normalmente em múltiplas janelas do browser• Facilita a construção de “wizards”• Facilita o uso de AJAX

Page 17: J boss seam

O que é Jboss Seam?

Conversation (continuação)

• Facilita ainda mais o uso do JPA:• Evita a famigerada LIE (LazyInitializationException)

Business process• Contexto Stateful (Banco de Dados)• O usuário pode continuar a interação com o sistema

mais tarde

Page 18: J boss seam

O que é Jboss Seam?

• O JBoss Seam suporta o conceito de Inversão de Controle (IoC) ou Injeção de Dependências (DI), mas vai além

• A injeção de dependências funciona bem no modelo de

arquitetura stateless, mas, em uma arquitetura stateful,

precisamos que a injeção de dependências seja

bidirecional:

Page 19: J boss seam

O que é Jboss Seam?

Bijeção (Injeção + Ejeção):

Estende o modelo de IoC:

• Dinâmica

• Contextual

• Bidirecional

A bijeção ocorre:

• Antes e depois das chamadas aos métodos

Page 20: J boss seam

O que é Jboss Seam?

Injection:• Componente é recuperado de um contexto (ou criado,

dependendo da configuração) e injetado em outro

componente:

@In

private User user;

Page 21: J boss seam

Jboss Seam?

Outjection:• Um componente “ejeta/coloca” outro componente em

um contexto:

@Out

Usuario user;

• Para criar um componente podemos usar

@Factory

private void pesquisar() {

....

}

Page 22: J boss seam

Configuração do Seam

Seam servlet e listener• Servlet que processa todas requisições Seam

File: /WEB-INF/web.xml

<servlet>

<servlet-name>Faces Servlet</servlet-name>

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

< servlet-mapping>

<servlet-name>Faces Servlet</servlet-name>

<url-pattern>*.seam</url-pattern>

</servlet-mapping>

Page 23: J boss seam

Configuração do Seam

• Listener, responsável por “startar” o seam e destruir as sessões e contexto de aplicação

<listener>

<listener-class>org.jboss.seam.servlet.SeamListener</listener-class>

</listener>

Page 24: J boss seam

Configuração

Arquivos requeridos de configuração:

/WEB-INF/faces.config• configuração especifica JSF

/WEB-INF/components.xml• configuração do Seam• colocado em META-INF

Page 25: J boss seam

Configuração

/WEB-INF/pages.xml• Navegação do Seam• É opcional, mas recomendado

seam.properties• Configurações do Seam, geralmente vazio.• Deve ser colocado em todo lugar que tiver algum

componente Seam (@Name)

Page 26: J boss seam

Configuração

Configuração Facelets

WEB-INF/faces-config.xml

<application>

<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>

</application>

WEB-INF/web.xml

<context-param>

<param-name>javax.faces.DEFAULT_SUFFIX</param-name>

<param-value>.xhtml</param-value>

</context-param>

Page 27: J boss seam

Configuração

Seam Filter• Requerido para controle de erro, progagação de

conversação

WEB-INF/web.xml

<filter>

<filter-name>Seam Filter</filter-name>

<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>Seam Filter</filter-name>

<url-pattern>/pattern>/*</url-pattern>

</filter-mapping>

Page 28: J boss seam

Configuração

Filtro de tratamento de Erros

• Erros podem ser mapeados para uma página própria para erros

File: /WEB-INF/pages.xml

<exception class="org.jboss.seam.framework.EntityNotFoundException">

<redirect view-id="/error.xhtml">

<message>Not found</message>

</redirect>

Page 29: J boss seam

Exercício 1

• Vamos criar nossa primeira aplicação em Jboss Seam ;-)

• Cadastro de usuários: igual a versão feita em JSF

Page 30: J boss seam

Resultado do Exercício 1

Page 31: J boss seam

Continuando...

Validação:

• Onde colocar as regras de validação?• Na camada de apresentação?• Sim, precisamos informar os erros de validação para o

Usuário• Mas, também temos de garantir as regras/restrições

na camada de persistência

Page 32: J boss seam

Validação

• Clientes que utilizem as classes de domínio podem

fazer um “bypass” da validação (Ex. Aplicação

Desktop, WebServices)• “Bad design”: Regras de validação fazem parte do

objeto de domínio (Persistent Domain Objects)

• Melhor opção: colocar a validação nas classes de

domínio e reaproveitá-las na camada de apresentação

com a utilização de AJAX

Page 33: J boss seam

Validação

Hibernate Validator:

• Vários validadores pré-definidos: Max, Min, Length,

Range, Size, Email, Future, Past, Pattern, Email,

CreditCard, etc• Fácil customização (Ex: @CPF, @StrongPassword)• Funciona com qualquer implementação de JPA:• Se utilizado com o Hibernate, gera a DDL com todas

as restrições definidas

Page 34: J boss seam

Validação

Hibernate Validator:

• Esforço de padronização da especificação Bean Validator

• Validation (JSR 303)• Validação na classe de domínio:

Page 35: J boss seam

Validação

• Integração do JSF/Facelets com o Hibernate Validator:• O JBoss Seam leva a validação definida no objeto de

domínio para a camada de apresentação:

Seam JSF Controls:• <s:validate/>, <s:validateAll>

Page 36: J boss seam

Validação

Lê a anotação (meta-informação) definida e a utiliza

como validador no JSF• <s:decorate/>• “Decora” o campo quando há algum erro de validação

Page 37: J boss seam

Validação (Decorate)

<ui:composition xmlns="http://www.w3.org/1999/xhtml"                xmlns:ui="http://java.sun.com/jsf/facelets"                xmlns:h="http://java.sun.com/jsf/html"                xmlns:f="http://java.sun.com/jsf/core"                xmlns:s="http://jboss.com/products/seam/taglib">                     <div>            <s:label styleClass="#{invalid?'error':''}">            <ui:insert name="label"/>            <s:span styleClass="required" rendered="#{required}">*</s:span>        </s:label>                <span class="#{invalid?'error':''}">            <h:graphicImage value="/img/error.gif" rendered="#{invalid}"/>            <s:validateAll>                <ui:insert/>            </s:validateAll>        </span>        <s:message styleClass="error"/>  

    </div>    </ui:composition>

Page 38: J boss seam

Validação (Decorate)

• Para usar, basta colocar informar o decorate como um template

<s:decorate template="edit.xhtml">        <ui:define name="label">Country:</ui:define>        <h:inputText value="#{location.country}" required="true"/

</s:decorate>

Page 39: J boss seam

Exercício 2

• Usando validação na tela criada anteriormente

<s:decorate id="d1" template="layout/edit.xhtml">

<ui:define name="label">Nome:</ui:define>

<h:inputText id="username" value="#{pessoa.nome}" required="true" requiredMessage="Campo Obrigatório"/>

</s:decorate>

Page 40: J boss seam

Validação (Ajax)

• Usando validação com ajax

<s:decorate id="d1" template="layout/edit.xhtml">

<ui:define name="label">Nome:</ui:define>

<h:inputText id="username" value="#{pessoa.nome}" required="true“>

<a4j:support event="onblur" reRender="d1"/>

</h:inputText>

</s:decorate>

Page 41: J boss seam

Exercício 3

• Inserir validação no sistema, fazer testes com validações,testar também o <rich:beanValidator />

Obs: Usando o rich:beanValidator não se faz necessário o uso do <s:validate>, <s:decorate>

<h:inputText id="telefone" value="#{pessoa.telefone}" required="true" requiredMessage="Obrigatrio">

<rich:beanValidator summary=“Telefone Inválido" />

</h:inputText>

<rich:message for="telefone"/>

Page 42: J boss seam

Tabelas de Dados

Para facilitar ainda mais, o Seam possui a anotação:

“DataModel”

@DataModel

List<Pessoa> pessoas;

• Pode ser usado com: List, Map, Set ou Object[], assim como o JSF DataModel

Page 43: J boss seam

Exercício 4

• Trocar o @Out por @Datamodel

Page 44: J boss seam

Tabelas de Dados

Obtendo valores selecionados em uma tabela

@DataModelSelection

Pessoa pessoaSelecionada

Page 45: J boss seam

Exercício 5

• Usar o DataModelSelection para obter o objeto selecionado

• Criar um método para apagar esse objeto

Page 46: J boss seam

Navegação

• Stateful navigation• Pageflow é definido fora dos componentes• Valores de retorno das actions são avaliados• Navegação clássica: método da action que decide para

onde ir• Pageflow é definido para uma simples conversação

Page 47: J boss seam

Navegação

<page view-id="/cadastro.xhtml" >

<begin-conversation join="true"/>

<navigation>

<rule if-outcome="lista">

<redirect view-id="/cadastroPessoa.xhtml"/>

</rule>

</navigation>

</page>

public String salvar() { public String salvar() {

.... ....

return "lista"; return “/cadastroPessoa.xhtml";

} }

Page 48: J boss seam

Navegação

<page view-id="/cadastroPessoa.xhtml">

<navigation from-action="#{cadastroPessoaAction.apagar()}">

<redirect view-id="/sucesso.xhtml"/>

</navigation>

</page>

Page 49: J boss seam

Navegação

<page view-id="/cadastroPessoa.xhtml">

<navigation from-action="#{cadastroPessoaAction.apagar()}">

<rule if-outcome="success">

<redirect view-id="/sucesso.xhtml"/>

</rule>

</navigation>

</page>

<page view-id="/cadastro.xhtml" >

<action execute="#{cadastroPessoaAction.listar()}"/>

</page>

<page view-id="/cadastro.xhtml" >

<action if=“#{condicao}” execute="#{cadastroPessoaAction.listar()}"/>

</page>

Page 50: J boss seam

Navegação

<page view-id=“*/login.xhtml">

<navigation from-action="#{identity.login}">

<rule if="#{identity.loggedIn}">

<redirect view-id="/home.xhtml"/>

</rule>

</navigation>

</page>

<page view-id=“*/login.xhtml“ login-required="true”>

.....

</page>

Page 51: J boss seam

Navegação

<pages>

<page view-id="/search.xhtml">

<param name="searchPattern" value="#{searchService.searchPattern}"/>

</page>

...

</pages>

Metodo é executado antes da página ser renderizada.

<page view-id="/entry.xhtml"

action="#{entryAction.loadBlogEntry(blogEntry.id)}">

<param name="blogEntryId" value="#{blogEntry.id}”

validator="#{Validator}" required="true"/>

</page>

Page 52: J boss seam

Navegação

• Pode-se também obter o parâmetro na própria Action implementando um RequestParameter

@RequestParameter

private Long entryId;

public void findEntry() {

blogentry = em.find(Blogentry.class, entryId);

}

Page 53: J boss seam

Exercício 6

• Fazer um exercício de navegação usando o pages.xml• Criar 3 páginas e navegar entre elas usando o

pages.xml• Usar chamada de metodo direto no pages.xml

Page 54: J boss seam

Contextos Seam

• Stateless• Event context• Page context• Session• Business• Application

Page 55: J boss seam

Contextos Seam

• Stateless: Mesmo conceito do Stateless do EJB criado justamente para integração com este tipo de EJB.

• Event context: Como o nome mesmo diz os objetos registrados neste contexto apenas vão estar disponíveis durante a execução de um determinado evento.

• Page context: Contexto já conhecido por todos que trabalham com aplicações web, está associado ao processo de renderização, carregamento, carregamento de uma página.

Page 56: J boss seam

Contextos Seam

• Conversation context: É um dos contextos que diferencia o Seam de qualquer outro framework existente no mercado, com este contexto podemos criar unidades de conversação e registrar nestas unidade todos os objetos e serviços que a aplicação vai necessitar usar quando a mesma estiver sendo executada sobre este contexto.

• Neste contexto mesmo outras instâncias da aplicação sendo acessadas em janelas diferentes não terão acesso aos artefatos registrados no contexto da outra, ou seja, a cada nova instância da aplicação em uma nova janela se caracteriza como uma instância independente assim uma não terá acesso as informações da outra mesmo sendo executadas na mesma instância do browser.

Page 57: J boss seam

Contextos Seam

• Session context: Este também é muito conhecido por todos que trabalham com aplicações

• Em resumo este contexto inicia quando acessamos a primeira tela da aplicação e só será destruído quando fecharmos nosso browser ou fazermos um logoff implementado pela aplicação.

Page 58: J boss seam

Contextos Seam

• Application context: E por último o também já conhecido contexto de aplicação, tudo que registrarmos neste contexto fica disponível para todos que acessarem a mesma aplicação, ou seja, devemos registrar neste contexto somente serviços que serão acessados por todos e que são imutáveis pois este contexto só é atualizado no startup do servidor web.

Page 59: J boss seam

Contextos Seam

• Business process context: Mais um contexto novo criado pelo Seam, este foi criado especialmente para trabalharmos com fluxos de trabalho (workflow), ele garante para nós que qualquer objeto ou serviço registrado neste contexto vai estar disponível até o fim do fluxo.

• O mesmo fica disponível para múltiplas interações e múltiplos usuários e seu estado é persistente, ou seja, se eu fechar a aplicação e no dia seguinte entrar novamente, os objetos registrados no fluxo em questão estarão ali com as informações deixadas pela última vez.

Page 60: J boss seam

Contextos Seam

Contexto Padrão:• Depende do tipo do componente:

Stateless Session Beans?• Default em contexto Stateless

Entities• Default em contexto Conversation

Page 61: J boss seam

Contextos Seam

Message-Driven Beans?• Padrão sem contexto

Stateful Session Beans?• Padrão em contexto de Conversação

JavaBeans?• Padrão em contexto de evento

Page 62: J boss seam

Contextos Seam

Iniciando e Encerrando uma Conversação• Anotação

@Begin

public void checkoutShoppingCart(){

// ...

@End

public void confirmCheckout(){

Page 63: J boss seam

Contextos Seam

• Navegação (pages.xml)

<page view-id="/messageList.jsp" action="#{conversation.begin}"/>

Ou

<page view-id="/messageList.jsp">

<begin-conversation />

<page>

<page view-id="/home.jsp">

<end-conversation/>

<page>

Page 64: J boss seam

Contextos Seam

• Em um link JSF<h:commandLink action="main" value="Select Hotel">

<s:conversationPropagation type="begin"/>

</h:commandLink>

<h:commandLink action="main" value="Exit">

<s:conversationPropagation type="end"/>

</h:commandLink>

• Em um Link Seam s:link

<s:link view="/checkout.xhtml" propagation="begin"/>

<s:link view="/confirm.xhtml" propagation="end"/>

Page 65: J boss seam

Contextos Seam

Propagando a conversação• Propaga por padrão• Pode ser finalizada

<s:link view="/main.xhtml" propagation="none"/>

<h:commandLink action="main" value="Exit">

<f:param name="conversationPropagation" value="none"/>

</h:commandLink>

<h:commandLink action="main" value="Exit">

<s:conversationPropagation type="none"/>

</h:commandLink>

Page 66: J boss seam

Exercícios 7

• Abrir e fechar conversação• Trocar contextos

Page 67: J boss seam

Eventos

Tipos de Eventos• Page action – ocorre antes que a página é carregada• Pode ser definido para uma determinada página

WEB-INF/pages.xml

<pages>

<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/>

</pages>

Page 68: J boss seam

Eventos

• Pode-se usar “wildcard” para várias páginas

WEB-INF/pages.xml

<pages>

<page view-id="/hello/*" action="#{helloWorld.sayHello}"/>

</pages>

Page 69: J boss seam

Eventos

• Pode-se também passar parâmetros

WEB-INF/pages.xml

<pages>

<page view-id="/hello.jsp" action="#{helloWorld.sayHello}">

<param name="firstName" value="#{person.firstName}"/>

<param name="lastName" value="#{person.lastName}"/>

</page>

</pages>

Page 70: J boss seam

Eventos

• Pode-se também lançar um evento em uma Action

@Name("helloWorld")

public class HelloWorld {

public void sayHello() {

FacesMessages.instance().add("Hello World!");

Events.instance().raiseEvent("hello");

}

}

Page 71: J boss seam

Eventos

• Pode-se também lançar um evento em uma Action

@Name("helloWorld")

public class HelloWorld {

@RaiseEvent("hello")

public void sayHello() {

FacesMessages.instance().add("Hello World!");

}

}

Page 72: J boss seam

Eventos

• Capturando os eventos

@Name("helloListener")

public class HelloListener {

@Observer("hello")

public void sayHelloBack() {

FacesMessages.instance().add("Hello to you too!");

}

}

Page 73: J boss seam

Exercício 8

• Lançar e capturar eventos

Page 74: J boss seam

Exceções

O desenvolvedor determina como tratar uma exceção

• Via anotação• Declarativamente em um arquivo XML• Seam aplica todas regras de rollback das exceções EJB

para os componentes JavaBeans• Seam da um rollback em qualquer transação ativa

quando ocorre uma exceção

Page 75: J boss seam

Exceções

Capturando exceções usando Annotações

@Redirect(viewId="/failure.xhtml", end=true)

@ApplicationException(rollback=true)

public class UnrecoverableApplicationException extends RuntimeException { ... }

Page 76: J boss seam

Exceções

Capturando exceções usando XML

pages.xml

<pages>

<exception class="javax.persistence.EntityNotFoundException">

<http-error error-code="404"/>

</exception>

<exception class="javax.persistence.PersistenceException">

<end-conversation/>

<redirect view-id="/error.xhtml">

<message>Database access failed</message>

</redirect>

</exception>

Page 77: J boss seam

Exceções

Capturando exceções usando XML

pages.xml

<exception>

<end-conversation/>

<redirect view-id="/error.xhtml">

<message>Aconteceu um Erro ;-(</message>

</redirect>

</exception>

Page 78: J boss seam

Exceções

Usando EL nas Exceções

• Exceções são adicionadas no contexto de conversação

org.jboss.seam.handledException

<pages>

<exception class="org.jboss.seam.security.AuthorizationException">

<end-conversation/>

<redirect view-id="/error.xhtml">

<message severity="WARN">#{handledException.message}</message>

</redirect>

</exception>

</pages>

Page 79: J boss seam

Exercício 9

• Vamos lancar e capturar algumas exception• Lançar Runtime e Exception para ver a diferença• Criar uma tela de erro customizada

Obs: não esquecer de desabilitar :• debug (component.xml)• facelets.DEVELOPMENT (web.xml)

Page 80: J boss seam

Segurança

O Seam Security API fornece uma multiplicidade de funções relacionadas com segurança para seu aplicativo, abrangendo áreas como:

• Autenticação - permite os usuários autenticar em qualquer fornecedor de segurança. (LDAP, JAAS..)

• Identity Management - uma API para gerenciar uma aplicação Seam, usuários e papéis em tempo de execução.

Page 81: J boss seam

Segurança

• Autorização - um framework extremamente abrangente, baseado em regras de permissões

• Permission Management - um conjunto de componentes Seam para permitir uma fácil gestão da aplicação da política de segurança.

• CAPTCHA - para ajudar na prevenção de um software automatizado / scripts abusar seu sistema.

Page 82: J boss seam

Autenticação

• A autenticação fornecida pelo Seam é construída utilizando o JAAS (Java autenticação e autorização de serviço), e como tal, fornecer uma robusta e altamente configurável API para manipulação de autenticação do usuário.

• No entanto, para exigências menos complexas de autenticação, o Seam oferece um método mais simplificado de autenticação que esconde a complexidade do JAAS.

Page 83: J boss seam

Autenticação

• O método de autenticação simplificada fornecido pelo Seam utiliza um built-in JAAS login módulo:SeamLoginModule, que delega a autenticação para um de seus próprios componentes Seam.

• Este módulo de login já está configurado dentro Seam como parte de uma aplicação padrão e, como tal, não requer qualquer configuração adicional arquivos.

• Configurar esta forma simplificada de autenticação exige a configuração no arquivo: components.xml:

<security:identity authenticate-method="#{authenticator.authenticate}"/>

Page 84: J boss seam

Autenticação

Escrevendo uma tela de Autenticação:

<div>    <h:outputLabel for="name" value="Username"/>    <h:inputText id="name" value="#{credentials.username}"/></div>

<div>    <h:outputLabel for="password" value="Password"/>    <h:inputSecret id="password" value="#{credentials.password}"/></div>

<div>    <h:commandButton value="Login" action="#{identity.login}"/>

</div>

Page 85: J boss seam

Autenticação

Escrevendo um método de Autenticação:@Name("authenticator")

public class Authenticator {

@In EntityManager entityManager;

@In Credentials credentials;

@In Identity identity;

public boolean authenticate() {       try {          User user = (User) entityManager.createQuery(             "from User where username = :username and password = :password")             .setParameter("username", credentials.getUsername())             .setParameter("password", credentials.getPassword())             .getSingleResult();          if (user.getRoles() != null) {             for (UserRole mr : user.getRoles())                identity.addRole(mr.getName());          }          return true;       }       catch (NoResultException ex) {          return false;       }    } }

Page 86: J boss seam

Autenticação

Tratando possíveis exceções:<pages>

   ...    <exception class="org.jboss.seam.security.NotLoggedInException">        <redirect view-id="/login.xhtml">            <message>You must be logged in to perform this action</message>        </redirect>    </exception>

    <exception class="org.jboss.seam.security.AuthorizationException">        <end-conversation/>        <redirect view-id="/security_error.xhtml">            <message>You do not have the necessary security privileges to perform this action.</message>        </redirect>    </exception>

</pages>

Page 87: J boss seam

Autenticação

Redirecionando os usuários após o login

component.xml

<event type="org.jboss.seam.notLoggedIn">

<action expression="#{redirect.captureCurrentView}"/>

</event>

<event type="org.jboss.seam.postAuthenticate">

<action expression="#{redirect.returnToCapturedView}"/>

</event>    ...

</pages>

Page 88: J boss seam

Autenticação

Você pode redirecionar o usuário sem autenticidade para uma página de login quando ele tentar acessar uma determinada página

<pages login-view-id="/login.xhtml">    <page view-id="/members/*" login-required="true"/>

  <page view-id="/cadatro.xhtml" login-required="true"/>

</pages>

Page 89: J boss seam

Autorização

Há uma série de mecanismos de autorização fornecida pelo Seam Security API para garantir o acesso aos componentes, métodos, e nas páginas.

Componentes:

@Restrict("#{s:hasRole('admin')}")

public void delete() {

Páginas:• <h:form class="loginForm" rendered="#{not identity.loggedIn}">

• <page view-id="/reports.xhtml“><restrict>#{s:hasRole('admin')}</restrict></page>

• <h:outputLink action="#{reports.salvar}" rendered="#{s:hasRole('manager')}">Salvar

</h:outputLink>

Page 90: J boss seam

Exercício 10

• Vamos implementar a segurança na aplicação• Criar 2 perfis e alternar o acesso a botões e páginas

Page 91: J boss seam

Obrigado ;-)