Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
• 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>.
<tomcat-users>
<role rolename="membro"/>
<role rolename="admin"/>
</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>
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>
</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>
<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>
<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>
</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>
<label for="j_password">Senha:</label>
</fieldset>
</form>
<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:
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"/>
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