Segurança com Spring Security 3.0 utilizando banco de dados em apenas alguns minutos
Spring Security 3.0 com banco de dados
O banco de dados
O banco de dados utilizado será o MySQL. Você pode baixar a versão 5.1, utilizada no artigo,http://dev.mysql.com/downloads/mysql/.
Preparando o banco de dados do exemplo
Abra o terminal do MySQL com seu usuário e senha ROOT (aquela que você configurou na instalação).
Crie o banco de dados e a tabela executando os seguintes comandos:
Código:
create database security;
use security;
CREATE TABLE users
(
username VARCHAR(15) NOT NULL,
password VARCHAR(40),
authority VARCHAR(15),
PRIMARY KEY (username)
);
Insira um usuário assim:
Código:
INSERT INTO users VALUES(‘edson’,'integrator’,'ROLE_ADMIN’);
Baixando e descompactando o driver JDBC
Podemos baixar o MySQL clicando em http://www.mysql.com/ além da versão atual do driver JDBC, chamado de Connector/J 5.1. Baixe os arquivos, instale o MySQL, caso não o tenha em sua máquina e descompacte o arquivo JAR, do qual iremos precisar, que será:
mysql-connector-java-5.1.10-bin.jar
O projeto
O arquivo de configurações do Spring
No arquivo de configurações do Spring, altere como mostrado na Listagem 1 a seguir:
Listagem 1 – O arquivo applicationContext.xml
Código:
$lt;?xml version="1.0" encoding="UTF-8"?$gt;
$lt;beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd"$gt;
$lt;http auto-config="true" $gt;
$lt;form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=invalido"/$gt;
$lt;intercept-url pattern="/admin/**" access="ROLE_ADMIN" /$gt;
$lt;/http$gt;
$lt;authentication-manager$gt;
$lt;authentication-provider$gt;
$lt;jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT username, authority FROM users WHERE username=?"
/$gt;
$lt;/authentication-provider$gt;
$lt;/authentication-manager$gt;
$lt;beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" $gt;
$lt;beans:property name="url" value="jdbc:mysql://localhost:3306/security" /$gt;
$lt;beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /$gt;
$lt;beans:property name="username" value="root" /$gt;
$lt;beans:property name="password" value="integrator" /$gt;
$lt;/beans:bean$gt;
$lt;/beans:beans$gt;
A mudança feita no arquivo applicationContext.xml, visto na Listagem 1, com relação ao artigo anterior, está na forma como vamos acessar o usuário, senha e seu role. Alteramos o antigo elemento $lt;user-service /$gt; por $lt;jdbc-user-service /$gt;.
Em $lt;jdbc-user-service /$gt;, temos TRÊS atributos importantes: users-by-username-query e authorities-by-username-query e data-source-ref. O primeiro atributo possui uma query que deve buscar três informações: username, password e um valor booleano chamado enable. A tabela criada no banco de dados, vista na Figura 1, possui três campos (username, password e authority), mas não possui enable. Portanto, a query deve simular este campo, informando que todos os cadastrados na tabela estão habilitados:
SELECT username, password, ‘true’ as enable FROM users WHERE username=?
Observe também que há uma condição WHERE na cláusula SQL, para que o usuário seja filtrado no login e para que o Spring Security se encarregue do resto, analisando se o usuário transmitido e sua senha são similares ao existente no banco de dados.
Além de verificar se o usuário existe, o Spring Security precisa saber se ele possui autorização para acessar determinado local. O role, no caso, foi adicionado no terceiro campo da tabela users, chamado de authority. O atributo authorities-by-username-query, portanto, recebe uma query onde existe o usuário e seu role, sempre filtrando pelo usuário:
SELECT username, authority FROM users WHERE username=?
Atenção: A query utilizada para o spring security precisa retornar os seguintes nomes de colunas: username, password, enable e authority.
No atributo data-source-ref indicamos o data source necessário para se conectar ao banco de dados.
A conexão é feita pelo elemento $lt;beans/$gt; no qual a classe utilizada é a org.springframework.jdbc.datasource.DriverManagerDataSource, responsável por fazer a conexão com o banco de dados.
Logout, acesso negado e criptografia da senha
Depois de concluído o acesso à área restrita, temos que efetuar o logout quando não interessa mais estar naquela área.
Também precisamos definir o que será apresentado aos usuários cujo não possuem acesso a uma determinada área.
Logout
Para fazer o logout de uma área restrita, utilizamos o padrão para fazer isto é: /j_spring_security_logout. Sua utilização será no arquivo /admin/index.jsp, como por exemplo a adição de um link, como na Listagem 2.
Listagem 2 – Adição do link para efetuar logout da área restrita
Código:
$lt;html$gt;
...
$lt;body$gt;
$lt;h2$gt;Parabéns, você está logado!$lt;/h2$gt;
$lt;hr /$gt;
Faça logout $lt;a href="../j_spring_security_logout"$gt;clicando aqui$lt;/a$gt;.
$lt;/body$gt;
$lt;/html$gt;
Página com a mensagem de acesso negado
Caso tenhamos um usuário cadastrado válido, que não possui permissão de acesso a uma determinada área, vemos uma página padrão, como de costume, exibida pelo servidor.
Para modificar esta página, podemos criar uma página que será exibida em seu lugar, informando o usuário da falta de permissão de acesso.
Sua configuração depois será no elemento $lt;http /$gt;, do arquivo applicationContext.xml, com o atributo access-denied-page. Abaixo vemos a página negado.jsp como sendo a responsável por exibir uma mensagem personalizada caso o usuário entre em uma área não permitida.
Código:
$lt;http auto-config="true" access-denied-page="/negado.jsp"$gt;
...
$lt;/http$gt;
Criptografia de senha
O padrão para as senhas é de texto plano, como já sabem. Entretanto, o Spring Security permite ler informações criptografadas. Digamos que, na tabela de usuários, tenhamos as senhas criptografadas em MD5. Teríamos que informar isso nas configurações do Spring Security da seguinte forma:
Código:
$lt;authentication-manager$gt;
$lt;authentication-provider$gt;
$lt;password-encoder hash="md5" /$gt;
…
$lt;/authentication-provider$gt;
$lt;/authentication-manager$gt;
Nota: No MySQL podemos adicionar uma string em MD5 simplesmente utilizando a função de mesmo nome:
Código:
INSERT INTO users VALUES(‘usuario’, MD5(‘senha’),’ROLE_…’)
Xo สล็อตออนไลน์ โปรสล็อต XO เกมออนไลน์ทำเงินยอดฮิตเกมสล็อต xopg.net คือเกมทำเงิน reeffutures2018 ผ่านทางออนไลน์อย่างหนึ่ง ที่เล่นง่าย และได้เงินไว แถมยังลงทุนด้วยเงินน้อย mavoixtavoie ทำเงินได้ตลอดเวลา ซึ่งหลายคนอาจได้เคยเห็นรีวิวเรื่องของ สล็อต xo สล็อตออนไลน์ ไว้มากมาย เทคนิคสล็อต ทั้งเรื่องการเล่นแล้วได้เงิน herbalpertpresents และเล่น สล็อต แล้วไม่ได้เงิน นั่นเองค่ะ ซึ่งการที่คุณจะเล่นได้เงินหรือไม่ได้เงินนั้น essentialsforasoul ส่วนหนึ่งก็เป็นในเรื่องของดวงเข้ามาเกี่ยวด้วย northbristol เพราะสล็อตเป็นเกมออนไลน์เสี่ยงโชค ทดลองเล่น xo เกมหนึ่งซึ่งจะมีสูตร หรือเทคนิคเข้ามาช่วย gclub เพื่อโกงดวงอยู่เสมอซึ่งในเว็บของเรา สมัคร xo ก็มีมาแนะนำไว้ให้เห็นกันมากมายหลายสูตร