Introdução ao Spring security
O que é um Spring security?
•
Framework para autorização e autenticação em páginas web;
•
Vantagem
-> reutilização de código;
package modelo;
@Entity
public class Usuario implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String nome;
private String email;
@Column(unique=true)
private String login;
private String senha;
private String idioma;
private boolean ativo;
@Temporal(TemporalType.DATE)
private Date nascimento;
@ElementCollection
@JoinTable(name="usuario_permissao", uniqueConstraints = {
@UniqueConstraint(columnNames={"usuario","permissao"}) }, joinColumns = JoinColumn(name="usuario"))
@Column(name="permissao", length=50)
private Set<String> permissao = new HashSet<>();
public Usuario() { }
//gets sets equals hashCode e toString omitidos… }
Configuração do Spring Security
3
Configuração do Spring Security
4
DAO de usuário (backend)
package dao;
public class UsuarioDAO {
private EntityManager em;
public UsuarioDAO() {
this.em = JPAUtil.getEntityManager(); }
public void remover(Usuario usuario){
em.getTransaction().begin();
Usuario aux = em.find(Usuario.class, usuario.getId());
em.remove(aux);
em.flush();
em.getTransaction().commit(); }
public void salvar(Usuario usuario){
em.getTransaction().begin();
em.merge(usuario);
em.getTransaction().commit(); } //continua no próximo slide...
public Usuario buscarPorId(Long id){
return em.find(Usuario.class, id);
}
public Usuario buscarPorLogin(String login){
String hql = "select u from Usuario u "+
" where u.login = :login ";
return (Usuario)
em.createQuery(hql,Usuario.class) .setParameter("login", login) .getSingleResult();
}
public List<Usuario> buscarTodos(){
return
em.createQuery("from Usuario",Usuario.class).getResultList(); }
}
Configuração do Spring Security
5
Configuração do Spring Security
6
Service de usuário (backend)
package service;
public class UsuarioService {
private UsuarioDAO usuDAO;
public UsuarioService() {
usuDAO = new UsuarioDAO(); }
public void salvar(Usuario usuario) throws NegocioException{
if (usuario.getNome()==null &&
usuario.getNome().trim().isEmpty())
throw new NegocioException("Nome do usuario não informado.");
if (usuario.getId() == null || usuario.getId() == 0 )
usuario.getPermissao().add("USUARIO");//ROLE_
usuDAO.salvar(usuario); }
Configuração do Spring Security
7
Service de usuário (backend)
public void remover(Usuario usuario){
usuDAO.remover(usuario); }
public Usuario buscarPorId(Long id){
return usuDAO.buscarPorId(id);
}
public Usuario buscarPorLogin(String login){
return usuDAO.buscarPorLogin(login);
}
public List<Usuario> buscarTodos(){
return usuDAO.buscarTodos();
} }
Configuração do Spring Security
8
Managedbean de cadastro de usuário (backend)
package controle;
@ManagedBean @ViewScoped
public class CadastroUsuarioBean implements Serializable {
private UsuarioService usuService = new UsuarioService();
private Usuario usuSelecionado;
private Long idUsuario;
public CadastroUsuarioBean() { }
public Boolean isEditing() {
return (usuSelecionado.getId() == null ? false : true);
}
public Usuario getUsuSelecionado() {
return usuSelecionado;
}
public void setUsuSelecionado(Usuario usuSelecionado) {
this.usuSelecionado = usuSelecionado;
}
Configuração do Spring Security
9
Managedbean de cadastro de usuário (backend)
public Long getIdUsuario() {
return idUsuario;
}
public void setIdUsuario(Long idUsuario) {
this.idUsuario = idUsuario;
}
public void inicializar() {
if (idUsuario != null)
usuSelecionado = usuService.buscarPorId(idUsuario);
if (usuSelecionado == null)
usuSelecionado = new Usuario();
}
public void salvar() {
try {
// salva o usuricante do BD
usuService.salvar(usuSelecionado);
Mensagens.msgSimples("Usuario salvo com sucesso.");
usuSelecionado = new Usuario();
} catch (NegocioException e) {
Mensagens.msgErro("Erro ao salvar", e.getMessage());
} } }
Configuração do Spring Security
10
Managedbean da pesquisa de usuário (backend)
package controle;
@ManagedBean @ViewScoped
public class PesquisaUsuarioBean implements Serializable{
private UsuarioService usuService=new UsuarioService();
private List<Usuario> usuarios;
private Usuario usuSelecionado;
public PesquisaUsuarioBean() { }
public List<Usuario> getUsuarios() {return usuarios;}
public void setUsuarios(List<Usuario> usuarios) {this.usuarios = usuarios; }
public Usuario getUsuSelecionado() {return usuSelecionado;}
public void setUsuSelecionado(Usuario usuSelecionado) { this.usuSelecionado = usuSelecionado; }
public void inicializar(){
usuarios = usuService.buscarTodos(); }
public void remover(){
public void remover(){
usuService.remover(usuSelecionado); //remove do BD
usuarios.remove(usuSelecionado); //remove do ArrayList que o p:dataTable está vinculado
Mensagens.msgSimples("Usuario removido com sucesso."); }
public String ativar() {
if (usuSelecionado.isAtivo())
usuSelecionado.setAtivo(false);
else usuSelecionado.setAtivo(true);
try { usuService.salvar(usuSelecionado);
} catch (NegocioException e) {
e.printStackTrace();}
return null; }
public String atribuirPermissao(String permissao) {
Set<String> roles = usuSelecionado.getPermissao();
if (roles.contains(permissao))
roles.remove(permissao);
else roles.add(permissao);
try { usuService.salvar(usuSelecionado);
} catch (NegocioException e) {
e.printStackTrace();}
return null; }
}
Configuração do Spring Security
11
Configuração do Spring Security
12
cadastro de usuário (frontend)
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:o="http://omnifaces.org/ui" template="/WEB-INF/templates/Layout.xhtml">
<ui:define name="titulo">
Usuários do sistema
</ui:define>
<ui:define name="conteudo">
<f:metadata>
<o:viewParam name="id" value="#{cadastroUsuarioBean.idUsuario}" />
<f:viewAction action="#{cadastroUsuarioBean.inicializar()}"/>
</f:metadata>
<h:form id="id-form">
<br/>
<p:messages id="id-messages" autoUpdate="true" closable="true" />
<p:toolbar>
<p:toolbarGroup>
<p:commandButton value="Salvar" action="#{cadastroUsuarioBean.salvar}"
update="@form"/>
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Pesquisa" outcome="/usuario/pesquisaUsuario.xhtml" />
</p:toolbarGroup> </p:toolbar>
<h1>#{cadastroUsuarioBean.isEditing() ?
'Edição de usuario' : 'Novo usuario'} </h1>
Configuração do Spring Security
13
cadastro de usuário (frontend)
<p:panelGrid columns="2">
<p:outputLabel for="id-codigo" value="Código" />
<p:inputText id="id-codigo" value="#{cadastroUsuarioBean.usuSelecionado.id}"
readonly="true" disabled="true"/>
<p:outputLabel for="id-nome" value="Nome" />
<p:inputText id="id-nome" value="#{cadastroUsuarioBean.usuSelecionado.nome}"
required="true" requiredMessage="Informe o nome do usuario."/>
<p:outputLabel for="id-email" value="Email" />
<p:inputText id="id-email" value="#{cadastroUsuarioBean.usuSelecionado.email}"
required="true" requiredMessage="Informe o email do usuario."
validatorMessage="E-mail inválido">
<f:validateRegex pattern="[a-zA-Z0-9\-\_\.]+@[a-zA-Z0-9\-\_\.]+"/>
</p:inputText>
<p:outputLabel for="id-login" value="Login" />
<p:inputText id="id-login" value="#{cadastroUsuarioBean.usuSelecionado.login}"
required="true" requiredMessage="Informe o login do usuario."/>
<p:outputLabel value="Senha" for="senha" />
<p:password id="senha" required="true" value="#{cadastroUsuarioBean.usuSelecionado.senha}"
feedback="true" weakLabel="Fraca" goodLabel="Boa"
strongLabel="Forte" promptLabel=" Informe uma senha"
inline="true" match=" confirmacaoSenha" />
<p:outputLabel value="Confirme a senha" for="confirmacaoSenha" />
<p:password id="confirmacaoSenha" required="true" />
<p:outputLabel value="Data de nascimento" for="dataNascimento" />
<p:calendar id="dataNascimento" required="true"
value="#{cadastroUsuarioBean.usuSelecionado.nascimento}"
Configuração do Spring Security
14
cadastro de usuário (frontend)
<p:outputLabel value="Idioma" for="idioma" />
<p:selectOneMenu id="idioma"
value="#{cadastroUsuarioBean.usuSelecionado.idioma}">
<f:selectItem itemValue="pt_BR" itemLabel="Português" />
<f:selectItem itemValue="en_US" itemLabel="English" />
<f:selectItem itemValue="es_ES" itemLabel="Espanol" />
</p:selectOneMenu>
</p:panelGrid>
</h:form>
</ui:define> </ui:composition>
Configuração do Spring Security
15
pesquisa de usuário (frontend)
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:o="http://omnifaces.org/ui" template="/WEB-INF/templates/Layout.xhtml">
<ui:define name="titulo">
Manutenção de usuários do sistema
</ui:define>
<ui:define name="conteudo">
<f:metadata>
<f:viewAction action="#{pesquisaUsuarioBean.inicializar}"/>
</f:metadata>
<h1 class="if-page-title">Pesquisa de usuário</h1>
<h:form id="id-form">
<p:messages id="id-messages" autoUpdate="true" closable="true" />
<p:toolbar>
<p:toolbarGroup>
<p:button value="Novo" outcome="/usuario/cadastroUsuario.xhtml" />
</p:toolbarGroup> </p:toolbar> <p:dataTable id="id-usuarioTable" value="#{pesquisaUsuarioBean.usuarios}" var="usu" rows="20" paginator="true" paginatorAlwaysVisible="false"
emptyMessage="Nenhum usuario cadastrado."
Configuração do Spring Security
16
pesquisa de usuário (frontend)
<p:column headerText="" style="text-align:center; width: 40px">
<p:commandLink action="#{pesquisaUsuarioBean.ativar}"
process="@this"
update="@this">
<p:graphicImage library="ifmg"
name="/images/usuario_ativo_#{usu.ativo}.png"/>
<f:setPropertyActionListener value="#{usu}"
target="#{pesquisaUsuarioBean.usuSelecionado}"/>
</p:commandLink> </p:column>
<p:column headerText="Código" style="text-align:right; width: 100px">
<h:outputLabel value="#{usu.id}" />
</p:column>
<p:column headerText="Nome do Usuario">
<h:outputLabel value="#{usu.nome}" />
</p:column>
<p:column headerText="Idioma" style="text-align:center; width: 80px">
<p:graphicImage library="ifmg"
name="/images/bandeira_#{usu.idioma}.png"/>
</p:column>
<p:column headerText="Email">
<h:outputLabel value="#{usu.email}" />
</p:column>
<p:column headerText="Permissões"
Configuração do Spring Security
17
pesquisa de usuário (frontend)
<p:commandLink action="#{pesquisaUsuarioBean.atribuirPermissao('ADMINISTRADOR')}"
process="@this"
update="@this"
title="Usuário Administrador">
<p:graphicImage library="ifmg"
name="/images/ROLE_ADMINISTRADOR_#{usu.permissao.contains('ADMINISTRADOR')}.png"/>
<f:setPropertyActionListener value="#{usu}"
target="#{pesquisaUsuarioBean.usuSelecionado}"/>
</p:commandLink>
<p:commandLink action="#{pesquisaUsuarioBean.atribuirPermissao('VIP')}"
process="@this"
update="@this"
title="Usuário VIp">
<p:graphicImage library="ifmg"
name="/images/ROLE_USUARIO_VIP_#{usu.permissao.contains('VIP')}.png"/>
<f:setPropertyActionListener value="#{usu}"
target="#{pesquisaUsuarioBean.usuSelecionado}"/>
</p:commandLink> </p:column>
<p:column style="text-align:center; width: 80px">
<p:button icon="ui-icon-pencil"
title="Editar"
outcome="cadastroUsuario">
<f:param name="id" value="#{usu.id}" />
</p:button> </p:column>
Configuração do Spring Security
18
pesquisa de usuário (frontend)
<p:column style="text-align:center; width: 80px">
<p:commandButton icon="ui-icon-trash"
title="Excluir"
process="@this"
update="id-usuarioTable"
oncomplete="PF('confirmacaoExclusao').show();">
<f:setPropertyActionListener value="#{usu}"
target="#{pesquisaUsuarioBean.usuSelecionado}"/> </p:commandButton> </p:column> </p:dataTable> <p:confirmDialog id="id-confirmaExclusaoDialog" widgetVar="confirmacaoExclusao"
message="Tem certeza de deseja excluir o usuário #{pesquisaUsuarioBean.usuSelecionado.nome}?"
header="Exclusão de usuario"
showEffect="fade">
<p:button value="Não" onclick="PF('confirmacaoExclusao').hide(); return false;" />
<p:commandButton value="Sim"
update="id-usuarioTable" oncomplete="PF('confirmacaoExclusao').hide();" action="#{pesquisaUsuarioBean.remover}"/> </p:confirmDialog> </h:form> </ui:define> </ui:composition>
Configuração do Spring Security
19
•
Insira as dependências do projeto no pom.xml:
Passo um
<!-- Spring Security (autenticação e autorização) --> <dependency>
<groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.1.4.RELEASE</version>
</dependency>
<!-- Commons Logging (abstrai a implementação de logging) --> <dependency>
<groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version>
<scope>compile</scope> </dependency>
<!-- API de Servlet --> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <version>3.0.1</version>
<scope>provided</scope> </dependency>
Configuração do Spring Security
20
•
Insira dois listenners no início do web.xml:
<
listener
>
<
listener-class
>
org.springframework.web.context.ContextLoaderListener
</
listener-class
>
</
listener
>
<
listener
>
<
listener-class
>
org.springframework.security.web.session.HttpSessionEventPublisher
</
listener-class
>
</
listener
>
Passo dois
Configuração do Spring Security
21
•
Insira um filter no final do web.xml:
Passo três
<
filter
>
<
filter-name
>
springSecurityFilterChain
</
filter-name
>
<
filter-class
>
org.springframework.web.filter.DelegatingFilterProxy
</
filter-class
>
</
filter
>
<
filter-mapping
>
<
filter-name
>
springSecurityFilterChain
</
filter-name
>
<
url-pattern
>
/*
</
url-pattern
>
<
dispatcher
>
FORWARD
</
dispatcher
>
<
dispatcher
>
REQUEST
</
dispatcher
>
</
filter-mapping
>
Configuração do Spring Security
22
•
Crie e configure o arquivo applicationContext.xml:
Passo quatro
<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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <http auto-config="true"><intercept-url pattern="/**" access="ROLE_ADMINISTRADORES" /> </http>
<authentication-manager>
<authentication-provider> <user-service>
<user name="joao" password="joao" authorities="ROLE_VIP" />
<user name="manoel" password="manoel" authorities="ROLE_ADMINISTRADORES" />
</user-service> </authentication-provider> </authentication-manager>
Configuração do Spring Security
23
•
Crie o link para logout em algum lugar do sistema:
Passo cinco
<
li
>
<
h:outputLink
valeu
=
"/web01/j_spring_security_logout"
>
<
i
class
=
"fa
fa-fw
fa-adn"
></
i
>
Sair
</
h:outputLink
>
</
li
>
Url padrão do spring para fazer logout com o nome da aplicação.
Nesse caso, foi criado um item do menu na página
<http pattern="/javax.faces.resource/**" security="none" /> <http auto-config="true" use-expressions="true">
<intercept-url pattern="/index.xhtml" access="isAuthenticated()" />
<intercept-url pattern="/modelo/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/fabricante/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/usuario/**" access="hasAnyRole('ADMINISTRADOR')" />
<intercept-url pattern="/**" access="denyAll" /> </http>
<authentication-manager>
<authentication-provider> <user-service>
<user name="joao" password="joao" authorities="VIP" />
<user name="manoel" password="manoel" authorities="ADMINISTRADOR" />
</user-service> </authentication-provider> </authentication-manager>
Configuração do Spring Security
24
•
Configurando a tag <http> no arquivo de configuração do spring:
Passo seis
Libera tudo da pasta ‘resource’
Libera ou nega acesso de acordo com os papéis do usuário
Podemos tirar a palavra ROLE qdo usamos expressões Habilitei expressões
package security;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; public class UsuarioSistema extends User{
private static final long serialVersionUID = 1L;
private Usuario usuario;
public UsuarioSistema(Usuario usuario, Collection<? extends GrantedAuthority> authorities) { super(usuario.getEmail(), usuario.getSenha(), authorities);
this.usuario = usuario; }
public Usuario getUsuario() { return usuario;
} }
Configuração do Spring Security
25
•
Criando uma classe para representar o usuário do spring security
Acessando a base de dados
Configuração do Spring Security
26
•
Criando a classe que o spring security usará para validar o usuário
Acessando a base de dados
Essa classe será instanciada pelo próprio Spring para
validar o usuário. package security; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import modelo.Usuario; import service.UsuarioService;
public class AppUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {
UsuarioService usuarios = new UsuarioService(); Usuario usuario = usuarios.buscarPorLogin(login); UsuarioSistema user = null;
if (usuario != null) {
user = new UsuarioSistema(usuario, getGrupos(usuario)); }
return user;
}
private Collection<? extends GrantedAuthority> getGrupos(Usuario usuario) {
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for (String grupo : usuario.getPermissao()) {
authorities.add(new SimpleGrantedAuthority(grupo.toUpperCase())); }
return authorities;
} }
Configuração do Spring Security
27
Configuração do Spring Security
28
Acessando o usuário logado
package security; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.context.FacesContext; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @ManagedBean @RequestScoped
public class Seguranca {
public String getNomeUsuario() {
String nome = null;
UsuarioSistema usuarioLogado = getUsuarioLogado();
if (usuarioLogado != null) {
nome = usuarioLogado.getUsuario().getNome(); }
return nome;
Configuração do Spring Security
29
Acessando o usuário logado
private UsuarioSistema getUsuarioLogado() {
UsuarioSistema usuario = null;
UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
if (auth != null && auth.getPrincipal() != null) {
usuario = (UsuarioSistema) auth.getPrincipal(); }
return usuario;
} }
<div style="float: left; line-height: 50px; margin-right: 80px"> Olá #{seguranca.nomeUsuario}!
</div>
Insira o html abaixo no layout da página.
<http pattern="/login.xhtml" security="none" /> <http pattern="/erro.xhtml" security="none" />
<http pattern="/javax.faces.resource/**" security="none" />
<http auto-config="false" use-expressions="true">
<intercept-url pattern="/index.xhtml" access="isAuthenticated()" />
<intercept-url pattern="/modelo/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/fabricante/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/acessorio/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/usuario/**" access="hasAnyRole('ADMINISTRADOR')" />
<intercept-url pattern="/automovel/**" access="hasAnyRole('ADMINISTRADOR', 'VIP')" /> <intercept-url pattern="/**" access="denyAll" />
<form-login login-page="/login.xhtml" authentication-failure-url="/login.xhtml?invalid=true"
default-target-url="/" always-use-default-target="true" /> <logout logout-url="/j_spring_security_logout" invalidate-session="true" /> </http>
Configuração do Spring Security
30
Personalizando a página de login
•
Precisamos modificar novamente o arquivo de configuração do spring
Não será automático mais Informei as páginas de login e erro do sistema
Não iremos aplicar segurança nas páginas de
Configuração do Spring Security
31
Personalizando a página de erro
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:o="http://omnifaces.org/ui" template="/WEB-INF/templates/LayoutExterno.xhtml"><ui:define name="titulo">
Sistema de locação de veículos
</ui:define>
<ui:define name="conteudo">
<br/>
<h1>Erro ao processar a requisição.</h1> <h:link outcome="index">
<i class="fa fa-fw fa-repeat"></i> Voltar
</h:link> </ui:define> </ui:composition>
Configuração do Spring Security
32
Personalizando a página de login
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:o="http://omnifaces.org/ui" template="/WEB-INF/templates/LayoutExterno.xhtml"><ui:define name="titulo">
Sistema de locação de automóveis - Login
</ui:define>
<ui:define name="conteudo">
<f:metadata>
<f:viewParam name="dummy" />
<f:event listener="#{loginBean.preRender}" type="preRenderView" />
</f:metadata>
<div id="login-dialog">
<h1>Login</h1>
<h:form id="frm" prependId="false">
<p:messages id="messages" autoUpdate="true" closable="true" /> <!-- Continua no próximo slide -->
Configuração do Spring Security
33
Personalizando a página de login
<h:panelGrid columns="2" styleClass="grid-login">
<p:outputLabel value="Login" />
<p:inputText size="30" id="j_username" value="#{loginBean.login}" />
<p:outputLabel value="Senha" />
<p:password size="30" id="j_password" />
<h:panelGroup/>
<p:commandButton value="Login" action="#{loginBean.login}" ajax="false" />
</h:panelGrid> </h:form> </div>
</ui:define></ui:composition>
Configuração do Spring Security
34
Criando o Managedbean de login
package controle; import java.io.IOException; import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import util.Mensagens; @ManagedBean @SessionScoped
public class LoginBean {
private static final long serialVersionUID = 1L;
private FacesContext facesContext;
private ExternalContext externalContext;
private HttpServletRequest request;
private HttpServletResponse response;
Configuração do Spring Security
35
Criando o Managedbean de login
public LoginBean() {
facesContext = FacesContext.getCurrentInstance();
externalContext = facesContext.getExternalContext();
request = (HttpServletRequest) externalContext.getRequest();
response = (HttpServletResponse) externalContext.getResponse(); }
public void preRender() {
if ("true".equals(request.getParameter("invalid"))) {
Mensagens.msgErro("Login inválido", "Usuário ou senha inválido!"); }
}
public void login() throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check");
dispatcher.forward(request, response);
facesContext.responseComplete(); }
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
} }
Configuração do Spring Security
36
Protegendo componentes
public boolean isPermitidoSalvarFabricante(){
ExternalContext externalContext =
FacesContext.getCurrentInstance().getExternalContext();
return externalContext.isUserInRole("ADMINISTRADOR");
}
Segurança.java
<p:toolbarGroup>
<p:commandButton value="Salvar"
action="#{cadastroFabricanteBean.salvar}"
update="@form"
disabled="#{(not seguranca.permitidoSalvarFabricante)}"/> </p:toolbarGroup>