Home Segurança em Jakarta EE
Post
Cancelar

Segurança em Jakarta EE

Os Principais Conceitos de Segurança

Autenticação: Garante que alguém é realmente quem diz ser;

Autorização: Verifica a possibilidade de acesso de alguém autenticado;

Confidencialidade e Integridade: Garantem que os dados não serão lidos ou alterados durante o tráfego.

Autenticação

• Garante a identidade de alguém

– Usuário e senha

– Leitura biométrica

– Certificado digital

• Até o Java EE 7, o processo de autenticação não era padronizado

– Cada container implementava da sua forma

• A partir do Java EE 8, foi criada a Java EE Security API

– Padronização no processo de autenticação

Autorização

• Depois de autenticado, o usuário pode acessar o recurso protegido?

• Em Java EE, a autorização é padronizada na especificação

– Todos os containers seguem o mesmo padrão

Definindo os Roles de Acesso

• Um role representa um grupo de acesso

• Os roles da aplicação podem ser definidos no arquivo web.xml

1
2
3
4
5
6
<security-role>
  <role-name>gerente</role-name>
</security-role>
<security-role>
  <role-name>diretor</role-name>
</security-role>

• Ou via anotação

1
@DeclareRoles({ "admin", "guest" })

Protegendo Recursos

• Recursos são protegidos em Java EE com base em mapeamentos de URL e HTTP method feitos no web.xml

1
2
3
4
5
6
7
8
9
10
11
12
<web-app>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>admin pages</web-resource-name>
      <url-pattern>/admin/*</url-pattern>
      <http-method>GET</http-method><!--Mapeamento e HTTP method-->
    </web-resource-collection>
    <auth-constraint>
      <role-name>diretor</role-name><!--Roles autorizados-->
    </auth-constraint>
  </security-constraint>
</web-app>

Tipos de Autenticação

• Ao acessar um recurso protegido, o navegador precisa solicitar as credenciais do usuário de alguma forma

• Essas são as 3 formas de autenticação mais usadas:

FormaDescrição
BASICO navegador abrirá uma janela padrão solicitando as credenciais
FORMO usuário será redirecionado para uma página customizada para fornecer as credenciais
CUSTOM FORMO usuário também fornecerá as credenciais em uma página customizada, mas o processo de autenticação é controlado por programação

Autenticação BASIC

• O container cuida de todo o processo de autenticação

• Uma janela aberta pelo próprio navegador solicita o usuário e a senha

1
2
3
@BasicAuthenticationMechanismDefinition
  public class Config {
}

Autenticação FORM

• Páginas customizadas para solicitar as credenciais

– Uma página solicitando usuário e senha

– Uma página para que haja o redirecionamento caso os dados digitados sejam inválidos

1
2
3
4
5
6
7
8
@FormAuthenticationMechanismDefinition(
  loginToContinue = @LoginToContinue(
    loginPage = "/login.faces",
    errorPage = "/error.faces"
  )
)
public class Config {
}

• O formulário de login deve seguir algumas regras

1
2
3
4
5
6
7
8
9
<html>
  <body>
    <form method="POST" action="j_security_check">
    Usuário: <input type="text" name="j_username"><br />
    Senha: <input type="password" name="j_password"><br />
    <input type="submit" value="Login">
    </form>
  </body>
</html>

Autenticação CUSTOM FORM

• Também baseado em páginas customizadas para o fornecimento de credenciais

1
2
3
4
5
6
7
8
@CustomFormAuthenticationMechanismDefinition( 
  loginToContinue = @LoginToContinue(
    loginPage = "/login.faces",
    errorPage = "/error.faces"
  )
)
public class Config {
}

• O formulário é livre, não precisa seguir nenhuma regra

1
2
3
4
5
6
7
8
9
<html>
  <body>
    <h:form>
      Usuário: <h:inputText value="#{loginBean.userName}" /><br />
      Senha: <h:inputSecret value="#{loginBean.password}" /><br /> 
      <h:commandButton value="Login" action="#{loginBean.login}" />
    </h:form>
  </body>
</html>

• O login é feito via programação usando um objeto SecurityContext

1
2
3
4
5
6
7
8
9
10
11
12
13
@Named
@RequestScoped
public class LoginBean implements Serializable {
  @Inject
  private SecurityContext securityContext;
  private String userName;
  private String password;
  public String login() {
    //...
    AuthenticationStatus status = securityContext.authenticate(request, response, authParams);
    //...
  }
}

O objeto SecurityContext

• A Java EE Security API introduziu o conceito de SecurityContext

– Um objeto onde detalhes do usuário autenticado podem ser obtidos via programação

MétodoDescrição
authenticate()Autentica um usuário fornecendo suas credenciais
getCallerPrincipal()Retorna o objeto Principal do usuário autenticado
isCallerInRole()Verifica se o usuário autenticado pertence a determinado grupo
hasAccessToWebResource()Verifica se o usuário autenticado tem acesso a determinada página web

• Um objeto SecurityContext é obtido através de injeção de dependência feita pelo CDI

1
2
@Inject
private SecurityContext securityContext;

• Ele pode ser obtido em diversos tipos de componentes do Java EE

– EJBs

– Servlets

– Filters

– JSF Beans

Segurança em EJBs

• A anotação @RolesAllowed controla quem pode acessar os métodos de um EJB

1
2
3
4
5
6
7
8
@Stateless
@RolesAllowed("admin")//Apenas usuários do grupo admin podem chamar m1() e m2()
public class MyBean {
  public void m1() {
  }
  public void m2() {
  }
}

• A anotação @RolesAllowed também pode ser usada em métodos

1
2
3
4
5
6
7
8
9
@Stateless
@RolesAllowed("admin")
public class MyBean {
  public void m1() {
  }
  @RolesAllowed("guest")//m2() pode ser chamado por usuários do grupo guest
  public void m2() {
  }
}

Confidencialidade e Integridade

• A confidencialidade previne que os dados sejam lidos durante o tráfego na rede

• A integridade garante que os dados não serão alterados enquanto trafegam pela rede

• O HTTPS dá essas garantias

– Hypertext Transfer Protocol Secure

Antes de serem enviados, os dados são criptografados.

Apenas o servidor de destino consegue descriptografar os dados

HTTPS e Java EE

• Primeiramente, é necessário configurar o servidor para que ele aceite conexões do tipo HTTPS

• Depois, no web.xml, basta definir que o acesso a determinado recurso necessita de HTTPS

1
2
3
4
5
6
7
8
9
10
11
<web-app>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>admin pages</web-resource-name>
      <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee><!--Garante o uso de HTTPS sempre que uma URL no padrão /admin/* for acessada-->
    </user-data-constraint>
  </security-constraint>
</web-app>

Baseado nos cursos da Softblue

Esta postagem está licenciada sob CC BY 4.0 pelo autor.