Spring Security + VRaptor
Aplicações web, assim como qualquer aplicação que trabalhe com dados privados, necessitam de áreas privadas para que apenas usuários autorizados tenham acesso a esses dados. Para obter essa restrição em aplicações que rodam em servidores na internet, existem várias formas e hoje iremos demonstrar como implementar isso utilizando o Spring Security.
Essa ferramenta é mantida pela SpringSource, que também é responsável pelo framework web Spring. Nesse artigo, iremos demonstrar como incorporar essa solução em um projeto WEB juntamente com o framework VRaptor. Vale lembrar que esse tutorial demonstra apenas uma configuração básica de como utilizar essa ferramenta. Caso ele não se encaixe bem nas suas necessidades ou você tenha interesse em se aprofundar no assunto, recomendo que passe no site da SpringSource e estude de forma mais aprofundada os recursos do Spring Security.
Base de dados
A base de dados é bem simples, contendo apenas duas tabelas. A tabela regra(rule) armazena os “tipos” de acesso que serão interpretados pelo Spring Security. Nesse que estamos demonstrando, cada usuário terá apenas uma regra, mas nada impede de você adaptar a base e a configuração do projeto para que os usuários tenham múltiplas regras.
Projeto WEB
Abaixo segue a estrutura do projeto WEB que irá utilizar VRaptor e Spring Security.
Bibliotecas Spring Security
Na imagem acima, estão destacados apenas os arquivos necessários à implementação do Spring Security. Alguns são comuns ao VRaptor também, mas mesmo esses estão destacados por causa da versão utilizada. Os demais arquivos não destacados são a biblioteca padrão para projetos VRaptor.
Configuração web.xml
No arquivo web.xml, temos que adicionar um listener e um filter para que o Spring Security intercepte as requisições feitas. Note que, na ordem de declarações, os dados do Spring Security vêm antes do VRaptor. Essa ordem é muito importante, pois se for invertida, o filtro do VRaptor irá interceptar primeiro as requisições e irá concluí-las sem que sejam validadas pelas regras do Spring Security.
Código:
$lt;?xml version="1.0" encoding="UTF-8"?$gt; $lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"$gt; $lt;display-name$gt;Aplicação Exemplo Spring Security$lt;/display-name$gt; $lt;listener$gt; $lt;listener-class$gt;org.springframework.web.context.ContextLoaderListener$lt;/listener-class$gt; $lt;/listener$gt; $lt;filter$gt; $lt;filter-name$gt;springSecurityFilterChain$lt;/filter-name$gt; $lt;filter-class$gt;org.springframework.web.filter.DelegatingFilterProxy$lt;/filter-class$gt; $lt;/filter$gt; $lt;filter-mapping$gt; $lt;filter-name$gt;springSecurityFilterChain$lt;/filter-name$gt; $lt;url-pattern$gt;/*$lt;/url-pattern$gt; $lt;/filter-mapping$gt; $lt;filter$gt; $lt;filter-name$gt;vraptor$lt;/filter-name$gt; $lt;filter-class$gt;br.com.caelum.vraptor.VRaptor$lt;/filter-class$gt; $lt;/filter$gt; $lt;filter-mapping$gt; $lt;filter-name$gt;vraptor$lt;/filter-name$gt; $lt;url-pattern$gt;/*$lt;/url-pattern$gt; $lt;dispatcher$gt;FORWARD$lt;/dispatcher$gt; $lt;dispatcher$gt;REQUEST$lt;/dispatcher$gt; $lt;/filter-mapping$gt; $lt;/web-app$gt;
Configuração Spring Security
Abaixo segue parte do arquivo applicationContext.xml. Ele é o responsável por configurar os parâmetros do Spring Security. O arquivo completo está disponível para download no final do post.
Basicamente o que este arquivo contém é uma tag responsável por interceptar as requisições http e aplicar as regras de validação conforme forem configuradas. Nesse caso, configuramos que o path “/” irá conter o formulário de login e também é de acesso livre. Já tudo que estiver a partir do path “/admin” irá ser filtrado e uma sessão autenticada com a rule ROLE_ADMIN será exigida.
Para iniciar essa sessão com o usuário, o formulário de login irá utilizar os parâmetros setados na tag para buscar os dados de usuário na base de dados e assim validar os dados informados. Ele fará isso através de duas queries SQL. A primeira busca o usuário e valida sua senha. Já a segunda busca as regras de acesso para o usuário em questão. Como você pode ver no XML, dentro da TAG adaptamos os comandos SQL para buscar os dados nas tabelas ‘usuario’ e ‘regra’, modificando os nomes das colunas para o padrão reconhecido pelo Spring Security.
Código:
$lt;http auto-config="true"$gt; $lt;form-login login-page="/" authentication-failure-url="/?error=invalido" default-target-url="/admin"/$gt; $lt;intercept-url pattern="/admin/**" access="ROLE_ADMIN" /$gt; $lt;/http$gt; $lt;authentication-manager$gt; $lt;authentication-provider$gt; $lt;password-encoder hash="md5" /$gt; $lt;jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT email as username, senha as password, 'true' as enable FROM usuario WHERE email = ?" authorities-by-username-query="SELECT u.email as username, r.nome as authority FROM usuario u, regra r WHERE u.regra_id = r.id AND email = ?"/$gt; $lt;/authentication-provider$gt; $lt;/authentication-manager$gt;
Nesse exemplo as senhas estão sendo encriptadas com MD5. Se você não quiser encriar a senha, basta mudar o hash para plaintext.
Classe para encriptar senhas usando MD5:
Código:
import org.springframework.security.authentication.encoding.Md5PasswordEncoder; import org.springframework.security.authentication.encoding.PasswordEncoder; public class EncriptarMD5 { public static String encriptar(String senha) { PasswordEncoder encoder = new Md5PasswordEncoder(); senha = encoder.encodePassword(senha, null); return senha; } }
Controllers Login e Admin
Para testarmos a segurança da área privada da aplicação, vamos precisar de uma área com acesso livre, que será a área de login, e uma área privada, que será chamada de admin.
Para a área liberada vamos criar o controller Login e a página index.jsp, a qual irá incorporar o formulário de login. Vale lembrar que esse controller não será o responsável pelo login, sua função é apenas redirecionar para a página que irá conter o formulário. O formulário irá disparar a requisição de login para o Spring Security, que validará os dados e se encarregará de encaminhar a requisição para a página adequada. Lembre-se de que o formulário da página index.jsp demonstrada abaixo deve conter o padrão de nomes conforme foi informado. O mesmo vale para a URL responsável pelo encerramento da sessão contida no arquivo /admin/index.jsp. O Spring Security só irá interpretar os dados se eles forem enviados dessa forma.
LoginController.java
Código:
import br.com.caelum.vraptor.Path; import br.com.caelum.vraptor.Resource; @Resourcepublic class LoginController { @Path("/") public void index() { } }
/login/index.jsp
Código:
$lt;!-- Bem lembrado pelo Lucas Cavalcanti. A verificação de msg de erro pode ser com $lt;c:if$gt;--$gt;$lt;c:if test="${param.error eq 'invalido'}"$gt; $lt;c:out value="Usuário e/ou senha inválido(s)"$gt; $lt;/c:if$gt; $lt;form name="f" action="$lt;c:url value="/j_spring_security_check"/$gt;" method="POST"$gt; $lt;table$gt; $lt;tr$gt; $lt;td$gt; $lt;c:out value="Usuário:"/$gt; $lt;/td$gt; $lt;td$gt; $lt;input type='text' name='j_username'/$gt; $lt;/td$gt; $lt;/tr$gt; $lt;tr$gt; $lt;td$gt; $lt;c:out value="Usuário:"/$gt; $lt;/td$gt; $lt;td$gt; $lt;input type='password' name='j_password'$gt; $lt;/td$gt; $lt;/tr$gt; $lt;tr$gt; $lt;td colspan='2'$gt; $lt;input name="submit" type="submit"$gt; $lt;/td$gt; $lt;/tr$gt; $lt;tr$gt; $lt;td colspan='2'$gt; $lt;input name="reset" type="reset"$gt; $lt;/td$gt; $lt;/tr$gt; $lt;/table$gt; $lt;/form$gt;
AdminController.java
Código:
import br.com.caelum.vraptor.Path; import br.com.caelum.vraptor.Resource; import java.security.Principal; import javax.servlet.http.HttpServletRequest; @Resourcepublic class AdminController { //Adicionamos o request no construtor para obter os dados do usuário logado private HttpServletRequest request; public AdminController(HttpServletRequest request) { this.request = request; } @Path("/admin") public void index() { Principal user = request.getUserPrincipal(); //Aqui o usuário logado é obtido System.out.println(user.getName()); // getName() retorna o e-mail do usuário } }
/admin/index.jsp
Código:
$lt;body$gt; $lt;c:out value="Painel Admin - Sessão iniciada"/$gt;$lt;br/$gt; $lt;a href="$lt;c:url value="/j_spring_security_logout"/$gt;"$gt;Logout$lt;/a$gt; $lt;/body$gt;
Spring Security and all wrapped item are rushed for the turns for the challenges. Margins of the placement and essaywriter.org are targeted for the goals. The team is piled for the next stature for the formation for the turf in always for the teams for all methods.
Xo สล็อตออนไลน์ โปรสล็อต XO เกมออนไลน์ทำเงินยอดฮิตเกมสล็อต xopg.net คือเกมทำเงิน reeffutures2018 ผ่านทางออนไลน์อย่างหนึ่ง ที่เล่นง่าย และได้เงินไว แถมยังลงทุนด้วยเงินน้อย mavoixtavoie ทำเงินได้ตลอดเวลา ซึ่งหลายคนอาจได้เคยเห็นรีวิวเรื่องของ สล็อต xo สล็อตออนไลน์ ไว้มากมาย เทคนิคสล็อต ทั้งเรื่องการเล่นแล้วได้เงิน herbalpertpresents และเล่น สล็อต แล้วไม่ได้เงิน นั่นเองค่ะ ซึ่งการที่คุณจะเล่นได้เงินหรือไม่ได้เงินนั้น essentialsforasoul ส่วนหนึ่งก็เป็นในเรื่องของดวงเข้ามาเกี่ยวด้วย northbristol เพราะสล็อตเป็นเกมออนไลน์เสี่ยงโชค ทดลองเล่น xo เกมหนึ่งซึ่งจะมีสูตร หรือเทคนิคเข้ามาช่วย gclub เพื่อโกงดวงอยู่เสมอซึ่งในเว็บของเรา สมัคร xo ก็มีมาแนะนำไว้ให้เห็นกันมากมายหลายสูตร