SlideShare a Scribd company logo
1 of 56
Download to read offline
florianópolis
abril 2017
helder da rocha
TRILHA JAVA EE
A API de Segurança do Java EE 8 (JSR-375)
Objetivos
• Como era a Segurança em Java EE antes de Java
EE 8?
• Principais novidades da API de Segurança 1.0
• Mecanismos de autenticação
• Identity Store
• Contexto universal de segurança
Quem sou eu? Who am I? Кто я?
Helder da Rocha
argonavis.com.br
Tecnologia * Ciência * Arte
HTML & tecnologias Web desde 1995
Autor de cursos e livros sobre

Java, XML e tecnologias Web
helderdarocha.com.br
O que é Segurança?
• Safety: proteção contra danos não-intencionais
• Problemas: bugs em geral e vulnerabilidades intrínsecas
do sistema (threads, ambiente, recursos externos, etc.)
• Proteção: qualidade da plataforma, boas práticas,
testes, validação, monitoração, logging, checksums, etc.
• Security: proteção contra danos intencionais
• Problemas: ataques em geral, acesso e manipulação de
dados protegidos, danos ao sistema ou a terceiros
• Proteção: autenticação, autorização, 

criptografia, auditoria, filtros, auditoria, 

hashes, etc.
Autenticação

e Autorização
Policy / Security Manager

JAAS

JarSigner TSA/TSP (RFC 3161)
Comunicação

Segura
JSSE (SSL/TLS)
SASL (RFC 2222)
GSS-API (RFC 2853)
Criptografia
JCA
JCE
Java XML DSig (JSR 105)
Infraestrutura de
Chave Pública (PKI)
X.509, CRLs e CertPath API
OCSP (RFC 2560)
PKCS#11
"Sandbox" da JVM
Classloader

Garbage collection

Bytecode verification

Data-typing
Segurança nativa da

Plataforma Java
+
Mecanismos de segurança
Java SE 8
Mensagem
Mensagem
Role
Principal
Role
userid
pass / cert
CamadadeAplicações
CamadadeAplicações
Camada de Transportes
Autenticação
Mensagem
Conexão

Segura
SSL/TLS
Conexão

Insegura
Autorização
Operações e
Recursos
APIs programáticas: autenticação (JASPIC) e autorização
(JACC + contextos de segurança de cada tipo de componente)
APIs declarativas: autorização, config de autenticação HTTP
(JAAS) e config de transporte SSL/TLS por recurso/método HTTP
Mecanismos de segurança
Java EE 7
Camada Web
Requisição 1: Pede página restrita
GET /app/faces/biblioteca.xhtml
Web Container
Resposta 1: Pede credenciais
401 Unauthorized
WWW-Authenticate: Basic realm="jdbc-realm"
Requisição 2: Envia credenciais
GET /app/faces/biblioteca.xhtml 

Authorization: Basic bWFzaGE6MTIzNDU=
Resposta 2: Envia página restrita
200 OK
Configuração (web.xml)
HTTPS 2-way (CONFIDENTIAL)
Autenticação: jdbc-realm
Métodos: GET, POST

Roles: todos os logados (**)
Autenticação
Realizar autenticação
Autenticado? Cria credencial.
Ir para Autorização
Não autenticado?
Retorna 401 Unauthorized
Autorização
Verificar permissões
Autorizado?
Retorna recurso pedido
Não autorizado?
Retorna 403 Forbidden
HTTP
HTTPS
HTTPS
HTTPS
Browser
Autenticação
Autorização&
na
EJB ContainerWeb Container
Contexto Web - Credenciais
Principal: kusko
Roles: {"outro"}
Servlet chama metodo 1 em EJB
try {
b.getFigura1();

} catch (EJBAccessException e) {
return "acessonegado.png";
}
Servlet chama metodo 2 em EJB
try {
b.getFigura2();

} catch (EJBAccessException e) {
return "acessonegado.png";
}
Contexto EJB (propagados)
Principal: kusko
Roles: {"outro"}
Autorização
@RolesAllowed("**")

public String getFigura1() {
return "peixinho.png";
}
@RolesAllowed("amigo")

public String getFigura2() {
return "lupita.png";
}EJBAccessException
Retornar link
Req2
Res2
Browser
Autorização na Camada EJB
Conexão HTTP Segura
• Pode-se proteger recursos em Java EE configurando a
necessidade do uso de HTTP + camada SSL/TLS
• SSL/TLS atua na camada de transporte protegendo contra
principais riscos de transferir dados pela rede
• Risco de não saber se outro é quem diz que é: autenticação
• Risco da mensagem ser interceptada e alterada: integridade
• Risco da mensagem ser interceptada e lida: confidencialidade
• SSL/TLS usa vários mecanismos de criptografia
• Hashes
• Criptografia de chave pública (assimétrica)
• Criptografia de chave secreta (simétrica)
• Também protege camada de mensagens

mas apenas durante a conexão
Autenticação
^63$t+p@55w0rd#
Autenticação
• Como provar que você é mesmo você?
• Apresente credenciais: algo que você tem (ex:
documento), é (ex: biometria) ou sabe (ex: senha)
• Autenticidade depende de
• Parecer dado por uma autoridade de confiança
• Integridade das informações: garantia que os dados
transmitidos não foram alterados pelo caminho)
Principal
• Representa uma entidade autenticada
• java.security.Principal
• Contém sua identificação (nome / certificado) verificada
através de credenciais
• Tem foco diferente em Java SE e Java EE
• Em Java SE (JAAS) um Subject representa um usuário,
que pode ter uma coleção de identidades (Principal)
• Em APIs Java EE um Principal representa um usuário,
que pode assumir uma coleção de papéis (Roles)
BASIC(RFC 2069 / 2617)
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jdbc-realm</realm-name>
</login-config>
401 Unauthorized
WWW-Authenticate: Basic realm="jdbc-realm"
GET /app/secret
Authorization: Basic bWFzaGE6MTIzNDU=
Para fazer logout: feche o browser!
Credenciais: encoding Base64
configuração

web.xml
GET /app/secret
200 OK
Servidor WebBrowser
DIGEST(RFC 2069 / 2617)
<login-config>
<auth-method>DIGEST</auth-method>
<realm-name>jdbc-realm</realm-name>
</login-config>
401 Unauthorized
WWW-Authenticate: Digest realm="jdbc-realm", 

qop="auth", nonce="143...064", opaque="DF...5C"
GET /app/secret
Authorization: Digest username="masha", realm="jdbc-realm", 

nonce="143...f89", uri="/app/faces/biblioteca.xhtml", 

response="2c40...df", opaque="DF...5C", qop=auth, 

nc=00000001, cnonce="66...948b"
Para fazer logout: feche o browser!
Credenciais: MD5 hash
configuração

web.xml
GET /app/secret
200 OK
Servidor WebBrowser
FORM
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/form.html</form-login-page>
<form-error-page>/erro.html</form-error-page>
</form-login-config>
</login-config>
POST https://localhost:29033/app/faces/j_security_check
Referer: https://localhost:29033/app/faces/biblioteca.xhtml
Cookie: JSESSIONID=aaab5...b1f6
Authorization:Basic Y2VyZWJybzoxMjM0NQ==
j_username:masha
j_password:12345
configuração

web.xml
200 OK 

Set-Cookie: JSESSIONID=aac...44; Path=/app; Secure; HttpOnly
Para fazer logout: HttpSession#invalidate()
Proteção depende da camada SSL/TLS
GET /app/secret
200 OK
Servidor WebBrowser
<form action="j_security_check" 

method="POST">
<input type="text" name="j_username">
<input type="password" name="j_password">
<input type="submit">
</form>
Encoding Base64
CLIENT-CERT
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
Configuração é dependente de plataforma
configuração

web.xml
Servidor WebBrowser
Owner: CN=Helder da Rocha, OU=Argonavis,
O=Argonavis, L=Sao Paulo, ST=SP, C=BR
Issuer: CN=Helder da Rocha, OU=Argonavis,
O=Argonavis, L=Sao Paulo, ST=SP, C=BR
Serial number: 156fb994
Valid from: Tue Jul 14 00:28:45 BRT 2015
until: Mon Oct 12 00:28:45 BRT 2015
Certificate fingerprints:
MD5: F2:B7:23:7B:61:35:D6:...:27:62:7C
SHA1: EC:52:88:9B:4F:63:9D:...:EC:D2:17
SHA256: 2E:35:2B:CF:41:30:...:28:0F:B3
Owner: CN=Self-Signed, OU=Oracle
Corporation, O=Glassfish
Issuer: CN=Self-Signed, OU=Oracle
Corporation, O=Glassfish
Serial number: 3E:56:D0:C9
Valid from: Jul 3 00:12:13 BRT 2015 until:
Jun 30 00:12:13 BRT 2025
Certificate fingerprints:
MD5: F5:A9:21:E3:59:30:E8:...:C3:8C:DE
SHA1: BE:F5:1A:C3:8C:DE:68:...:83:72:A4
SHA256: 1E:2D:F1:96:8B:C2:...:C2:C7:6E
GET /app/secret
Recebe certificado do servidor
Envia certificado do cliente
200 OK
Autorização
e role-mapping
Autorização
• Como controlar o acesso 

a recursos protegidos?
• Quem pode acessar?
• Quais recursos? URLs, componentes, classes, métodos,
blocos de código, tabelas, registros, fragmentos de XML,
imagens, arquivos, pastas, aplicações
• Que ações podem executar? GET, POST, ler, gravar,
criar, remover
• Quais condições? "das 9 as 17h", "enquanto 

houver tokens", "apenas duas vezes"
Este tipo de controle
de acesso não existe
em Java EE 7
Grupos (~coleções de usuários no servidor)
• Usuários podem pertencer a grupos
• Mas usuários não fazem parte do escopo do
Java EE, e grupos também não
• Conceito é dependente de plataforma
marvinspock
alienigenas
masha vini kusko
cerebro niquel
terraqueos
cerebro niquel
ratos
cerebro
megalomaniacos
marvin
masha
masha
russos
masha vini
Grupos criados para
aplicação exemplo no
Glassfish 4.1
Roles (~chaves de acesso a recursos protegidos)
• Principals (grupos e usuários) são mapeados a roles
• Mapeamento padrão: responsabilidade do identity
store
role: administrador
- grupo alienigenas
- usuário cerebro
role: especial
- usuário vini
- usuário masha
role: amigo
- usuário vini
- usuário masha
- usuário niquel
role: outro
- usuário kusko
alienigenas
Exemplo de mapeamentos
java.security

Permission
Autorização em Java EE
JACC (JSR 115)
• Baseada em roles, fácil de usar e 100% Java EE
• Configuração declarativa via anotações e deployment
descriptor XML ou anotações
• Acesso (leitura) através APIs programáticas em
contextos de segurança
<method-permission>
<role-name>...</role-name>
<method>
<ejb-name>...</ejb-name>
<method-name>...</method-name>
</method>
</method-permission>
<security-constraint>
<web-resource-collection>
...
</web-resource-collection>

<auth-constraint>
<role-name>...</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>...</transport-guarantee>
</user-data-constraint>
</security-constraint>
ejb-jar.xml
CamadaEJB
javax.security.jacc

EJBMethodPermission
javax.security.jacc

WebResourcePermission
javax.security.jacc

WebUserDataPermission
javax.security.jacc

WebRoleRefPermission
javax.security.jacc

EJBRoleRefPermission
CamadaWeb
web.xml
Deployment descriptorsAnotações
@ServletSecurity(
@HttpConstraint(

transportGuarantee = ...,
rolesAllowed = {...}
)
)
public class MyServlet... {...}
@RolesAllowed({...})
public class Bean {...

@DenyAll 

public void m1() {}

@PermitAll 

public void m2() {}
Autorização em Webapps
@WebServlet(name = "ServletSecreto", urlPatterns = {"/secreto"})
@ServletSecurity(
@HttpConstraint(

transportGuarantee = TransportGuarantee.CONFIDENTIAL,
rolesAllowed = {"amigo", "administrador"}
)
)
public class ServletSecreto extends HttpServlet { ... }
@WebServlet(name = "LabirintoServlet", urlPatterns = {"/labirinto"})
@ServletSecurity(httpMethodConstraints={

@HttpMethodConstraint("GET"),
@HttpMethodConstraint(value="POST", rolesAllowed={"outro"}),
@HttpMethodConstraint(

value="TRACE",

transportGuarantee = TransportGuarantee.NONE,
rolesAllowed = {"amigo", "administrador"}
)
})
public class LabirintoServlet extends HttpServlet { ... }
Autorização em EJB
@DeclareRoles({"amigo", "administrador"})

@Stateless public class ImagemBean {
@RolesAllowed("administrador")

public void removerUsuario(Usuario u) { ... }
@RolesAllowed("amigo")

public List<Usuario> listaDeUsuarios() { ... }
@PermitAll

public String getInfo() { ... }
@RolesAllowed("**")

public String getFreeStuff() { ... }
@DenyAll

public String loggingData() { ... }
}
Como implementar?
• Até Java EE 7
• Autenticação
• Requer o uso de ferramentas proprietárias ou escrever um
LoginModule usando JAAS (Java SE) com configuração
proprietária
• Autenticação programática (JASPIC) é complexa e não
suportada em todos os servidores
• Autorização
• Autorização declarativa via deployment descriptors ou
anotações, com declaração de roles
• Configuração de roles proprietária (identity store fornecido
pelo servidor e mapeado via configuração proprietária à
aplicação)
Autenticação via HttpServletRequest
• API programática (facilita a criação de filtros)
• getAuthType(): String
• Retorna string com mecanismo de autenticação (BASIC,
DIGEST, FORM, CLIENT-CERT) ou null
• authenticate(HttpServletResponse response)
• Autenticar usando mecanismo configurado
• login(String nome, String senha)
• Autenticar usando login e senha
• logout()
• Faz com que getRemoteUser(), getCallerPrincipal() e
getAuthType() retorne null
Autenticação usando JASPIC SAM
(ServerAuthModule)
public interface ServerAuthModule {
public void initialize(...) throws AuthException;
public AuthStatus validateRequest(...);
public Class<?>[] getSupportedMessageTypes();
public AuthStatus secureResponse(...);
public void cleanSubject(...);
}
É preciso implementar várias classes e interfaces!
JASPIC
javax.security.auth.message.module

ServerAuthModule
javax.servlet

ServletContextListener
javax.security.auth.message.config

AuthConfigFactory
javax.security.auth.message.config

AuthConfigProvider
contextInitialized()
javax.security.auth.message.config

ServerAuthConfig
javax.security.auth.message.config

ServerAuthContext
«create»
«create»
«create»«create»javax.security.auth.message.callback

CallbackHandler
javax.security.auth.message.callback

CallerPrincipalCallback
javax.security.auth.message.callback

GroupPrincipalCallback
validateRequest()
handle()
Web Container
authenticate Auth Service
JSR 196
«create»
«create»
initialize()
validateRequest()
registerConfigProvider()
«create»
HTTP

request
Register
Principal
and Groups
* *
*
*
*
*
* Must create implementations of these classes/interfaces
Objetivos da JSR-375
Simplificar, padronizar e modernizar
"This JSR will holistically attempt to simplify,
standardize, and modernize the Security API across
the platform in areas identified by the community via
survey results and submitted JIRA issues."
Propostas do JSR 375
• Terminologia unificada
• API de autenticação
• API de identity store
• API de password aliasing
• API de atribuição de roles e permissões
• API de interceptadores de autorização
• API de contexto de segurança
Objetivos
alcançados na
versão 1.0
Soteria
• Implementação de referência do Java EE 8
Security 1.0
• Pode ser usado em sistemas Java EE 7 importando
os JARs:
<dependency>
  <groupId>org.glassfish.soteria</groupId>
  <artifactId>javax.security.enterprise</artifactId>
  <version>1.0</version>
</dependency>
Java EE Security 1.0
• javax.security.enterprise
• SecurityContext (interface), CallerPrincipal (classe),
AuthenticationStatus (enum), AuthenticationException
• j.s.e.authentication.mechanism.http
• Classes, interfaces e anotações para autenticação
• j.s.e.credential
• Interface Credential, classe Password e implementações
de Credential
• j.s.e.identitystore
• API para identity store
javax.security.enterprise
SecurityContext
AuthenticationStatus
CallerPrincipal
AuthenticationException
javax.security.enterprise
SecurityContext
AuthenticationStatus
CallerPrincipal
AuthenticationException
SUCCESS
NOT_DONE
SEND_FAILURE
SEND_CONTINUE
Anotações de autenticação
@BasicAuthenticationMechanism (BASIC)
• realmName="" (WWW-Authenticate - não é ID store)
@FormAuthenticationMechanism (FORM) e
@CustomFormAuthenticationMechanism (authenticate())
• loginToContinue=@LoginToContinue()
@LoginToContinue
• errorPage="/login-error", loginPage="/login",
useForwardToLogin=true, useForwardToLoginExpression=""
@RememberMe, @AutoApplySession
Exemplos
• 1. BASIC:
• 2. FORM:
@BasicAuthenticationMechanismDefinition(realmName="user-realm")
@WebServlet("/login")
@DeclareRoles({ "admin", "user"})
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
public class LoginServlet extends HttpServlet { … }
@FormAuthenticationMechanismDefinition(
loginToContinue = @LoginToContinue(
loginPage = "/login",
errorPage = "/login-error"))
@ApplicationScoped
public class ApplicationConfig { ... }
3. Form com authenticate()
@Named @RequestScoped
public class LoginBean {
   
   @Inject SecurityContext sctx;
   String user, pass;
   
   public void login() {
       Credential credential =
new UsernamePasswordCredential(user, new Password(pass));
       AuthenticationStatus status = securityContext.authenticate(
           request, response, withParams().credential(credential));
       
       if (status.equals(SEND_CONTINUE))
// SUCESSO
        else if (status.equals(SEND_FAILURE))
          // FALHA
   } ...
}
<form jsf:id="form">
       <b>Userid</b>
       <input jsf:id="user" type="text"
jsf:value="#{loginBean.user}" />
       <b>Senha</b>
       <input jsf:id="pass" type="password"
jsf:value="#{loginBean.pass}" />
       <input type="submit" value="Login"
jsf:action="#{loginBean.login}" />
</form>
@CustomFormAuthenticationMechanismDefinition(
loginToContinue = @LoginToContinue(
loginPage="/login.xhtml"
)
)
@WebServlet("/admin")
@DeclareRoles({ "admin", "user"})
@ServletSecurity(@HttpConstraint(rolesAllowed = "admin"))
public class AdminServlet extends HttpServlet { ... }
Java EE 8 - Interface
HttpAuthenticationMechanism
• Para uso em servlet endpoints (ex: JAX-RS, JSF)
• É uma versão do ServerAuthModule (JASPIC)
compatível com CDI e específica para servlets
• Métodos recebem HttpServletRequest,
HttpServletResponse e HttpMessageContext
• Liberdade total para registrar autenticação! (pode ou
não delegar para um Identity Store)
• HttpMessageContext::
notifyContainerAboutLogin(Principal p, Set<String>
roles)
4. Autenticação JASPIC
• Implemente HttpAuthenticationMechanism (HAM)
como um bean CDI com ApplicationScope
• Implemente os métodos
AuthenticationStatus validateRequest

(HttpServletRequest, HttpServletResponse, HttpMessageContext)

pode executar qualquer autenticação e retorna o status
secureResponse()

default não criptografa.
cleanSubject()

para logoff - default
Processo de execução
Fonte: IBM developerworks
response.authenticate()
@RememberMe
• Usada na implementação de um HAM para que a autenticação
de um usuário seja lembrada e aplicada a cada requisição
• Atributos
• cookieHttpOnly=true, cookieMaxAgeSeconds=86400,
cookieSecureOnly=true, isRememberMe=true, *Expression="",
cookieName=JREMEMBERMEID
• @AutoApplySession: aplica automaticamente a sessão para
o usuário logado
@RememberMe(
       cookieMaxAgeSeconds = 1800
)
@ApplicationScoped
public class MyAuthenticationMechanism
implements HttpAuthenticationMechanism { … }
Identity Store
Usuários(pessoas, máquinas, sistemas)
• A criação e autenticação de usuários (principais)
é responsabilidade da identity store
marvinspock masha vini kusko cerebro niquel
Wild
Fly
Web

Sphere
Glass

fish
?
Gerência de usuários: Java EE 7
• Não existe suporte padrão para gerenciar usuários
em Java EE 7
• Aplicações não tem como criar, remover, atualizar
e agrupar usuários em Java EE
• Dependência de soluções 

proprietárias (vendor-lock-in), 

frameworks de terceiros 

ou soluções in-house
Realm (~reino, domínio)
• Autoridade que administra usuários e grupos e que
determina escopo de políticas de segurança (ex: LDAP,
banco de dados, banco de certificados, FB, Google)
• Também chamado de:
• Java EE utiliza apenas o nome do 

realm (para selecionar o escopo 

da autenticação via HTTP)
zone
domain
region
security provider
login module
identity manager
auth provider
authenticator
identity provider
auth store
auth repository
identity store
Proposta JSR-375: Identity Store
• Serviço padrão para criar, atualizar, remover, e agrupar
usuários
• Usa um recurso de usuários e grupos (banco de dados ou
LDAP)
• Poder ser intercambiável: recurso diferente para
desenvolvimento, teste, produção
• Interface IdentityStore implementada em Java EE 8 / Soteria
• Injetado em CDI através do IdentityStoreHandler
@Inject
private IdentityStoreHandler idStoreHandler;
Identity Store: implementação
Identity IdentityStore
LDAP BD Custom
Anotações de IdentityStore
• @DatabaseIdentityStoreDefinition
• callerQuery="",
• groupsQuery="",
• dataSourceLookup="java:comp/DefaultDataSource",
• hashAlgorithm=
javax.security.enterprise.identitystore.Pbkdf2PasswordHash.class,
• hashAlgorithmParameters={}, priority=70,
• useFor={IdentityStore.ValidationType.VALIDATE,
IdentityStore.ValidationType.PROVIDE_GROUPS},
• *Expression
• @LdapIdentityStoreDefinition
Identity Store: exemplo
usando banco de dados
@DatabaseIdentityStoreDefinition(
   dataSourceLookup = "java:global/permissions_db",
   callerQuery = "select senha from usuarios where nome = ?",
   groupsQuery = "select grupo from grupos where usuario = ?",
   hashAlgorithm = PasswordHash.class,
   priority = 10
)
@ApplicationScoped
@Named
public class ApplicationConfig { ... } usuarios
nome senha
grupos
usuario grupo
Custom IdentityStore
• IdentityStores customizados (arquivo, cookies,
memória, etc.) - ideal para testes
• Implementar os métodos (todos são default)
• CredentialValidationResult validate(Credential) - deve
retornar CredentialValidationResult.VALID ou INVALID
• Set<String>
getCallerGroups(CredentialValidationResult) -
retorna os grupos associados ao principal
• int getPriority()
• Set<IdentityStore.ValidationType> validationTypes()
Contexto de 

segurança
Como obter principals e testar roles
javax.servlet.http.

HttpServletRequest
getUserPrincipal()
isUserInRole()
WebServlets,

Facelets, WebFilters
javax.faces.context.

ExternalContext
getUserPrincipal()
isUserInRole()
JSF backing beans
javax.ejb.

EJBContext
getCallerPrincipal()
isCallerInRole()
EJBs
javax.websocket.

Session
getUserPrincipal()
WebSockets
javax.ws.rs.core.

SecurityContext
getUserPrincipal()
isUserInRole()
RESTful Web Services
javax.xml.ws.

WebServiceContext
getUserPrincipal()
isUserInRole()
SOAP Web Services
em Java EE 7
CDI
@Inject 

java.security.Principal
SecurityContext em Java EE 8
javax.security.enterprise

SecurityContext
getCallerPrincipal()
isCallerInRole()
getPrincipalsByType()
authenticate() hasAccessToWebResource()
Interface SecurityContext
• Pode ser injetada (CDI) em componentes Java EE
para acesso programático à API de segurança
• Métodos
• AuthenticationStatus authenticate(req, res, params)
• java.security.Principal getCallerPrincipal()
• Set<Principal> getPrincipalsByType(Class type)
• boolean isCallerInRole(role)
• boolean hasAccessToWebResource(res, mets...)
Java EE Security 1.0: 

contexto de segurança
• Um contexto de segurança pode ser obtido por
qualquer componente Java EE
public class MyCdiBean {
@Inject
private SecurityContext securityContext;
public String sayHello() {
if (securityContext.isCallerInRole("admin")) {
return "Hello World!";
}
throw new SecurityException("User is unauthorized.");
}
}
Conclusões
• Java EE Security 1.0 ainda não solucionou todos
os problemas de segurança do Java EE
• Mas conseguiu simplificar e padronizar recursos-
chave da API
• Autenticação independente de fabricante e
configurável via anotações
• Identity Store independente de fabricante e facilmente
configurável, injetável via CDI
• Contexto de Segurança universal, injetável e único
para todos os componentes
Baixe esta palestra em
http://www.argonavis.com.br/download/tdc_2018_flo_javaee_security.html
Código disponibilizado no GitHub:
https://github.com/argonavisbr/JavaEE7SecurityExamples

https://github.com/argonavisbr/JavaEE8SecurityExamples
Florianópolis
Abril/2018
helder da rocha
helder@summa.com.br

More Related Content

What's hot

Introdução a poo
Introdução a pooIntrodução a poo
Introdução a pooSedu
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLDaniel Brandão
 
Aula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaAula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
 
Introdução a Arquitetura de Sistemas
Introdução a Arquitetura de SistemasIntrodução a Arquitetura de Sistemas
Introdução a Arquitetura de SistemasIgor Takenami
 
O paradigma da orientação a objetos
O paradigma da orientação a objetosO paradigma da orientação a objetos
O paradigma da orientação a objetosNécio de Lima Veras
 
Metodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareMetodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareÁlvaro Farias Pinheiro
 
Aula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoAula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoJessyka Lage
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0César Augusto Pessôa
 

What's hot (20)

Introdução à linguagem python
Introdução à linguagem pythonIntrodução à linguagem python
Introdução à linguagem python
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a poo
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQL
 
Aula 1
Aula 1Aula 1
Aula 1
 
Python Orientação a Objeto
Python Orientação a ObjetoPython Orientação a Objeto
Python Orientação a Objeto
 
Aula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem JavaAula 2 - POO: Fundamentos da linguagem Java
Aula 2 - POO: Fundamentos da linguagem Java
 
Aula 09 - introducao oo
Aula 09 - introducao ooAula 09 - introducao oo
Aula 09 - introducao oo
 
Introdução a Arquitetura de Sistemas
Introdução a Arquitetura de SistemasIntrodução a Arquitetura de Sistemas
Introdução a Arquitetura de Sistemas
 
O paradigma da orientação a objetos
O paradigma da orientação a objetosO paradigma da orientação a objetos
O paradigma da orientação a objetos
 
Linguagem SQL
Linguagem SQLLinguagem SQL
Linguagem SQL
 
Spring Data Jpa
Spring Data JpaSpring Data Jpa
Spring Data Jpa
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Metodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de SoftwareMetodologias de Desenvolvimento de Software
Metodologias de Desenvolvimento de Software
 
Inspeções em desenvolvimento de software
Inspeções em desenvolvimento de softwareInspeções em desenvolvimento de software
Inspeções em desenvolvimento de software
 
Aula 01 - JavaScript: Introdução
Aula 01 - JavaScript: IntroduçãoAula 01 - JavaScript: Introdução
Aula 01 - JavaScript: Introdução
 
03 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.003 - Orientação a objetos e classes em C# v1.0
03 - Orientação a objetos e classes em C# v1.0
 

Similar to Java EE 8 Security API overview

Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Visão geral da segurança em Java EE
Visão geral da segurança em Java EEVisão geral da segurança em Java EE
Visão geral da segurança em Java EEHelder da Rocha
 
JSR 375 Segurança em Java EE 8
JSR 375 Segurança em Java EE 8JSR 375 Segurança em Java EE 8
JSR 375 Segurança em Java EE 8Helder da Rocha
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EELeonardo Zanivan
 
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EETDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EELeonardo Zanivan
 
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2Rodrigo Cândido da Silva
 
TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2Rodrigo Cândido da Silva
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014Tiago Marchetti Dolphine
 
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em Aplicações
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em AplicaçõesPalestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em Aplicações
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em AplicaçõesClavis Segurança da Informação
 
Propagação de Identidades
Propagação de IdentidadesPropagação de Identidades
Propagação de Identidadesacsvianabr
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfJ0071
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
Introdução - Graph API
Introdução  - Graph APIIntrodução  - Graph API
Introdução - Graph APIWilson Govindji
 
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...Alcyon Ferreira de Souza Junior, MSc
 

Similar to Java EE 8 Security API overview (20)

Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Visão geral da segurança em Java EE
Visão geral da segurança em Java EEVisão geral da segurança em Java EE
Visão geral da segurança em Java EE
 
JSR 375 Segurança em Java EE 8
JSR 375 Segurança em Java EE 8JSR 375 Segurança em Java EE 8
JSR 375 Segurança em Java EE 8
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
 
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EETDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
 
GUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em JavaGUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em Java
 
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
 
TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2
 
Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019
 
Workshop05
Workshop05Workshop05
Workshop05
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Jaas apresentado
Jaas apresentadoJaas apresentado
Jaas apresentado
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
 
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em Aplicações
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em AplicaçõesPalestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em Aplicações
Palestra em parceria com o @cefet_rj – Auditoria Teste de Invasão em Aplicações
 
Propagação de Identidades
Propagação de IdentidadesPropagação de Identidades
Propagação de Identidades
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdf
 
Segurança e Controle de errros
Segurança e Controle de errrosSegurança e Controle de errros
Segurança e Controle de errros
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
Introdução - Graph API
Introdução  - Graph APIIntrodução  - Graph API
Introdução - Graph API
 
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
 

More from Helder da Rocha

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Helder da Rocha
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasHelder da Rocha
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a WebHelder da Rocha
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosHelder da Rocha
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Helder da Rocha
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e FuturesHelder da Rocha
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 

More from Helder da Rocha (20)

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemas
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 

Java EE 8 Security API overview

  • 1. florianópolis abril 2017 helder da rocha TRILHA JAVA EE A API de Segurança do Java EE 8 (JSR-375)
  • 2. Objetivos • Como era a Segurança em Java EE antes de Java EE 8? • Principais novidades da API de Segurança 1.0 • Mecanismos de autenticação • Identity Store • Contexto universal de segurança
  • 3. Quem sou eu? Who am I? Кто я? Helder da Rocha argonavis.com.br Tecnologia * Ciência * Arte HTML & tecnologias Web desde 1995 Autor de cursos e livros sobre
 Java, XML e tecnologias Web helderdarocha.com.br
  • 4. O que é Segurança? • Safety: proteção contra danos não-intencionais • Problemas: bugs em geral e vulnerabilidades intrínsecas do sistema (threads, ambiente, recursos externos, etc.) • Proteção: qualidade da plataforma, boas práticas, testes, validação, monitoração, logging, checksums, etc. • Security: proteção contra danos intencionais • Problemas: ataques em geral, acesso e manipulação de dados protegidos, danos ao sistema ou a terceiros • Proteção: autenticação, autorização, 
 criptografia, auditoria, filtros, auditoria, 
 hashes, etc.
  • 5. Autenticação
 e Autorização Policy / Security Manager
 JAAS
 JarSigner TSA/TSP (RFC 3161) Comunicação
 Segura JSSE (SSL/TLS) SASL (RFC 2222) GSS-API (RFC 2853) Criptografia JCA JCE Java XML DSig (JSR 105) Infraestrutura de Chave Pública (PKI) X.509, CRLs e CertPath API OCSP (RFC 2560) PKCS#11 "Sandbox" da JVM Classloader
 Garbage collection
 Bytecode verification
 Data-typing Segurança nativa da
 Plataforma Java + Mecanismos de segurança Java SE 8
  • 6. Mensagem Mensagem Role Principal Role userid pass / cert CamadadeAplicações CamadadeAplicações Camada de Transportes Autenticação Mensagem Conexão
 Segura SSL/TLS Conexão
 Insegura Autorização Operações e Recursos APIs programáticas: autenticação (JASPIC) e autorização (JACC + contextos de segurança de cada tipo de componente) APIs declarativas: autorização, config de autenticação HTTP (JAAS) e config de transporte SSL/TLS por recurso/método HTTP Mecanismos de segurança Java EE 7
  • 7. Camada Web Requisição 1: Pede página restrita GET /app/faces/biblioteca.xhtml Web Container Resposta 1: Pede credenciais 401 Unauthorized WWW-Authenticate: Basic realm="jdbc-realm" Requisição 2: Envia credenciais GET /app/faces/biblioteca.xhtml 
 Authorization: Basic bWFzaGE6MTIzNDU= Resposta 2: Envia página restrita 200 OK Configuração (web.xml) HTTPS 2-way (CONFIDENTIAL) Autenticação: jdbc-realm Métodos: GET, POST
 Roles: todos os logados (**) Autenticação Realizar autenticação Autenticado? Cria credencial. Ir para Autorização Não autenticado? Retorna 401 Unauthorized Autorização Verificar permissões Autorizado? Retorna recurso pedido Não autorizado? Retorna 403 Forbidden HTTP HTTPS HTTPS HTTPS Browser Autenticação Autorização& na
  • 8. EJB ContainerWeb Container Contexto Web - Credenciais Principal: kusko Roles: {"outro"} Servlet chama metodo 1 em EJB try { b.getFigura1();
 } catch (EJBAccessException e) { return "acessonegado.png"; } Servlet chama metodo 2 em EJB try { b.getFigura2();
 } catch (EJBAccessException e) { return "acessonegado.png"; } Contexto EJB (propagados) Principal: kusko Roles: {"outro"} Autorização @RolesAllowed("**")
 public String getFigura1() { return "peixinho.png"; } @RolesAllowed("amigo")
 public String getFigura2() { return "lupita.png"; }EJBAccessException Retornar link Req2 Res2 Browser Autorização na Camada EJB
  • 9. Conexão HTTP Segura • Pode-se proteger recursos em Java EE configurando a necessidade do uso de HTTP + camada SSL/TLS • SSL/TLS atua na camada de transporte protegendo contra principais riscos de transferir dados pela rede • Risco de não saber se outro é quem diz que é: autenticação • Risco da mensagem ser interceptada e alterada: integridade • Risco da mensagem ser interceptada e lida: confidencialidade • SSL/TLS usa vários mecanismos de criptografia • Hashes • Criptografia de chave pública (assimétrica) • Criptografia de chave secreta (simétrica) • Também protege camada de mensagens
 mas apenas durante a conexão
  • 11. Autenticação • Como provar que você é mesmo você? • Apresente credenciais: algo que você tem (ex: documento), é (ex: biometria) ou sabe (ex: senha) • Autenticidade depende de • Parecer dado por uma autoridade de confiança • Integridade das informações: garantia que os dados transmitidos não foram alterados pelo caminho)
  • 12. Principal • Representa uma entidade autenticada • java.security.Principal • Contém sua identificação (nome / certificado) verificada através de credenciais • Tem foco diferente em Java SE e Java EE • Em Java SE (JAAS) um Subject representa um usuário, que pode ter uma coleção de identidades (Principal) • Em APIs Java EE um Principal representa um usuário, que pode assumir uma coleção de papéis (Roles)
  • 13. BASIC(RFC 2069 / 2617) <login-config> <auth-method>BASIC</auth-method> <realm-name>jdbc-realm</realm-name> </login-config> 401 Unauthorized WWW-Authenticate: Basic realm="jdbc-realm" GET /app/secret Authorization: Basic bWFzaGE6MTIzNDU= Para fazer logout: feche o browser! Credenciais: encoding Base64 configuração web.xml GET /app/secret 200 OK Servidor WebBrowser
  • 14. DIGEST(RFC 2069 / 2617) <login-config> <auth-method>DIGEST</auth-method> <realm-name>jdbc-realm</realm-name> </login-config> 401 Unauthorized WWW-Authenticate: Digest realm="jdbc-realm", 
 qop="auth", nonce="143...064", opaque="DF...5C" GET /app/secret Authorization: Digest username="masha", realm="jdbc-realm", 
 nonce="143...f89", uri="/app/faces/biblioteca.xhtml", 
 response="2c40...df", opaque="DF...5C", qop=auth, 
 nc=00000001, cnonce="66...948b" Para fazer logout: feche o browser! Credenciais: MD5 hash configuração web.xml GET /app/secret 200 OK Servidor WebBrowser
  • 15. FORM <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/form.html</form-login-page> <form-error-page>/erro.html</form-error-page> </form-login-config> </login-config> POST https://localhost:29033/app/faces/j_security_check Referer: https://localhost:29033/app/faces/biblioteca.xhtml Cookie: JSESSIONID=aaab5...b1f6 Authorization:Basic Y2VyZWJybzoxMjM0NQ== j_username:masha j_password:12345 configuração web.xml 200 OK 
 Set-Cookie: JSESSIONID=aac...44; Path=/app; Secure; HttpOnly Para fazer logout: HttpSession#invalidate() Proteção depende da camada SSL/TLS GET /app/secret 200 OK Servidor WebBrowser <form action="j_security_check" 
 method="POST"> <input type="text" name="j_username"> <input type="password" name="j_password"> <input type="submit"> </form> Encoding Base64
  • 16. CLIENT-CERT <login-config> <auth-method>CLIENT-CERT</auth-method> </login-config> Configuração é dependente de plataforma configuração web.xml Servidor WebBrowser Owner: CN=Helder da Rocha, OU=Argonavis, O=Argonavis, L=Sao Paulo, ST=SP, C=BR Issuer: CN=Helder da Rocha, OU=Argonavis, O=Argonavis, L=Sao Paulo, ST=SP, C=BR Serial number: 156fb994 Valid from: Tue Jul 14 00:28:45 BRT 2015 until: Mon Oct 12 00:28:45 BRT 2015 Certificate fingerprints: MD5: F2:B7:23:7B:61:35:D6:...:27:62:7C SHA1: EC:52:88:9B:4F:63:9D:...:EC:D2:17 SHA256: 2E:35:2B:CF:41:30:...:28:0F:B3 Owner: CN=Self-Signed, OU=Oracle Corporation, O=Glassfish Issuer: CN=Self-Signed, OU=Oracle Corporation, O=Glassfish Serial number: 3E:56:D0:C9 Valid from: Jul 3 00:12:13 BRT 2015 until: Jun 30 00:12:13 BRT 2025 Certificate fingerprints: MD5: F5:A9:21:E3:59:30:E8:...:C3:8C:DE SHA1: BE:F5:1A:C3:8C:DE:68:...:83:72:A4 SHA256: 1E:2D:F1:96:8B:C2:...:C2:C7:6E GET /app/secret Recebe certificado do servidor Envia certificado do cliente 200 OK
  • 18. Autorização • Como controlar o acesso 
 a recursos protegidos? • Quem pode acessar? • Quais recursos? URLs, componentes, classes, métodos, blocos de código, tabelas, registros, fragmentos de XML, imagens, arquivos, pastas, aplicações • Que ações podem executar? GET, POST, ler, gravar, criar, remover • Quais condições? "das 9 as 17h", "enquanto 
 houver tokens", "apenas duas vezes" Este tipo de controle de acesso não existe em Java EE 7
  • 19. Grupos (~coleções de usuários no servidor) • Usuários podem pertencer a grupos • Mas usuários não fazem parte do escopo do Java EE, e grupos também não • Conceito é dependente de plataforma marvinspock alienigenas masha vini kusko cerebro niquel terraqueos cerebro niquel ratos cerebro megalomaniacos marvin masha masha russos masha vini Grupos criados para aplicação exemplo no Glassfish 4.1
  • 20. Roles (~chaves de acesso a recursos protegidos) • Principals (grupos e usuários) são mapeados a roles • Mapeamento padrão: responsabilidade do identity store role: administrador - grupo alienigenas - usuário cerebro role: especial - usuário vini - usuário masha role: amigo - usuário vini - usuário masha - usuário niquel role: outro - usuário kusko alienigenas Exemplo de mapeamentos
  • 21. java.security
 Permission Autorização em Java EE JACC (JSR 115) • Baseada em roles, fácil de usar e 100% Java EE • Configuração declarativa via anotações e deployment descriptor XML ou anotações • Acesso (leitura) através APIs programáticas em contextos de segurança <method-permission> <role-name>...</role-name> <method> <ejb-name>...</ejb-name> <method-name>...</method-name> </method> </method-permission> <security-constraint> <web-resource-collection> ... </web-resource-collection>
 <auth-constraint> <role-name>...</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>...</transport-guarantee> </user-data-constraint> </security-constraint> ejb-jar.xml CamadaEJB javax.security.jacc
 EJBMethodPermission javax.security.jacc
 WebResourcePermission javax.security.jacc
 WebUserDataPermission javax.security.jacc
 WebRoleRefPermission javax.security.jacc
 EJBRoleRefPermission CamadaWeb web.xml Deployment descriptorsAnotações @ServletSecurity( @HttpConstraint(
 transportGuarantee = ..., rolesAllowed = {...} ) ) public class MyServlet... {...} @RolesAllowed({...}) public class Bean {...
 @DenyAll 
 public void m1() {}
 @PermitAll 
 public void m2() {}
  • 22. Autorização em Webapps @WebServlet(name = "ServletSecreto", urlPatterns = {"/secreto"}) @ServletSecurity( @HttpConstraint(
 transportGuarantee = TransportGuarantee.CONFIDENTIAL, rolesAllowed = {"amigo", "administrador"} ) ) public class ServletSecreto extends HttpServlet { ... } @WebServlet(name = "LabirintoServlet", urlPatterns = {"/labirinto"}) @ServletSecurity(httpMethodConstraints={
 @HttpMethodConstraint("GET"), @HttpMethodConstraint(value="POST", rolesAllowed={"outro"}), @HttpMethodConstraint(
 value="TRACE",
 transportGuarantee = TransportGuarantee.NONE, rolesAllowed = {"amigo", "administrador"} ) }) public class LabirintoServlet extends HttpServlet { ... }
  • 23. Autorização em EJB @DeclareRoles({"amigo", "administrador"})
 @Stateless public class ImagemBean { @RolesAllowed("administrador")
 public void removerUsuario(Usuario u) { ... } @RolesAllowed("amigo")
 public List<Usuario> listaDeUsuarios() { ... } @PermitAll
 public String getInfo() { ... } @RolesAllowed("**")
 public String getFreeStuff() { ... } @DenyAll
 public String loggingData() { ... } }
  • 24. Como implementar? • Até Java EE 7 • Autenticação • Requer o uso de ferramentas proprietárias ou escrever um LoginModule usando JAAS (Java SE) com configuração proprietária • Autenticação programática (JASPIC) é complexa e não suportada em todos os servidores • Autorização • Autorização declarativa via deployment descriptors ou anotações, com declaração de roles • Configuração de roles proprietária (identity store fornecido pelo servidor e mapeado via configuração proprietária à aplicação)
  • 25. Autenticação via HttpServletRequest • API programática (facilita a criação de filtros) • getAuthType(): String • Retorna string com mecanismo de autenticação (BASIC, DIGEST, FORM, CLIENT-CERT) ou null • authenticate(HttpServletResponse response) • Autenticar usando mecanismo configurado • login(String nome, String senha) • Autenticar usando login e senha • logout() • Faz com que getRemoteUser(), getCallerPrincipal() e getAuthType() retorne null
  • 26. Autenticação usando JASPIC SAM (ServerAuthModule) public interface ServerAuthModule { public void initialize(...) throws AuthException; public AuthStatus validateRequest(...); public Class<?>[] getSupportedMessageTypes(); public AuthStatus secureResponse(...); public void cleanSubject(...); } É preciso implementar várias classes e interfaces!
  • 27. JASPIC javax.security.auth.message.module
 ServerAuthModule javax.servlet
 ServletContextListener javax.security.auth.message.config
 AuthConfigFactory javax.security.auth.message.config
 AuthConfigProvider contextInitialized() javax.security.auth.message.config
 ServerAuthConfig javax.security.auth.message.config
 ServerAuthContext «create» «create» «create»«create»javax.security.auth.message.callback
 CallbackHandler javax.security.auth.message.callback
 CallerPrincipalCallback javax.security.auth.message.callback
 GroupPrincipalCallback validateRequest() handle() Web Container authenticate Auth Service JSR 196 «create» «create» initialize() validateRequest() registerConfigProvider() «create» HTTP
 request Register Principal and Groups * * * * * * * Must create implementations of these classes/interfaces
  • 28. Objetivos da JSR-375 Simplificar, padronizar e modernizar "This JSR will holistically attempt to simplify, standardize, and modernize the Security API across the platform in areas identified by the community via survey results and submitted JIRA issues."
  • 29. Propostas do JSR 375 • Terminologia unificada • API de autenticação • API de identity store • API de password aliasing • API de atribuição de roles e permissões • API de interceptadores de autorização • API de contexto de segurança Objetivos alcançados na versão 1.0
  • 30. Soteria • Implementação de referência do Java EE 8 Security 1.0 • Pode ser usado em sistemas Java EE 7 importando os JARs: <dependency>   <groupId>org.glassfish.soteria</groupId>   <artifactId>javax.security.enterprise</artifactId>   <version>1.0</version> </dependency>
  • 31. Java EE Security 1.0 • javax.security.enterprise • SecurityContext (interface), CallerPrincipal (classe), AuthenticationStatus (enum), AuthenticationException • j.s.e.authentication.mechanism.http • Classes, interfaces e anotações para autenticação • j.s.e.credential • Interface Credential, classe Password e implementações de Credential • j.s.e.identitystore • API para identity store
  • 34. Anotações de autenticação @BasicAuthenticationMechanism (BASIC) • realmName="" (WWW-Authenticate - não é ID store) @FormAuthenticationMechanism (FORM) e @CustomFormAuthenticationMechanism (authenticate()) • loginToContinue=@LoginToContinue() @LoginToContinue • errorPage="/login-error", loginPage="/login", useForwardToLogin=true, useForwardToLoginExpression="" @RememberMe, @AutoApplySession
  • 35. Exemplos • 1. BASIC: • 2. FORM: @BasicAuthenticationMechanismDefinition(realmName="user-realm") @WebServlet("/login") @DeclareRoles({ "admin", "user"}) @ServletSecurity(@HttpConstraint(rolesAllowed = "user")) public class LoginServlet extends HttpServlet { … } @FormAuthenticationMechanismDefinition( loginToContinue = @LoginToContinue( loginPage = "/login", errorPage = "/login-error")) @ApplicationScoped public class ApplicationConfig { ... }
  • 36. 3. Form com authenticate() @Named @RequestScoped public class LoginBean {        @Inject SecurityContext sctx;    String user, pass;        public void login() {        Credential credential = new UsernamePasswordCredential(user, new Password(pass));        AuthenticationStatus status = securityContext.authenticate(            request, response, withParams().credential(credential));                if (status.equals(SEND_CONTINUE)) // SUCESSO         else if (status.equals(SEND_FAILURE))           // FALHA    } ... } <form jsf:id="form">        <b>Userid</b>        <input jsf:id="user" type="text" jsf:value="#{loginBean.user}" />        <b>Senha</b>        <input jsf:id="pass" type="password" jsf:value="#{loginBean.pass}" />        <input type="submit" value="Login" jsf:action="#{loginBean.login}" /> </form> @CustomFormAuthenticationMechanismDefinition( loginToContinue = @LoginToContinue( loginPage="/login.xhtml" ) ) @WebServlet("/admin") @DeclareRoles({ "admin", "user"}) @ServletSecurity(@HttpConstraint(rolesAllowed = "admin")) public class AdminServlet extends HttpServlet { ... }
  • 37. Java EE 8 - Interface HttpAuthenticationMechanism • Para uso em servlet endpoints (ex: JAX-RS, JSF) • É uma versão do ServerAuthModule (JASPIC) compatível com CDI e específica para servlets • Métodos recebem HttpServletRequest, HttpServletResponse e HttpMessageContext • Liberdade total para registrar autenticação! (pode ou não delegar para um Identity Store) • HttpMessageContext:: notifyContainerAboutLogin(Principal p, Set<String> roles)
  • 38. 4. Autenticação JASPIC • Implemente HttpAuthenticationMechanism (HAM) como um bean CDI com ApplicationScope • Implemente os métodos AuthenticationStatus validateRequest
 (HttpServletRequest, HttpServletResponse, HttpMessageContext)
 pode executar qualquer autenticação e retorna o status secureResponse()
 default não criptografa. cleanSubject()
 para logoff - default
  • 39. Processo de execução Fonte: IBM developerworks response.authenticate()
  • 40. @RememberMe • Usada na implementação de um HAM para que a autenticação de um usuário seja lembrada e aplicada a cada requisição • Atributos • cookieHttpOnly=true, cookieMaxAgeSeconds=86400, cookieSecureOnly=true, isRememberMe=true, *Expression="", cookieName=JREMEMBERMEID • @AutoApplySession: aplica automaticamente a sessão para o usuário logado @RememberMe(        cookieMaxAgeSeconds = 1800 ) @ApplicationScoped public class MyAuthenticationMechanism implements HttpAuthenticationMechanism { … }
  • 42. Usuários(pessoas, máquinas, sistemas) • A criação e autenticação de usuários (principais) é responsabilidade da identity store marvinspock masha vini kusko cerebro niquel
  • 43. Wild Fly Web
 Sphere Glass
 fish ? Gerência de usuários: Java EE 7 • Não existe suporte padrão para gerenciar usuários em Java EE 7 • Aplicações não tem como criar, remover, atualizar e agrupar usuários em Java EE • Dependência de soluções 
 proprietárias (vendor-lock-in), 
 frameworks de terceiros 
 ou soluções in-house
  • 44. Realm (~reino, domínio) • Autoridade que administra usuários e grupos e que determina escopo de políticas de segurança (ex: LDAP, banco de dados, banco de certificados, FB, Google) • Também chamado de: • Java EE utiliza apenas o nome do 
 realm (para selecionar o escopo 
 da autenticação via HTTP) zone domain region security provider login module identity manager auth provider authenticator identity provider auth store auth repository identity store
  • 45. Proposta JSR-375: Identity Store • Serviço padrão para criar, atualizar, remover, e agrupar usuários • Usa um recurso de usuários e grupos (banco de dados ou LDAP) • Poder ser intercambiável: recurso diferente para desenvolvimento, teste, produção • Interface IdentityStore implementada em Java EE 8 / Soteria • Injetado em CDI através do IdentityStoreHandler @Inject private IdentityStoreHandler idStoreHandler;
  • 46. Identity Store: implementação Identity IdentityStore LDAP BD Custom
  • 47. Anotações de IdentityStore • @DatabaseIdentityStoreDefinition • callerQuery="", • groupsQuery="", • dataSourceLookup="java:comp/DefaultDataSource", • hashAlgorithm= javax.security.enterprise.identitystore.Pbkdf2PasswordHash.class, • hashAlgorithmParameters={}, priority=70, • useFor={IdentityStore.ValidationType.VALIDATE, IdentityStore.ValidationType.PROVIDE_GROUPS}, • *Expression • @LdapIdentityStoreDefinition
  • 48. Identity Store: exemplo usando banco de dados @DatabaseIdentityStoreDefinition(    dataSourceLookup = "java:global/permissions_db",    callerQuery = "select senha from usuarios where nome = ?",    groupsQuery = "select grupo from grupos where usuario = ?",    hashAlgorithm = PasswordHash.class,    priority = 10 ) @ApplicationScoped @Named public class ApplicationConfig { ... } usuarios nome senha grupos usuario grupo
  • 49. Custom IdentityStore • IdentityStores customizados (arquivo, cookies, memória, etc.) - ideal para testes • Implementar os métodos (todos são default) • CredentialValidationResult validate(Credential) - deve retornar CredentialValidationResult.VALID ou INVALID • Set<String> getCallerGroups(CredentialValidationResult) - retorna os grupos associados ao principal • int getPriority() • Set<IdentityStore.ValidationType> validationTypes()
  • 51. Como obter principals e testar roles javax.servlet.http.
 HttpServletRequest getUserPrincipal() isUserInRole() WebServlets,
 Facelets, WebFilters javax.faces.context.
 ExternalContext getUserPrincipal() isUserInRole() JSF backing beans javax.ejb.
 EJBContext getCallerPrincipal() isCallerInRole() EJBs javax.websocket.
 Session getUserPrincipal() WebSockets javax.ws.rs.core.
 SecurityContext getUserPrincipal() isUserInRole() RESTful Web Services javax.xml.ws.
 WebServiceContext getUserPrincipal() isUserInRole() SOAP Web Services em Java EE 7 CDI @Inject 
 java.security.Principal
  • 52. SecurityContext em Java EE 8 javax.security.enterprise
 SecurityContext getCallerPrincipal() isCallerInRole() getPrincipalsByType() authenticate() hasAccessToWebResource()
  • 53. Interface SecurityContext • Pode ser injetada (CDI) em componentes Java EE para acesso programático à API de segurança • Métodos • AuthenticationStatus authenticate(req, res, params) • java.security.Principal getCallerPrincipal() • Set<Principal> getPrincipalsByType(Class type) • boolean isCallerInRole(role) • boolean hasAccessToWebResource(res, mets...)
  • 54. Java EE Security 1.0: 
 contexto de segurança • Um contexto de segurança pode ser obtido por qualquer componente Java EE public class MyCdiBean { @Inject private SecurityContext securityContext; public String sayHello() { if (securityContext.isCallerInRole("admin")) { return "Hello World!"; } throw new SecurityException("User is unauthorized."); } }
  • 55. Conclusões • Java EE Security 1.0 ainda não solucionou todos os problemas de segurança do Java EE • Mas conseguiu simplificar e padronizar recursos- chave da API • Autenticação independente de fabricante e configurável via anotações • Identity Store independente de fabricante e facilmente configurável, injetável via CDI • Contexto de Segurança universal, injetável e único para todos os componentes
  • 56. Baixe esta palestra em http://www.argonavis.com.br/download/tdc_2018_flo_javaee_security.html Código disponibilizado no GitHub: https://github.com/argonavisbr/JavaEE7SecurityExamples
 https://github.com/argonavisbr/JavaEE8SecurityExamples Florianópolis Abril/2018 helder da rocha helder@summa.com.br