1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Atualização de permissões Spring Security em tempo de execução

Bom dia pessoal, estou utilizando o Spring Security 3.0 e me deparei com a situação que ele não atualiza as permissões do usuário em tempo de execução apenas no proximo login, pois a query que ele executa para verificar é feita apenas no login no sistema. Em algumas pesquisas encontrei pessoas com o mesmo problema, mas não consegui chegar em resultados muito conclusivos. Segue abaixo meu arquivo applicationContext-security.xml:

<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="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.0.xsd">
    <http>
        <intercept-url pattern="/admin/**" access="ROLE_ADMINISTRADOR" />
        <intercept-url pattern="/restrito/**" access="ROLE_USUARIO" />
        <intercept-url pattern="/corretor/**" access="ROLE_CORRETOR" />
        <form-login login-page="/publico/login.jsf"
            always-use-default-target="true" default-target-url="/restrito/principal.jsf"
            authentication-failure-url="/publico/login.jsf?login_error=1" />
        <logout />
        <remember-me />
    </http>

    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="mainDataSource"
                authorities-by-username-query="SELECT u.login, p.permissao 
                                             FROM usuario u, usuario_permissao p 
                                            WHERE u.codigo = p.usuario 
                                              AND u.login = ?"
                users-by-username-query="SELECT login, senha, ativo 
                                       FROM usuario 
                                      WHERE login = ?" />
        </authentication-provider>
    </authentication-manager>
</b:beans>

Eu já possuo uma classe chamada ContextoBean que é responsavel por pegar o usuário logado para realizar as operações que em que ele é necessário, segue:

package br.com.xbt.imoveis.bean;

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import br.com.xbt.imoveis.model.Empresa;
import br.com.xbt.imoveis.model.Usuario;
import br.com.xbt.imoveis.rn.UsuarioRN;

@ManagedBean(name = "contextoBean")
@SessionScoped
public class ContextoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Usuario usuarioLogado = null;
    private List<Locale> idiomas;

    public Empresa getEmpresa() {
        return getUsuarioLogado().getEmpresa();
    }

    public Usuario getUsuarioLogado() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext external = context.getExternalContext();
        String login = external.getRemoteUser();

        if (this.usuarioLogado == null
                || !login.equals(this.usuarioLogado.getLogin())) {

            if (login != null) {
                UsuarioRN usuarioRN = new UsuarioRN();
                this.usuarioLogado = usuarioRN.buscarPorLogin(login);

                Locale locale = new Locale("pt", "BR");
                context.getViewRoot().setLocale(locale);
            }
        }
        return usuarioLogado;
    }

    public List<Locale> getIdiomas() {
        FacesContext context = FacesContext.getCurrentInstance();
        Iterator<Locale> locales = context.getApplication()
                .getSupportedLocales();
        this.idiomas = new ArrayList<Locale>();
        while (locales.hasNext()) {
            this.idiomas.add(locales.next());
        }
        return idiomas;
    }

    public void setUsuarioLogado(Usuario usuario) {
        this.usuarioLogado = usuario;
    }

    public String caminhoAplicacao() {
        String caminho = FacesContext.getCurrentInstance().getExternalContext()
                .getRealPath(File.separator);
        return caminho;
    }

}

Se puderem me ajudar, agredeço!

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags spring spring-security java java-ee ou faça a sua própria pergunta.