Вы находитесь на странице: 1из 45

Transações

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 256

Conteúdo

• Conceito de Transação
• Tipos de Transação
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Transações gerenciadas pelo


– Container
– Bean
– Cliente
• Atributos de transação
• Exceções

Enterprise Java Beans Pág: 257

1
Motivação para transações

• São necessárias para garantir a robustez


da aplicação
– Permitem a escrita de código robusto

© 2002, SoftSite Tecnologia. Todos os direitos reservados


• Especificação EJB permite a utilização de
transações sem precisar de codificação
explícita

Enterprise Java Beans Pág: 258

Operações Atômicas

• Efetuar diversas operações independentes


(discretas) e ainda assim considerá-las
como uma grande e única operação
© 2002, SoftSite Tecnologia. Todos os direitos reservados

atômica
• Exemplo: Transferência de dinheiro
– { retirar dinheiro da conta 1
depositar dinheiro na conta 2 }
• Se alguma das operações falhar,a outra
também deve falhar. Elas fazem parte da
mesma transação

Enterprise Java Beans Pág: 259

2
Transferência de Dinheiro: Código

• Muito Código, pouco try {


legibilidade // retirar dinheiro da conta 1
• Precisa considerar }

© 2002, SoftSite Tecnologia. Todos os direitos reservados


todo problema que catch (Exception e) {
// Se ocorreu algum erro, não prossiga
possa ocorrer com return;
rotinas para }
tratamento de erros try {
// Se ok, deposite dinheiro na conta 2
• Com processos mais }
complexos o catch (Exception e) {
tratamento de erro // Se ocorreu algum erro, não prossiga
fica fora de controle // E redeposite o dinnheito na conta 1
return;
• Testar o código é um }
desafio!

Idealmente: Efetuar ambas as operações um uma única e grande


operação atômica, garantindo o sucesso ou falha de ambas.

Enterprise Java Beans Pág: 260

Falha de Máquina ou na Rede

• Suponha nossa transferência em uma


ambiente distribuído
– Por que?
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Segurança, Escalabilidade, Modularidade


• Quais problemas?
– A rede cai na hora transferência.
• Cliente recebe RemoteException
– Retirada ok? Deposito ok?
– Uma máquina(banco de dados) falha.
– Inconsistência nos dados
• É necessário um processo de recuperação
para prevenir tais falhas.
Enterprise Java Beans Pág: 261

3
Compartilhamento de dados

• Em um ambiente distribuído, clientes podem estar


compartilhando(alterando) o mesmo conjunto de
dados

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 262

Transação: Benefícios

• Uma transação é uma série de operações


que são executas como se fossem um
única grande operação
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Garantem uma execução tudo-ou-nada


– Todas as operações são executadas com
sucesso ou nenhuma delas é
• Controlam o acesso concorrente a um
conjunto de dados compartilhados
– Locking de dados

Enterprise Java Beans Pág: 263

4
ACID

• Conjunto de propriedades que as transações


fornecem
• Atomicidade(Atomicity)

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Garante que muitas operações se comportem como uma, uma
seja, um unidade de trabalho.
• Consistência(Consistency)
– Garante que a transação, quando terminada, deixará o estado do
sistema consistente
• Ex: Saldo sempre deve estar positivo.
• Isolamento(Isolation)
– Uma transação deve ser executada sem interferência de outros
processos ou outras transações.
• Durabilidade
– Toda alteração nos dados feita durante uma transação deve ser
escrita para algum meio de armazenamento até que a transação
termine, para garantir que as mudanças não sejam perdidas caso
Enterprise Java haja
Beans uma falha no sistema Pág: 264

Modelos Transacionais

• São as diferentes maneiras de como


efetuar as transações
– Flat Transactions
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Requerido pela especificação


– Nested Transactions
• Não suportado pela especificação

Enterprise Java Beans Pág: 265

5
Flat Transactions

• Consiste em uma série de operações que


são executadas atomicamente como uma
única unidade de trabalho

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 266

Nested Transactions

• Permite embutir em uma transação outras


transações.
–Trem(Boston) -> NY, Avião(NY) -> Londres,
© 2002, SoftSite Tecnologia. Todos os direitos reservados

Balão(Londres) -> Paris ,Paris = Lotado

Enterprise Java Beans Pág: 267

6
Demarcação de transações

• Componentes EJB são responsáveis


apenas pela demarcação das transações
– Quando será iniciada

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Quando será concluída
– Não são controlados aspectos de baixo nível
• Interação com o gerenciador de transação
• Existem 3 forma de demarcação de
transação
– Programaticamente(Bean)
– Declarativamente(XML)
– Iniciadas pelo cliente(Servlets, Applets,etc)

Enterprise Java Beans Pág: 268

Tipos de Demarcação de Transação


© 2002, SoftSite Tecnologia. Todos os direitos reservados

Enterprise Java Beans Pág: 269

7
Demarcação: Bean

public void checkOut() {

© 2002, SoftSite Tecnologia. Todos os direitos reservados


UserTransaction ut = context.getUserTransaction();

ut.begin();

anotherBean.validateCredit(customerNum);
checkInventory();
Pega referência para
ut.commit(); UserTransaction do
//or ut.rollback();
contexto
doNonTxStuff();
}

Enterprise Java Beans Pág: 270

Demarcação: XML
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>Hello</ejb-name>
<home>examples.HelloHome</home>
<remote>examples.Hello</remote>
<ejb-class>examples.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>

Enterprise Java Beans Pág: 271

8
Quem pode demarcar transações no
bean?

• Entity CMP só podem utilizar demarcação


declarativamente (XML)
• Entity BMP podem utilizar

© 2002, SoftSite Tecnologia. Todos os direitos reservados


programaticamente

Enterprise Java Beans Pág: 272

Transação em CMP

• A Transação em beans CMP é controlada


com um atributo de transação no arquivo
XML
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– <trans-attribute>
• Atributo pode ser especificado para
– Bean
– Método do Bean
• Deve-se especificar os atributos de
transação para:
– Todos os métodos de negócios
– Em entity beans: Métodos Interface Home
(create)

Enterprise Java Beans Pág: 273

9
Especificando Atributos

• Bean
<container-transaction>
<method>

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<ejb-name>Employee</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
<container-transaction>

• Métodos Bean
<container-transaction>
<method>
<ejb-name>Employee</ejb-name>
<method-name>setName</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>

Enterprise Java Beans Pág: 274

Atributos

• Existem 6 tipos de atributos que podem ser


utilizados no XML.
– Required
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– RequiresNew
– Supports
– Mandatory
– NotSupported
– Never

Enterprise Java Beans Pág: 275

10
Atributo Required

• Required
– Deve-se utilizar quando se quer que o bean
sempre seja executado em uma transação.

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 276

Atributo RequiresNew

• RequiresNew
– Deve-se utilizar quando se quer que o bean
sempre seja executado em uma nova
© 2002, SoftSite Tecnologia. Todos os direitos reservados

transação.

Enterprise Java Beans Pág: 277

11
Atributo Supports

• Supports
– Bean só é executado em transação se cliente
já criou uma, caso contrario é executado sem

© 2002, SoftSite Tecnologia. Todos os direitos reservados


estar em uma transação

Enterprise Java Beans Pág: 278

Atributo Mandatory

• Mandatory
– Exige que já exista uma transação para que
bean seja executado
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• javax.ejb.TransactionRequiredException
• javax.ejb.TransactionRequiredLocalException

Enterprise Java Beans Pág: 279

12
Atributo NotSupported

• NotSupported
– Bean não pode ser executado em uma
transação. Caso seja chamado em um

© 2002, SoftSite Tecnologia. Todos os direitos reservados


transação, ela é suspensa.

Enterprise Java Beans Pág: 280

Atributo Never

• Never
– Bean não pode ser executado em uma
transação.
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• java.rmi.RemoteException
• javax.ejb.EJBException

Enterprise Java Beans Pág: 281

13
Restrições Atributos

• Nem todos os atributos estão disponíveis


para os beans

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 282

JTS e JTA

• JTS – Java Transaction Service


– É um mapeamento java-CORBA da
especificação OTS (Object Transaction
© 2002, SoftSite Tecnologia. Todos os direitos reservados

Service)
• Conjunto de interfaces que especificam como
transações são executadas.
• Utilizada por fabricantes de containers.(Suporte não
é obrigatório).
• JTA – Java Transaction API
– Utilizada por desenvolvedores.
• Conjunto de interfaces utilizada para definir
demarcação de transações
• Suporte obrigatório pelo container.
Enterprise Java Beans Pág: 283

14
UserTransaction

• javax.transaction.UserTransaction
– Permite a demarcação de transações
programaticamente.

© 2002, SoftSite Tecnologia. Todos os direitos reservados


• begin()
– Inicia Transação
• commit()
– Finaliza transação
• getStatus()
– Retorna status da transação corrente
• rollback()
– Condena transação
• setRollBackOnly()
– Marca transação para rollback.
• setTrasactionTimeout(int)
– Tempo Maximo de uma transação antes de abortar

Enterprise Java Beans Pág: 284

Demarcação: XML x Bean

/**
* Deposits amt into account.
*/
public void deposit(double amt) throws AccountException {
System.out.println("deposit(" + amt + ") called.");
© 2002, SoftSite Tecnologia. Todos os direitos reservados

balance += amt;
}
<tran-atribute> required <tran-atribute/>

/**
* Deposits amt into account.
*/
public void deposit(double amt) throws AccountException {
javax.transaction.UserTransaction userTran = null;
try {
System.out.println("deposit(" + amt + ") called.");
userTran = ctx.getUserTransaction();
userTran.begin();
balance += amt;
userTran.commit();
} Não é feito rollback da variável
catch (Exception e) {
if (userTran != null) userTran.rollback();
throw new AccountException("Deposit failed because of " +
e.toString());
}
}
Enterprise Java Beans Pág: 285

15
Restrições Demarcação Bean

• Não pode iniciar uma transação antes de


terminar outra.

© 2002, SoftSite Tecnologia. Todos os direitos reservados


public void go() {
UserTransaction ut = context.getUserTransaction();
ut.begin();
doStuff();
ut.begin(); ERRADO!!
// more
}

• Session e Message bean não podem


terminar um método sem terminar uma
transação
public void go() {
UserTransaction ut = context.getUserTransaction();
ut.begin();
doMore(); Tem de terminar transação!
}

Enterprise Java Beans Pág: 286

Restrições Demarcação Bean 2

• Um bean BMT não pode invocar métodos


na interface EJBContext: setRollbackOnly()
e getRollbackOnly()
© 2002, SoftSite Tecnologia. Todos os direitos reservados

Tem de chamar
UserTransaction!!
public void go() {
mySessionContext.setRollbackOnly();
}

• Somente Stateful Session beans podem


deixa transações em aberto entre
chamadas de métodos.
– Não é um boa idéia, mas é permitido

Enterprise Java Beans Pág: 287

16
Demarcação pelo cliente

try {
Context ctx = new InitialContext(env);
/** The container is required to

© 2002, SoftSite Tecnologia. Todos os direitos reservados


* make the JTA available at the location
* java:comp/UserTranasction.
*/
userTran = (javax.transaction.UserTransaction)
ctx.lookup("java:comp/UserTransaction");
userTran.begin();
// perform business operations
userTran.commit();
}
catch (Exception e) {
// deal with any exceptions, including ones
// indicating an abort.
}

Enterprise Java Beans Pág: 288

Propogação de Transações

• Transações BMT e
CMT propagam-se em
© 2002, SoftSite Tecnologia. Todos os direitos reservados

um bean CMT

• Transação de um
cliente nunca será
utilizada por um bean
BMT

Enterprise Java Beans Pág: 289

17
Qual demarcação escolher?

• BMT
• Vantagens: Maior controle. Pode-se agrupar
diversos operações menores no método.

© 2002, SoftSite Tecnologia. Todos os direitos reservados


• CMT
– Mais simples
– Gerenciado pelo container(eficiente)
– Seguro (evita possível problema de deadlock,
causado pelo programador)
• Transações iniciadas pelo cliente
– Vantagem – Controle em relação a falhas de
rede
– Desvantagem – Se a transação for longa, ela é
ineficiente
Enterprise Java Beans Pág: 290

Como condenar uma transação?

• CMT
– EJBContext.setRollbackOnly()
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– EJBContext.getRollbackOnly()
• BMT
– UserTransaction.setRollbackOnly()
– UserTransaction.getStatus()

Enterprise Java Beans Pág: 291

18
Transações e EntityBeans

• Se pudéssemos, controlaríamos as
transações nos métodos ejbLoad() e
ejbStore()

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Não temos controle sobre a invocação dos
métodos: container é quem invoca.
• Container invoca ejbLoad() e ejbStore() em
cada transação
– Não invoca em cada chamada de método
– Sincronização e performance podem ser
melhoradas, iniciando a transação o quanto
antes e encerrando-a o mais tarde possível

Enterprise Java Beans Pág: 292

Transações em Stateful Session


Beans

• Entity beans mantém seu estado no Banco


de Dados.
– Qualquer rollback em uma transação, o
© 2002, SoftSite Tecnologia. Todos os direitos reservados

container recupera o estado anterior do bean.


• Stateful session beans mantém seu estado
em variáveis de instâncias
– Bean precisa guardar o estado anterior das
variáveis em caso de rollback
• Se BMT, bean pode guardar variáveis
• SE CMT, temos de implementar interface
SessionSyncronization

Enterprise Java Beans Pág: 293

19
Interface SessionSynchronization

• Implementada somente por Stateful


Session beans com CMT
• Possui 3 métodos

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– afterBegin()
• Chamado logo após a transação ter iniciado
• utilizado para guardar o valor das variaveis
– beforeCompletion()
• Chamado antes do termino da transação
– afterCompletion(boolean state)
• Chamado pelo container logo após o termino da
transação
• Se transação falhar, state == false

Enterprise Java Beans Pág: 294

Exemplo: SessionSynchronization

public class CountBean implements SessionBean,


SessionSynchronization {
public int val;
© 2002, SoftSite Tecnologia. Todos os direitos reservados

public int oldVal;


public void ejbCreate(int val) { Salva estado
this.val=val; da variável
this.oldVal=val;
}
public void afterBegin() { oldVal = val;}
public void beforeCompletion() {}
public void afterCompletion(boolean b) {
if (b == false) val = oldVal;
}
Se transação
public int count() { return ++val; }
falhou, recupera
public void ejbRemove() {}
estado
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext ctx) {}
}

Enterprise Java Beans Pág: 295

20
Ciclo de vida Stateful Session Bean

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 296

Transações e Tipos de Exceções

• A especificação classifica as exceções em


2 tipos
– Application Exceptions
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– System Exceptions
• System Exceptions
– Acusam erros no servidor ou nos seus serviços
– Java.lang.RuntimeException,
java.rmi.RemoteException e seus subtipos
– Rollback automático
• Application Exceptions
– Consistem de erros de lógica no programa(aplicação)
– Qualquer exceção excluindo System Exceptions
– Não causam rollback automático

Enterprise Java Beans Pág: 297

21
java.lang.RuntimeException

• Quando uma RuntimeException é lançada


(EJBException, NullPointerException,
IndexOutOfBoundsException, etc) o container

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Efetua um rollback
– Log nas exceções para avisar ao administrador do
sistema
– Descarta a instância do EJB
• Regra: Re-lance exceções de sistema como
EJBException para permitir ao container fazer o
rollback automático
• javax.EJBException
– NoSuchEntityException
– NoSuchObjectLocalException
– TransactionRequiredLocalException

Enterprise Java Beans Pág: 298

java.rmi.RemoteException

• São lançadas pelo o container


– Declaradas nas interfaces remotas e não nos
beans
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Container adota o mesmo procedimento


que RuntimeException
– rollback, log, destrói EJB
• RemoteException
– NoSuchEntityException
– NoSuchObjectException
• javax.transaction -> RemoteException
– TransactionRequired
– TransactionRolledbackException

Enterprise Java Beans Pág: 299

22
ApplicationExceptions

• São as exceções que são lançadas para o


cliente.
– indicam erros na lógica de negócios

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Não são empacotadas como RemoteException
ou EJBException
• Application Exception
– Exceções específicas da aplicação
– FooException, SQLException,
FileNotFoundException
• Se for exceção grave, para condenar
transação deve chamar
– context.setRollbackOnly()

Enterprise Java Beans Pág: 300

Applications Exceptions em EJB

• Exceções definidas na especificação que requerem


rollback explícito
• CreateException
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– Lançada no método create da interface remota(pode ser lançada também


pelo ejbPostCreate)
• DuplicateKeyException
– Subtipo de CreateException, lançada no método create da interface
remota
– Indica que um EJB com a mesma PK já existe no banco de dados
• FinderExcetion
– Lançada por métodos find na interface remota. Indica que um erro na
aplicação(argumento inválidos, etc) ocorreu.
– Objetos não encontrados
• Collection – retorna coleção vazia para múltiplos objeto ou
• ObjectNotFoundException
– Lançada por métodos find para indicar que objeto não foi
encontrado
• RemoveException
– Lançada pelo método remove(interfaces home e remota) para
indicar que erro quando estava sendo removido
Enterprise Java Beans Pág: 301

23
24
© 2002, SoftSite Tecnologia. Todos os direitos reservados © 2002, SoftSite Tecnologia. Todos os direitos reservados
Pág: 302

Pág: 303
Exemplo e Exercício

Segurança
Exercício
Exemplo

Enterprise Java Beans

Enterprise Java Beans


Conteúdo

• Conceitos segurança
– Autorização

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Autenticação
• JAAS e Jboss
– jbosssx
• Segurança EJB
– Tags controle de acesso
– Definição de papéis

Enterprise Java Beans Pág: 304

Autenticação e Autorização

• Clientes que desejem acessar EJB devem


fazer duas coisas
– Cliente deve se autenticar
© 2002, SoftSite Tecnologia. Todos os direitos reservados

• Autenticação checa se o cliente é quem ele afirma


ser.
– login/senha autenticada por um servidor LDAP
• Após autenticação, cliente é associado a uma
identidade por toda a sessão
– Autorização
• Depois de autenticado (identificado) cliente deve
possuir autorização para efetuar operação desejada
• Autenticação deve ser efetuada antes da
chamada a um método. Autorização ocorre
durante a chamada de um método
Enterprise Java Beans Pág: 305

25
Controle de Acesso

• Autenticação é dependente do servidor e


pode ser implementado utilizando a API
JAAS

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Identidade do usuário é encapsulado no objeto
java.security.Principal
• A autorização, ou controle de acesso, é
baseado em um arquivo XML
– Feita de forma declarativa
• Declaração de papéis
• Associação dos papéis a métodos
• Definição de quais usuários podem acessar os
componentes

Enterprise Java Beans Pág: 306

Controle de acesso: ejb-jar.xml

<assembly-descriptor>
<security-role>
<role-name>Customer</role-name>
</security-role> Definição de
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<security-role> papéis
<role-name>Admin</role-name>
</security-role>
<method-permission>
<unchecked/>
<method> sem autenticação
<ejb-name>ProductEJB</ejb-name>
<method-name>getPrimaryKey</method-name>
</method>
</method-permission>
<method-permission>
<role-name>Admin</role-name> Somente admin pode
<method>
executar métodos do
<ejb-name>ProductEJB</ejb-name>
<method-name>*</method-name> EJB
</method>
<method-permission>
</assembly-descriptor>

Enterprise Java Beans Pág: 307

26
JAAS

• JAAS é um conjunto de interfaces que permite a


autenticação e autorização de usuários em java
– Quem implementa a maior parte das interfaces é o

© 2002, SoftSite Tecnologia. Todos os direitos reservados


servidor.
– Baseada no PAM(Pluggable Authentication Module)
• Classes Principais
– javax.security.auth.subject
– java.security.Principal
– javax.security.auth.callback.Callback
– javax.security.auth.callback.CallbackHandler
– javax.security.auth.LoginContext
– javax.security.auth.spi.LoginModule

Enterprise Java Beans Pág: 308

JAAS no JBOSS(JbossSX)

• Jboss implementa a API JAAS


– Através do JAASSecurityManager
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– Arquivos de configuração
• servidor – login-config.xml
• cliente – auth.conf
– Fornece implementações da
javax.security.auth.spi.LoginModule
• Fornece classes de login para cada tipo de
autenticação
• jboss.xml e jboss-web.xml
– <security-domain> específica o domínio JAAS

Enterprise Java Beans Pág: 309

27
Implementações de LoginModule

• org.jboss.security.ClientLoginModule
– Implementação para o cliente
• org.jboss.security.auth.spi.UsersLoginModule
– Uma das implementações para o servidor

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– arquivos de configuração: users.properties e
roles.properties
• IdentityLoginModule
– Associa uma identidade única para todo um
módulo(somente para testes)
• LdapLoginModule
– Autenticação via servidor LDAP
• DatabaseServerLoginModule
– Autenticação via banco de dados
• ProxyLoginModule
– Criada somente para contornar uma limitação do
classloader do JAAS: classes de login tem de estar no
classpath
Enterprise Java Beans Pág: 310

Configurações no Jboss

• Cada domínio de segurança precisa ser


configurado no cliente e no servidor
• Servidor
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– login-config.xml em
JBOSS_HOME/server/default/conf/
– Criação de domínios e associação com
módulos de login
• Aplicação
– jboss.xml(se autenticação via web container:
jboss-web.xml)
– Declarar domínio de segurança JAAS
– Clientes standalone é necessário informar
domínio de segurança
Enterprise Java Beans Pág: 311

28
XMLs e JAASSecurityManager

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 312

Configurando domínio de segurança


no servidor

• Declaração do domínio no jboss.xml


<jboss>
<security-domain>java:/jaas/dominio-servidor</security-domain>
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<session>
<ejb-name>SecureHelloEJB</ejb-name>
<jndi-name>login/HelloHome</jndi-name>
</session>
</jboss>

• Nome do domínio dever ser igual ao declarado


no login-config.xml
<policy> (...) <application-policy name="dominio-servidor">
<authentication>
<login-module code="MyLoginModule" .../>

• Se domínio não existir, domínio default “other”


será utilizado.
– Configurado em UsersRolesLoginModule
Enterprise Java Beans Pág: 313

29
Serviço JbossSX
UsersRolesLoginModule

• Serviço de login que utiliza par de arquivos


– É a configuração default do login-config.xml

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<policy> (...)
<application-policy name="other">
<authentication>
<login-module
code="org.jboss.security.auth.spi.UsersRolesLoginModule"
flag="required" />
</authentication>
</application-policy>
</policy> server/default/conf/login-config.xml

users.properties nome=senha roles.properties nome.Grupo=Role,...Role


julio=cesar Julio.Roles=TestRole, AdminRole
Foo=bar Foo.Roles=NoRole, FooRole

Colocar no classpath do servidor(ou ejb-jar.xml)


Enterprise Java Beans Pág: 314

Utilizando Banco de Dados

• Pode-ser guardar as informações de


autenticação (domínio, usuário,senha) em um
banco de dados
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– Configurar jboss.xml com DatabaseServerLoginModule


– Criar algumas tabelas no banco
• Configuração Módulo: nome DataSource,query
de consulta de senha,query de consulta de Grupo
<application-policy name="dominio-login-servidor">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag="required">
<module-option name="dsJndiName">java:/DefaultDS</module-option>
<module-option name="principalsQuery">select senha from usuarios where
id=?</module-option>
<module-option name="rolesQuery">select grupo, 'Roles' from usuarios where
id=?</module-option>
<module-option name="unauthenticatedIdentity">nobody</module-option>
</login-module>
</authentication>
/application-policy>

Enterprise Java Beans Pág: 315

30
Configuração no Cliente

• Arquivo de configuração tem que estar no


classpath
– Indica no mínimo que login utilizar

© 2002, SoftSite Tecnologia. Todos os direitos reservados


dominio-cliente {
// JBoss LoginModule implementation
org.jboss.security.ClientLoginModule required;
};
client-auth.conf

• Informar qual arquivo como propriedade


java app -Djava.security.auth.login.config=client-auth.conf
• Jar Necessário
– jbosssx-client.jar

Enterprise Java Beans Pág: 316

Domínio de clientes em outros


Containers

• Para clientes que se encontram dentro do


servidor(servlets, JSPs), basta chamar o
mesmo módulo de login através do domínio
© 2002, SoftSite Tecnologia. Todos os direitos reservados

especificado no XML
• login-config.xml
<application-policy name="dominio-cliente">
<authentication>
<login-module
code="org.jboss.security.ClientLoginModule"
flag="required">
</login-module>
</authentication>
</application-policy>

Enterprise Java Beans Pág: 317

31
Cliente Standalone JAAS para login

public class HelloClient {


public static void main(String[] args) throws Exception {
LoginContext loginCtx = null;
try {

© 2002, SoftSite Tecnologia. Todos os direitos reservados


// Cria CallBackHandler; Encapsula dados de autenticação
CallbackHandler handler = new HelloCallbackHandler();
// Carrega configuração
loginCtx = new LoginContext("dominio-cliente", handler);
// Faz o login
loginCtx.login();
} catch (LoginException e) {
System.out.println("Login failed"); System.exit(1);
}
// Executa ação privilegiada propagando contexto de segurança
Context ctx = new InitialContext(System.getProperties());
Object obj = ctx.lookup("SecureHelloEJB");
HelloHome home = (HelloHome)
PortableRemoteObject.narrow(obj, HelloHome.class);
Hello hello = home.create();
System.out.println(hello.hello());
}
}

Enterprise Java Beans Pág: 318

JAAS CallBackHandler
© 2002, SoftSite Tecnologia. Todos os direitos reservados

Enterprise Java Beans Pág: 319

32
Autenticação Jboss

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 320

Exemplo JAAS

• Exemplo (Helder da Rocha + MEJB2)


• Configurar
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– build.properties
– lib/users.properties, lib/roles.properties
• Executar
– ant jboss.deploy
– ant run.jboss.client

Enterprise Java Beans Pág: 321

33
ejb-jar.xml

<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>SecureHelloEJB</ejb-name>
<home>examples.HelloHome</home>

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<remote>examples.Hello</remote>
<ejb-class>examples.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor> TestRole
<security-role> acessa todos
<role-name>TestRole</role-name> os métodos
</security-role>
<method-permission>
<role-name>TestRole</role-name>
<method>
<ejb-name>SecureHelloEJB</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
</assembly-descriptor>
</ejb-jar>
Enterprise Java Beans Pág: 322

Identidade do Principal

• A identidade do cliente(principal) é
propagada durante as chamadas
– Configurável
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<entity>
...
<security-identity>
<use-caller-identity />
<security-identity>
...
</entity>

• Exceção é lançada caso não seja permitido


acesso

Enterprise Java Beans Pág: 323

34
Troca de identidade

• Um bean pode trocar de identidade, caso


queira executar métodos privilegiados
– Identidade é propagada em todos os métodos

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<entity>
...
<security-identity>
<run-as>
<role-name>admin</role-name>
</run-as>
<security-identity>
...
</entity>

Enterprise Java Beans Pág: 324

Controle programático

• Existem 2 métodos para controle de acesso


no código
© 2002, SoftSite Tecnologia. Todos os direitos reservados

String loggedUser = ctx.getCallerPrincipal().getName();


if( !ctx.isCallerInRole("admin")) {
if (!loggedUser.equals(userid)) {
throw new AcessoIlegalException("...");
}
}

Enterprise Java Beans Pág: 325

35
Alias para papéis no XML

• Permite que o nome utilizado pelo


programador no código fonte seja mapeado
para um papel declarado no XML.

© 2002, SoftSite Tecnologia. Todos os direitos reservados


</entity>
...
<security-role-ref>
<role-name>admin</role-name>
<role-link>administrador</role-link>
</security-role-ref>
...
</entity>

<assembly-descriptor>
<security-role>
if( !ctx.isCallerInRole("admin")) { <role-name>admin</role-name>
… </security-role> ...
… </assembly-descriptor>

Enterprise Java Beans Pág: 326

Exemplo

Exemplo
© 2002, SoftSite Tecnologia. Todos os direitos reservados

Enterprise Java Beans Pág: 327

36
Xdoclet

© 2002, SoftSite Tecnologia. Todos os direitos reservados


Enterprise Java Beans Pág: 328

Conteúdo

• O que é Xdoclet
• Tags Xdoclet para ejb
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– ejbdoclet
• Exemplos de Utilização das tags

Enterprise Java Beans Pág: 329

37
Xdoclet

• Xdoclet é uma ferramenta de geração de


código
–Open Source

© 2002, SoftSite Tecnologia. Todos os direitos reservados


–Estende a Javadoc doclet API, permitindo a criação de
novos arquivo baseado nas tags @ do javadoc
–Baseado no ANT
–Extensível através de templates.
• Site:http://xdoclet.sourceforge.net
• Fornece suporte para geração de Arquivos EJB
–ejb-jar.xml, interfaces home, remote etc.

Enterprise Java Beans Pág: 330

Tarefa no ANT

<target name="ejbdoclet" depends="init">


<taskdef name="ejbdoclet"
classname="xdoclet.modules.ejb.EjbDocletTask"
© 2002, SoftSite Tecnologia. Todos os direitos reservados

classpathref="xdoclet.path"> Defini nova


<classpath>
tarefa
<fileset dir="${xdoclet.lib.dir}" includes="*.jar"/>
</classpath>
<ejbdoclet/>
</taskdef>
<ejbdoclet destdir="${xdoclet.gen}" ejbspec="2.0" >
<fileset dir="${src.dir}">
<include name="**/*Bean.java" />
</fileset> Configura tarefa

<remoteinterface/>
<homeinterface/>
subtarefas
<localhomeinterface/>
<homeinterface/>
<deploymentdescriptor destdir="${xdoclet.gen}" />
<jboss/>
</ejbdoclet> Gera arquivo do
</target>
container

Enterprise Java Beans Pág: 331

38
Definindo classpath

• Incluir bibliotecas
– XDOCLET_HOME/lib

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<path id="xdoclet.path">
<pathelement location="${xdoclet.lib.dir}" />
/path>

• Outras
– XDOCLET_HOME/samples/lib
• Jboss-j2ee.jar
• Servlet.jar
• Junit.jar

Enterprise Java Beans Pág: 332

CountBean.java

/**
* @ejb.bean type="Stateful"
* view-type="both"
* jndi-name="CountHome"
*/
© 2002, SoftSite Tecnologia. Todos os direitos reservados

public class CountBean implements SessionBean {


public int val;

/**
* Counts up
* @ejb.interface-method
*/
public int count() {
System.out.println("count()");
return ++val;
}
/*
* @ejb.create-method
*/
public void ejbCreate(int val) throws CreateException {
this.val = val;
System.out.println("ejbCreate()");
}
. . .
Enterprise Java Beans Pág: 333

39
Algumas Tags EJB

• @ejb.interface-method
– Declara um método como método de negócios
• @ejb.create-method

© 2002, SoftSite Tecnologia. Todos os direitos reservados


– Declara método como método ejbCreate
• @ejb.home-method
– Método Home
• @ejb.finder
– Defini método find para interface home e local home
• @ejb.select
– Método do tipo ejbSelect
• @ejb.pk-field
– Cria método findByPrimaryKey na interface home

Enterprise Java Beans Pág: 334

Tags de container

• O xdoclet pode gerar os arquivos XML


específicos de cada servidor
– <jboss/>
© 2002, SoftSite Tecnologia. Todos os direitos reservados

– <websphere/>
– <jonas/>
– <weblogic/>
– <jrun/>
– <resin-ejb-xml/> (resin-ejb.xml)
– <orion/> (orion-ejb-jar.xml)
– <hpas/>

Enterprise Java Beans Pág: 335

40
Gerando Value Objects

/**
* @ejb.bean type="CMP"
* name="ItemBean"
* jndi-name="ejb/ItemBean"
Tem que

© 2002, SoftSite Tecnologia. Todos os direitos reservados


* view-type="both"
* @ejb.value-object adicionar tarefa
*/
. . .
<valueobject/>
/**
* @ejb.interface-method
* @ejb.persistence
* @ejb.pk-field
*/
public abstract String getID();
/**
* @ejb.interface-method
*/
public abstract String getType();
/**
* @ejb.interface-method
*/
public abstract String setType();

Enterprise Java Beans Pág: 336

Gerando PK

/**
* @ejb.bean type="CMP"
* name="ItemBean" Identifica campo PK
* jndi-name="ejb/ItemBean"
* view-type="both"
© 2002, SoftSite Tecnologia. Todos os direitos reservados

* primkey-field="ID";
* @ejb.pk
*/ Adiciona tag PK
public abstract class ItemBean implements EntityBean
{
//Callback methods
..
/**
* @ejb.create-method
*/
public void ejbCreate( String id )
{
setID( id );
}
/**
* @ejb.interface-method
Identifica método get PK
* @ejb.persistence
* @ejb.pk-field
*/
public abstract String getID();
}
Enterprise Java Beans Pág: 337

41
papéis de segurança e acesso a
métodos
/**
* @ejb.bean type="Stateful"
* view-type="both"
* jndi-name="${user.bean.jndi}"
*

© 2002, SoftSite Tecnologia. Todos os direitos reservados


* @ejb.security-role-ref
* role-name="ADMIN"
* role-link="administrator"
*
*/
public class UserBean implements SessionBean{

/**
* @ejb.interface-method
* @ejb.permission
* unchecked="true";
*/
public void setUserName( String name )
{
this.name = name;
}

Enterprise Java Beans Pág: 338

Métodos find e ejbSelect()

/**
* @ejb.bean type="CMP"
* name="ItemBean"
* jndi-name="ejb/ItemBean"
* view-type="both"
© 2002, SoftSite Tecnologia. Todos os direitos reservados

*
* @ejb.finder signature="java.util.Collection findAll()"
*/
public abstract class ItemBean implements EntityBean {

public abstract class ItemBean implements EntityBean


{
//various bean methods…
//ejbSelect methods
/**
* @ejb.select query="SELECT OBJECT( i ) FROM Item AS i"
*/
public abstract java.util.Collection ejbSelectAll();
}

Enterprise Java Beans Pág: 339

42
Métodos Home

© 2002, SoftSite Tecnologia. Todos os direitos reservados


/**
* @ejb.home-method
* view-type="both"
*/
public void addDataToAll()
{
//method implementation here
}

Enterprise Java Beans Pág: 340

Relacionamentos

<relationships>
<ejb-relation>
<ejb-relation-name>OwnerToData</ejb-relation-name>
<ejb-relationship-role >
<multiplicity>One</multiplicity>
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<relationship-role-source >
<ejb-name>ch2.Owner</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>data</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role >
<multiplicity>One</multiplicity>
<relationship-role-source >
<ejb-name>ch2.DataBean</ejb-name>
</relationship-role-source> /**
</ejb-relationship-role> * @ejb.interface-method
</ejb-relation> * @ejb.relation
</relationships> name="OwnerToData"
relation-role="Owner"
target-ejb=“examples.DataBean"
*/
public abstract Data getData();
Enterprise Java Beans Pág: 341

43
Tag destination type para MDB

<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>MDB</ejb-name>
<ejb-class>MessageBean</ejb-class>

© 2002, SoftSite Tecnologia. Todos os direitos reservados


<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<ejb-jar>
/**
* @ejb.bean
* name="MessageBean"
* type="MDB"
* destination-type="javax.jms.Queue"
*/
public class MessageBean
implements MessageDrivenBean,
MessageListener {

Enterprise Java Beans Pág: 342

Seletores de mensagem para MDB

<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>MDB</ejb-name>
<ejb-class>MessageBean</ejb-class>
© 2002, SoftSite Tecnologia. Todos os direitos reservados

<transaction-type>Container</transaction-type>
<message-selector>
<![CDATA[ messageType = 'buyerRequest' ]]>
</message-selector>
</message-driven>
</enterprise-beans>
<ejb-jar>
/**
* @ejb.bean
* name="MessageBean"
* type="MDB"
* message-selector="<![CDATA messageType = 'buyerRequest']]>"
*/
public class MessageBean
implements MessageDrivenBean, MessageListener {

Enterprise Java Beans Pág: 343

44
45
© 2002, SoftSite Tecnologia. Todos os direitos reservados
Pág: 344
Exercício

Exercício
Exemplo

Enterprise Java Beans

Вам также может понравиться