Categories: Segurança

Conhecendo a segurança declarativa do Java (JAAS) – Parte 1

Afinal, o que é esse JAAS ?

O JAAS ou “Java Authentication and Authorization Service” é um conjunto de API’s que visam desacoplar as aplicações dos controles de acesso a recursos da mesma, ficou bonita essa frase hein ? na prática isso significa retirar do desenvolvedor a responsabilidade de ter que controlar o acesso a recursos por perfis de maneira programática( filtros e outros meios ilicitos que eu também já fiz /o\ ). Todo o controle passa a ser feito de maneira declarativa no descritor da aplicação, daí o nome segurança declarativa, intuituivo, não ?

Basicamente o JAAS pode ser atilizado para dois propósitos:
– Autenticação de usuários, ou seja, verificar se o usuário é registrado;
– Autorização de usuários, ou seja, verificar se o usuário já autenticado tem permissão de acesso para determinado recurso protegido;

Tá, mas…o que eu ganho usando o JAAS ?

Muitas coisas, você passa a se preocupar de fato com o código que é importante para a sua aplicação, as restrições a determinados recursos não vão mais interferir na maneira como você desenvolver sua aplicação, você pode por exemplo após ter concluído o desenvolvimento fazer as devidas declarações de quais recursos serão protegidos e quem poderá acessá-los. Implicitamente isso tornará seu código mais legível e focado nas regras de negócio. Sem contar que qualquer modificação nas restrições implicará na mudança de apenas um arquivo(web.xml) e não mais em diversos pontos espalhados pela aplicação.

Tudo muito legal, mas….como eu implemento isso ?

Para demonstrar como implementamos o JAAS vamos sugerir um cenário…
Suponhamos que em sua aplicação você tenha um recurso(neste caso uma JSP…obviamente poderia ser qualquer outra coisa, como servlets, imagens, enfim…) e que você deseje que apenas usuários devidamente autenticados e autorizados possam visualizar essa página.
Para ficar mais fácil a compreensão abaixo esta disposta a estrutura da aplicação onde iremos aplicar os conceitos do JAAS para resolvermos o problema proposto no cenário…
obs.: todos os elementos de relevância serão detalhados na seguência…

01.JPG

Eu chamei a aplicação de “Security”, e nela tenho o meu diretório de conteúdo (WebContent) onde tenho o diretório “WEB-INF”, minha JSP que irá ser mapeada para ser a página de boas vindas(index.jsp) e outro diretório chamado “jsp”. Neste diretório “jsp” temos a “home.jsp” que será a nossa página de acesso restrito e outro diretório chamado “security” onde vamos criar a tela de login(login.jsp) e a tela de erro apresentada caso o login seja falho(error_login.jsp).

Um dos métodos de autenticação de usuário do JAAS consiste em um mecanismo baseado em formulário de autenticação, formalmente conhecido como FORM, que é o método que será abordado neste artigo. Mas a título de conhecimento existem mais três métodos de autenticação que são o DIGEST, o BASIC e o CLIENT-CERT

Como declaramos qual será o método de autenticação que usaremos ?
No seu deployment descriptor você deverá inserir as seguintes declarações..

<login-config>
<!–INDICA O METODO DE AUTENTICAÇÃO –>
<auth-method>FORM</auth-method>

<form-login-config>
<!–INDICA A JSP DE LOGIN –>
<form-login-page>/jsp/security/login.jsp</form-login-page>

<!–INDICA A PAGINA A SER CAHAMADA CASO O LOGIN SEJA FALHO –>
<form-error-page>/jsp/security/error_login.jsp</form-error-page>
</form-login-config>
</login-config>

Com a declaração acima, estamos dizendo ao container para usar as telas de login,jsp e error_login.jsp para tratar a autenticação, portanto, devemos agora implementar essas JSP’s..

login.jsp

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″
pageEncoding=”ISO-8859-1″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>LOGIN</title>
</head>
<body>
<form action=”j_security_check” method=”POST”>
username: <input type=”text” name=”j_username” /><br />
password: <input type=”password” name=”j_password” /><br />
<input type=”submit” value=”login” />
</form>
</body>
</html>

IMPORTANTE:
A propriedade action do formulário deve conter o valor “j_security_check”, o campo que receberá o nome do usuário deverá se chamar “j_username” e o campo que receberá a senha deverá se chamar “j_password”. Sim, se você mudar algum desses valores obrigatorios sua autenticação terá dois possíveis caminhos…erro durante a execução ou ninguém nunca se conseguirá autenticação…

error_login.jsp

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″
pageEncoding=”ISO-8859-1″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>LOGIN</title>
</head>
<body>
<p>Usuário e/ou Senha inválidos !</p>
<a href=”javascript:history.go(-1);”>Tentar Novamente</a>
</body>
</html>

Declarando os “papéis” ou “perfis” de usuário que sua aplicação trabalhará…

No web.xml você deve declarar todas os perfis de usuários ou papéis aos quais os usuários poderão ser atribuidos…no nosso caso vamos criar a role “web_user”

<!– ROLES DE SEGURANÇA –>
<security-role>
<role-name>web_user</role-name>
</security-role>

Implementando a “home.jsp”…

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″ pageEncoding=”ISO-8859-1″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>HOME</title>
</head>
<body>
Welcome, ${userPrincipal.name} !
</body>
</html>

Restringindo a página “home.jsp” a usuários que possuam o “papel” de “web_user”…

Bom, para restringir o acesso de “algo” usando JAAS devemos seguir o conceito de que esse “algo” é um recurso, então dentro da tag de restrição de segurança nós mapeamos um recurso pela URL e atribuimos um nome a este recurso…nesta deficição podemos também especificar o método HTTP que deve ser tratato…lembrando que a não deficição dos métodos HTTP faz com que ambos GET e POST sejam tratados…
Logo em seguida, estamos definindo quais são os “papéis” que poderam ter acesso ao recurso mapeado…

<!– MAPEAMENTO DA SEGURANÇA –>
<security-constraint>

<web-resource-collection>
<web-resource-name>home</web-resource-name>
<url-pattern>/jsp/home.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>

<auth-constraint>
<role-name>web_user</role-name>
</auth-constraint>

</security-constraint>

Definindo e implementando a página de boas vindas ou welcome-file da nossa aplicação..

Para definirmos a página que será chamada quando o usuário acessar o “document root” da aplicação nos acrescentamos ao nosso arquivo web.xml o seguinte trecho de código..

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

Segue abaixo a implementação desta página…

index.jsp

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″
pageEncoding=”ISO-8859-1″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + “://” + request.getServerName() + “:” + request.getServerPort() + path + “/”;
%>
<html>
<head>
<base href=”${basePath}” />
<title>INDEX.JSP</title>
</head>
<body>
<a href=”jsp/home.jsp”>HOME ( recurso protegido )</a>
</body>
</html>

Bom, estamos quase terminando…
falta agora definirmos os usuários e os papéis que cada usuário poderá exercer na aplicação… para isso existem algumas formas de armazenar esses usuários e suas respectias responsabilidades. Esse foi o fator pelo qual separei esse artigo em 2 partes. Neste primeiro momento vamos armazenar essas informações em arquivos de propriedades que ficaram em nosso container, na segunda parte deste artigo nós aprimoraremos um pouco este exemplo fazendo com que as informações sejam armazenadas em um banco de dados.

Definindo os arquivos de propriedades…

Precisaremos crirar dois arquivos de propriedades, o “users.properties” e o “roles.properties”
o users.properties é o arquivo onde iremos armazenar os usuários e suas respectivas senhas
já o arquivo roles.properties é onde iremos associar ao usuário os papéis que ele poderá desempenhar na aplicação…

users.properties

root=123

roles.properties

root=web_user

Agora que já temos em mãos os arquivos necessários é só colocarmos esses arquivos no diretório “jboss-X.X.X.GA\server\default\conf“…lembrando que estas configurações são para se trabalhar com o JBoss…cada container tem a sua maneira de implementar essas configurações…

Pronto, agora basta inicializarmos o servidor e via browser tentar acessar nossa aplicação…
a página “index.jsp” será apresentada. Nela haverá um link para o recurso protegido(home.jsp) que quando acionado automaticamente requisitará a autenticação do usuário…Para conseguir acesso utilize “root” e “123” como usuário e senha respectivamente…

Qualquer dúvida ou falha no artigo por favor notifique… =)

Article info