Está en la página 1de 7

Autorização e Autenticação no Tomcat

SUNDAY, 2. MARCH 2008, 18:01:27

WEB, JAVA, AUTENTICAÇÃO, SEGURANÇA ...

Finalmente encontro um tempo para voltar a estudar para a SCWCD. Resolvi mergulhar na
autenticação e autorização. Apesar de eu ter apenas ouvido falar sobre como é recomendável
utilizar o container para autenticar para você, eu sempre preferia fazer o trabalho no código -
obviamente por falta de conhecimento.

Antecedentes

Para fazer uma autenticação via código, é necessário criar uma classe que fizesse a verificação no
banco de dados, passando como parâmetros o usuário e a senha. Além disso era necessário verificar
a sessão em todas as jsps e servlets. Na melhor das hipóteses é possível criar um filtro para facilitar
o trabalho e apenas configurar a sua aplicação para chama-lo antes de cada requisição.

Requisitos e/ou versões utilizadas

• JDK 6
• Tomcat 6
• Uma aplicação web qualquer no tomcat(não precisa ter servlets e jsps, basta que haja o
web.xml e um simples html)

Configurando o Tomcat

Antes de mais nada vou esclarecer de que esse exemplo é somente para o tomcat, mas pode ser
fácilmente modificado para funcionar em outros containers web.
Agora vamos configurar o tomcat, apartir do diretório raiz do abra o arquivo "conf/server.xml" em
um bloco de texto para a edição e adicione a linha abaixo dentro da tag <Engine ...></Engine>.

<Realm className="org.apache.catalina.realm.MemoryRealm" />

Após salvar e fechar o arquivo server.xml, abra o arquivo "conf/tomcat-users.xml" e adicione as


regras e usuário da sua aplicação como no exemplo abaixo.

<tomcat-users>

<role rolename="membro"/>

<role rolename="admin"/>

<user username="renato" password="renato" roles="membro"/>

<user username="shibutani" password="shibutani" roles="admin, membro"/>

</tomcat-users>

Com essas configurações o tomcat já está pronto para aceitar nossas regras de seguranças. Cada
tag <role> determina um regra que será utilizada para definir quem pode ou não acessar um
determinado conteúdo. E as tags <user> define os usuário que utilizaram a aplicação web.
<pergunta-frequênte> sim você pode utilizar o seu banco para definir um usuário. Vide "Utilizando
JDBCRealm"</pregunta-frequênte>

Configurando nossa aplicação web

Essa é a parte realmente interessante, onde vamos definir as nossas regras. Abra o arquivo web.xml
da sua aplicação e vamos adicionar algumas linhas de código dentro da tag <web-app ...>.

...

<security-constraint>

<web-resource-collection>

<web-resource-name>Restrito</web-resource-name>

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

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

<http-method> DELETE </http-method>

<http-method> GET </http-method>

<http-method> POST </http-method>

<http-method> PUT </http-method>

</web-resource-collection>

<auth-constraint>

<role-name>membro</role-name>

<role-name>admin</role-name>

</auth-constraint>

</security-constraint>

<security-constraint>

<web-resource-collection>

<web-resource-name>Somente Administrador</web-resource-
name>

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

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

<http-method> DELETE </http-method>

<http-method> GET </http-method>

<http-method> POST </http-method>

<http-method> PUT </http-method>


</web-resource-collection>

<auth-constraint>

<role-name>admin</role-name>

</auth-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

</login-config>

<security-role>

<role-name>membro</role-name>

</security-role>

<security-role>

<role-name>admin</role-name>

</security-role>

...

Pronto agora quando você tentar acessar qualquer conteúdo específicado acima, como uma imagem
jpg, você será intimado a logar no sistema:
<assunto-especial-nada-importante>E sim. Eu também uso o firefox... Isso me faz lembrar que estou
criando meu skin para o personas, assim que eu tiver meu firefox personalizado posto aqui como eu
fiz... Enquanto isso ele está disponível apenas na partição windows(...e tambem é o
gnome...)</assunto-especial-nada-importante>

Mas o que exatamente esse bando de tag faz? Vamos passo a passo de baixo para cima (lembrando
que a ordem dos fatores não altera o resultado):

<security-role>

<role-name>membro</role-name>

</security-role>

<security-role>

<role-name>admin</role-name>

</security-role>

Define as regras de segurança, na prática as mesmas do arquivo tomcat-users.xml. Essas regras


seram utilizadas mais a frente.

<login-config>

<auth-method>BASIC</auth-method>

</login-config>
Essas tags descrevem como será feito o login quando um conteúdo retrito for acessado. São 4 tipos:

• BASIC. Como próprio nome já diz básico...Envia as informações codificadas com o base64.
• DIGEST. As informações são transferidas criptografadas com algoritimos pouco usados, o que
traz mais segurança - em tese.
• CLIENT-CERT. Utiliza certificados de chave pública, pouco utilizado na prática mas com
certeza o mais seguro.
• FORM. Permite você utilizar seu próprio formulário html. Não é preciso dizer que este é
menos seguro uma vez que os dados passam através de um método post via http. Mas é o
mais utilizado.

<opiniao-desnecessaria>Muita gente deve pensar como eu: "é apenas uma tela de login, não
importa que ela seja feia desde que ela seja segura...", mas o mundo é regido pela
aparência, por isso não espere que as pessoas simplesmente ignorem o fato de seu login
aparecer fora do browser...</opiniao-desnecessaria>
<security-constraint>

<web-resource-collection>

<web-resource-name>Restrito</web-resource-name>

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

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

<http-method> DELETE </http-method>

<http-method> GET </http-method>

<http-method> POST </http-method>

<http-method> PUT </http-method>

</web-resource-collection>

<auth-constraint>

<role-name>membro</role-name>

<role-name>admin</role-name>

</auth-constraint>

</security-constraint>

a tag security-contraint pode ser associada a uma espécie de "contrato" de segurança que
específica o que pode ser acessado (<web-resource-collection>) e quem pode acessar
(<auth-constraint>). Dentra da tag <web-resource-collection> especificamos o conteúdo
através de padrões, como no exemplo acima todas as extensões jpg e todos os arquivos na
pasta "/files", outro detalhe importante é em que métodos http será valida esse "contrato" de
segurança.
Utilizando um formulário html como login

Para utilizarmos um html como formulário de login, precisamos apenas de duas ou três coisa:
um html com o formulário, uma página de erro caso o usuário não esteja cadastrado ou a
senha seja inválida(que pode ser feito na mesma página) e configurar a tag <login-config>.
<form method="POST" action="j_security_check">

<fieldset>

<legend>Login</legend>

<label for="j_username">Usuário:</label>

<input type="text" name="j_username"/>

<label for="j_password">Senha:</label>

<input type="password" name="j_password"/>

<input type="submit" value="entrar"/>

</fieldset>

</form>

Ignorando o html vamos ao ponto importante. A action definida como j_security_check é do


container por isso você não precisa se preocupar em receber essas informações basta você
colocar os nomes corretamente da action e dos inputs, que são: j_username para nome e
j_password para senha.

Altere a tag do arquivo web.xml seguindo o modelo abaixo.


<login-config>

<auth-method>FORM</auth-method>

<form-login-config>

<form-login-page>/login.html</form-login-page>

<form-error-page>/erroLogin.html</form-error-page>

</form-login-config>

</login-config>

Foi acrescentado a configuração do login configurando onde será a página html que contem o
formulário e a página de erro caso o usuário seja inválido ou a senha esteja errada.

Utilizando JDBCRealm

Você deve estar se perguntando: "ate ai beleza, mas como eu faço para utilizar os usuário do
meu banco de dados?". Para isso basta fazer duas alterações:
• Esqueça o tomcat-users. Ele não servirá para mais nada, se quiser pode até deleta-lo.
• reconfigurar o "server.xml".

Configurando o <Realm>, vamos modificar o Realm quer criamos no começo da seguinte maneira:

<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"

driverName="org.gjt.mm.mysql.Driver"

connectionURL="jdbc:mysql://localhost/database?
user=usuario_db&password=password_db"

userTable="tabela_usuarios" userNameCol="nome_usuario"
userCredCol="senha_usuario"

userRoleTable="table_regras_usuarios" roleNameCol="regra_usuario"/>

Esta configuração é baseada em um banco da seguinte Maneira:


Tabelas:

tabela_usuarios:

• nome_usuario
• senha_usuario

tabela_regras_usuarios:

• nome_usuario
• regra_usuario

Palavras finais

Utilizar um container significa não ter de programar do zero uma aplicação, contudo ainda assim
existem muitas rotinas que ainda necessitam de implementação. Caso você necessite de maior
flexibilidade e segurança é recomendável utilizar o JAAS.

Referências

http://tomcat.apache.org
Head First - Servlets & JSPs by Brian Basham, Kathy Sierra & Bert Bates

También podría gustarte