Este post faz parte de uma série sobre Spring, JPA e JSF. Caso algum
assunto abordado aqui não esteja claro, consulte este link: Spring + JPA.
A utilização do Spring Security é bastante tranquila. Já uso em vários projetos e posso autenticar tanto por meio de um banco de dados, quanto por meio de uma base LDAP.
A utilização do Spring Security é bastante tranquila. Já uso em vários projetos e posso autenticar tanto por meio de um banco de dados, quanto por meio de uma base LDAP.
Vou mostrar com mais detalhes a autenticação por meio de um banco de dados. Vamos assumir que as tabelas com os usuários e as regras de acesso estão no mesmo banco de dados que será utilizado pelo sistema, e referenciado pelo identificador "fonteDeDados" que já apareceu em vários arquivos dos outros posts.
O arquivo security-config.xml é o último arquivo de configuração do Spring que vamos abordar, veja o código abaixo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<http use-expressions="true">
<intercept-url pattern="/web/index.xhtml" access="isAuthenticated()" />
<intercept-url pattern="/web/resources/**" access="permitAll" />
<intercept-url pattern="/web/acessoNegado.xhtml" access="permitAll" />
<intercept-url pattern="/web/login.xhtml" access="permitAll" />
<intercept-url pattern="/web/ajaxDialog.xhtml" access="permitAll" />
<intercept-url pattern="/web/resources/imagens/ajaxloading.gif" access="permitAll" />
<intercept-url pattern="/web/menu.xhtml" access="isAuthenticated()" />
<access-denied-handler error-page="/web/acessoNegado.xhtml" />
<form-login login-page="/web/login.xhtml"
authentication-failure-url="/web/login.xhtml?login_error=1"/>
<logout logout-success-url="/web/index.xhtml" />
</http>
<authentication-manager>
<authentication-provider>
<!--password-encoder hash="md5"/-->
<jdbc-user-service data-source-ref="fonteDeDados"/>
</authentication-provider>
</authentication-manager>
</beans:beans>
O código mais relevante do arquivo é o trecho entre as linhas 26 e 31. Percebemos aqui a presença do identificador "fonteDeDados", e depois da configuração do banco de dados que será utilizado pelo sistema, criamos neste mesmo banco as tabelas para os usuários e regras de autorização.
Caso seja necessária a utilização de criptografia, podemos descomentar a linha 28, mas as senhas deverão ser armazenadas já criptografadas no banco de dados. Para o exemplo, vamos armazenar as senhas em claro.
O trecho entre as linhas 20 e 23 determina quais os arquivos responsáveis pelo controle da autenticação. Podemos perceber claramente que devem ser criados os arquivos acessoNegado.xhtml e login.xhtml.
As linhas iniciadas por "intercept-url" determinam como vai ser autorizado o acesso a uma página ou a uma pasta. Podemos perceber que algumas páginas estão autorizadas se for satisfeita a condição isAuthenticated(), e outras podem ser acessadas mesmo sem autenticação. Voltaremos a este assunto mais tarde, quando precisarmos restringir um conjunto de páginas administrativas, por exemplo. Caso o leitor precise de mais detalhes, a literatura sobre o Spring é muito ampla, um exemplo está neste link: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/springsecurity-single.html
Uma grande vantagem da utilização do Spring para autenticação e autorização é que para deixar de utilizar um banco de dados e passar a utilizar uma base LDAP, precisamos modificar somente o trecho entre as linhas 26 e 31. Segue um exemplo:
<ldap-server id="ldapServer" url="ldap://xxx.xxx.xxx.xxx:389" />
<authentication-manager>
<!-- Trecho para autenticacao via ldap -->
<ldap-authentication-provider
user-search-base="ou=People,dc=meudominio,dc=com,dc=br"
group-search-base="ou=Groups,dc=meudominio,dc=com,dc=br">
</ldap-authentication-provider>
</authentication-manager>
Percebemos claramente a facilidade desta mudança. Apenas precisamos do IP do servidor LDAP e o restante da configuração continua o mesmo. Vamos encerrar mostrando o código dos arquivos acessoNegado.xhtml e login.xhtml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- acessoNegado.xhtml -->
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<body>
<div align="center">
<h:panelGroup>
<span style="color:red">Acesso negado.</span>
< br/>
< br/>
<h:outputText value="Motivo: #{SPRING_SECURITY_LAST_EXCEPTION.message}" rendered="#{!SPRING_SECURITY_LAST_EXCEPTION.message==''}" />
</h:panelGroup>
<form id="login" method="post" action="#{facesContext.externalContext.request.contextPath}/web/index.xhtml">
<h:commandButton type="submit" value="Voltar à página inicial"/>
</form>
</div>
</body>
</html>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- login.xhtml -->
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<body>
<div align="center">
<p:fieldset style="width:300px" >
<h:panelGroup rendered="#{!empty param.login_error}">
<span style="color:red">Erro na autenticação.</span>
< br/>
< br/>
<h:outputText value="Confira o nome do usuário e a senha." />
</h:panelGroup>
<h1><h:outputText value="Autenticação" style="text-decoration: underline" /></h1>
<form id="login" method="post" action="${request.contextPath}/j_spring_security_check">
<h:panelGrid columns="2">
<h:outputText value="Usuário: " />
<p:inputText id="j_username" />
<h:outputText value="Senha: " />
<p:password id="j_password" />
</h:panelGrid>
< br/>
<p:commandButton onclick="submit()" type="submit" value="Autenticar" global="false" />
<script>
document.getElementById("login").j_username.value = "#{SPRING_SECURITY_LAST_USERNAME}";
</script>
</form>
</p:fieldset>
</div>
</body>
</html>
Não há muito o que comentar quanto aos arquivos acima. Apenas as linhas 17, 20 e 22 do login.xhtml, que contêm identificadores que são esperados pelas classes de autenticação, e não devem ser modificados.
Uma última consideração quanto ao método de autenticação: se o login falhar, o arquivo login.xhtml é chamado novamente, com um parâmetro para indicar que houve erro (authentication-failure-url="/web/login.xhtml?login_error=1").
Para criar os usuários e as regras no banco de dados, podemos criar as tabelas com o sql a seguir:
create table users(
username varchar(50) not null primary key,
password varchar(50) not null,
enabled boolean not null);
create table authorities (
username varchar(50) not null,
authority varchar(50) not null,
constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);
Em seguida, basta inserir um usuário, senha, colocar verdadeiro no campo enabled e inserir uma regra, por exemplo, "admin".
No próximo post, a configuração da fonte de dados e do Jboss.
Nenhum comentário:
Postar um comentário