Jsf+viewScope

Pessoal estou com um probleminha que é o seguinte, tenho uma tree do primefaces que de acordo com o usuário selecionado na datatable ele tem que exibir as permissões que aquele usuário que foi selecionado na datatable tem permissão de acesso no sistema, o problema é que a primeira vez funciona sem problemas porem quando vou selecionar outro usuário esse outro usuario selecionado vem com as permissões do usuário anterior, gostaria de saber como faço para alterar um atributo quando selecionar outro usuário, estou usando o ViewScope, abaixo segue o código do meu bean:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.HibernateException;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.data.PageEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.DualListModel;
import org.primefaces.model.TreeNode;

@ManagedBean(name = "gerenciamentoUserMB")
@ViewScoped
public class GerenciamentoUserMB implements Serializable {

    private List<Usuario> usuarios;
    private DualListModel<Grupo> userGrupos;
    private Usuario usuario;
    private boolean btnEditar = true;
    private boolean btnVisualizar = true;
    private boolean btnExluir = true;
    private boolean isFechaTela;
    private TreeNode nodeRoot;
    private TreeNode[] selectedNodes;

    public GerenciamentoUserMB() {
        this.usuario = new Usuario();
    }

    public String salvar() {
        InterfaceUsuarioDao usuarioDao = new UsuarioDaoImp();
        InterfaceCadastroDao cadastroDao = new CadastroDaoImp();
        InterfaceGrupoDao grupoDao = new GrupoDaoImp();
        InterfaceTipoPermissaoDao tipoCadastroDao = new TipoPermissaoDaoImp();
        InterfacePermissaoDao permissaoDao = new PermissaoDaoImp();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        RequestContext contextRequest = RequestContext.getCurrentInstance();
        Properties properties = FacesContextUtil.getArquivoPropertiesConfAutLDAP();
        boolean isLoginLDAP = new LDAP(properties).isUsuarioValido(this.usuario.getLogin());
        this.usuario.setPermissoes(new HashSet<Permissao>());
        // Verificando se o login já existe na base de dados
        if (!usuarioDao.isLoginExiste(this.usuario.getLogin()) && isLoginLDAP) {
            try {
                for (Object grupo : this.userGrupos.getTarget()) {
                    this.usuario.getGrupos().add(grupoDao.buscaPorID((Long) grupo));
                }
                usuarioDao.salva(this.usuario);

                for (TreeNode treeNode : selectedNodes) {
                    if (treeNode.isLeaf()) {
                        Permissao permissao = new Permissao();
                        permissao.setCadastro(cadastroDao.buscaPorNome(treeNode.getParent()));
                        permissao.setTipoPermissao(tipoCadastroDao.buscaPorNome(treeNode.getData()));
                        permissao.setUsuario(usuarioDao.getUsuarioByLogin(this.usuario.getLogin()));
                        permissaoDao.salva(permissao);
                    }
                }

                facesContext.addMessage(null, new FacesMessage("O usuário " + this.usuario.getNome() + " foi cadastrado com sucesso.", null));
                contextRequest.update("formGerenciamentoUser:tableUsuarios");
                contextRequest.update("formGerenciamentoUser:growl");
                this.isFechaTela = true;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario = new Usuario();
            } catch (ErroSalvarDadosException ex) {
                System.out.println("Não foi possivel salvar o usuário: " + this.usuario.getNome() + " na base de dados. " + ex);
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi pssivel salvar o usuário " + this.usuario.getNome() + " na base de dados.", null));
                contextRequest.update("formCadUser:dialogCadUser");
                this.isFechaTela = false;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario.setLogin(null);
            } catch (HibernateException ex) {
                System.out.println("Não foi possivel salvar o usuário: " + this.usuario.getNome() + " na base de dados. " + ex);
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi pssivel salvar o usuário " + this.usuario.getNome() + " na base de dados.", null));
                contextRequest.update("formCadUser:dialogCadUser");
                this.isFechaTela = false;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario.setLogin(null);
            }

        } else {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O usuário com o login " + this.usuario.getLogin() + " já esta cadastrado no sistema ou não existe no AD", null));
            contextRequest.update("formCadUser:dialogCadUser");
            this.isFechaTela = false;
            contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
            this.usuario.setLogin(null);
        }

        return null;
    }

    public String editar() {
        InterfaceUsuarioDao usuarioDao = new UsuarioDaoImp();
        InterfaceCadastroDao cadastroDao = new CadastroDaoImp();
        InterfaceGrupoDao grupoDao = new GrupoDaoImp();
        InterfaceTipoPermissaoDao tipoCadastroDao = new TipoPermissaoDaoImp();
        InterfacePermissaoDao permissaoDao = new PermissaoDaoImp();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        RequestContext contextRequest = RequestContext.getCurrentInstance();
        Properties properties = FacesContextUtil.getArquivoPropertiesConfAutLDAP();
        boolean isLoginLDAP = new LDAP(properties).isUsuarioValido(this.usuario.getLogin());
        this.usuario.setPermissoes(new HashSet<Permissao>());
        // Verificando se o login já existe na base de dados
        if (!usuarioDao.isLoginExiste(this.usuario.getLogin()) && isLoginLDAP) {
            try {
                for (Object grupo : this.userGrupos.getTarget()) {
                    this.usuario.getGrupos().add(grupoDao.buscaPorID((Long) grupo));
                }
                usuarioDao.edita(this.usuario);

                for (TreeNode treeNode : selectedNodes) {
                    if (treeNode.isLeaf()) {
                        Permissao permissao = new Permissao();
                        permissao.setCadastro(cadastroDao.buscaPorNome(treeNode.getParent()));
                        permissao.setTipoPermissao(tipoCadastroDao.buscaPorNome(treeNode.getData()));
                        permissao.setUsuario(usuarioDao.getUsuarioByLogin(this.usuario.getLogin()));
                        permissaoDao.edita(permissao);
                    }
                }

                facesContext.addMessage(null, new FacesMessage("O usuário " + this.usuario.getNome() + " foi editado com sucesso.", null));
                contextRequest.update("formGerenciamentoUser:tableUsuarios");
                contextRequest.update("formGerenciamentoUser:growl");
                this.isFechaTela = true;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario = new Usuario();
            } catch (ErroEditarRegistroBaseDadosException ex) {
                System.out.println("Não foi possivel editar os dados do usuário: " + this.usuario.getNome() + " na base de dados. " + ex);
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi pssivel editar os dados do usuário " + this.usuario.getNome() + " na base de dados.", null));
                contextRequest.update("formEditUser:dialogEditUser");
                this.isFechaTela = false;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario.setLogin(null);
            } catch (HibernateException ex) {
                System.out.println("Não foi possivel editar os dados do usuário: " + this.usuario.getNome() + " na base de dados. " + ex);
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi pssivel salvar o usuário " + this.usuario.getNome() + " na base de dados.", null));
                contextRequest.update("formEditUser:dialogEditUser");
                this.isFechaTela = false;
                contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
                this.usuario.setLogin(null);
            }

        } else {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O usuário com o login " + this.usuario.getLogin() + " já esta cadastrado no sistema ou não existe no AD", null));
            contextRequest.update("formEditUser:dialogEditUser");
            this.isFechaTela = false;
            contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
            this.usuario.setLogin(null);
        }

        return null;
    }

    public String deletar(Long idUsuario) {
        InterfaceUsuarioDao usuarioDao = new UsuarioDaoImp();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        RequestContext contextRequest = RequestContext.getCurrentInstance();
        this.usuario = usuarioDao.buscaPorID(idUsuario);
        try {
            usuarioDao.exclui(this.usuario);
            facesContext.addMessage(null, new FacesMessage("O usuário " + this.usuario.getNome() + " foi excluido com sucesso.", null));
        } catch (ConstraintViolationException ex) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O usuário " + this.usuario.getNome() + " não pode ser excluido pois esta sendo usado em outras tabelas do sistema.", null));
        } finally {
            contextRequest.update("formGerenciamentoUser:tableUsuarios");
            contextRequest.update("formGerenciamentoUser:growl");
            this.isFechaTela = true;
            contextRequest.addCallbackParam("FECHAR", this.isFechaTela);
            this.usuario = new Usuario();
        }
        return null;
    }

    public void cancela() {
        RequestContext contextRequest = RequestContext.getCurrentInstance();
        contextRequest.update("formGerenciamentoUser:tableUsuarios");
        contextRequest.update("formGerenciamentoUser:growl");
        contextRequest.addCallbackParam("FECHAR", true);
    }

    @PostConstruct
    public void carregaTree() {
        this.nodeRoot = new DefaultTreeNode("root", null);
        TreeNode nodePai = null;
//        if (this.usuario == null) {
//            this.usuario = new Usuario();
//        }

        for (Cadastro cadastro : new CadastroDaoImp().buscaTodos()) {
            nodePai = new DefaultTreeNode(cadastro.getNome(), this.nodeRoot);
            for (TipoPermissao tipoPermissao : new TipoPermissaoDaoImp().buscaTodos()) {
                TreeNode nodTippoPermissao = new DefaultTreeNode(tipoPermissao.getNome(), nodePai);
            }
        }
    }

    public DualListModel<Grupo> getGrupos() {
        InterfaceGrupoDao grupoDao = new GrupoDaoImp();
        List<Grupo> grupos = new ArrayList<Grupo>();
        List<Grupo> gruposAssociados = new ArrayList<Grupo>();

        for (Grupo grupo : grupoDao.buscaTodos()) {
            grupos.add(grupo);
        }
        this.userGrupos = new DualListModel<Grupo>(grupos, gruposAssociados);
        return userGrupos;
    }

    public void onRowSelect(SelectEvent event) {
        this.btnEditar = false;
        this.btnVisualizar = false;
        this.btnExluir = false;

    }

    public void pageEvent(PageEvent event) {
        this.btnEditar = true;
        this.btnVisualizar = true;
        this.btnExluir = true;
    }

    public List<Usuario> getUsuarios() {
        InterfaceUsuarioDao usuarioDao = new UsuarioDaoImp();
        this.usuarios = usuarioDao.buscaTodos();
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuario() {
        return usuario;
    }

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

    public boolean isBtnEditar() {
        return btnEditar;
    }

    public DualListModel<Grupo> getUserGrupos() {
        this.usuario = new Usuario();
        InterfaceGrupoDao grupoDao = new GrupoDaoImp();
        InterfaceUsuarioDao usuarioDao = new UsuarioDaoImp();
        List<Grupo> grupos = new ArrayList<Grupo>();
        List<Grupo> gruposAssociados = new ArrayList<Grupo>(5);
        Set<Grupo> gruposByLogin;
        if (this.usuario.getLogin() == null) {
            for (Grupo grupo : grupoDao.buscaTodos()) {
                grupos.add(grupo);
            }
        } else {
            gruposByLogin = usuarioDao.getUsuarioByLogin(this.usuario.getLogin()).getGrupos();
            for (Grupo grupo : gruposByLogin) {
                gruposAssociados.add(grupo);
            }
            for (Grupo grupo : grupoDao.getGrupoByUsuario(gruposByLogin.toArray())) {
                grupos.add(grupo);
            }
        }

        this.userGrupos = new DualListModel<Grupo>(grupos, gruposAssociados);
        return userGrupos;
    }

    public void setUserGrupos(DualListModel<Grupo> userGrupos) {
        this.userGrupos = userGrupos;
    }

    public void setBtnEditar(boolean btnEditar) {
        this.btnEditar = btnEditar;
    }

    public boolean isBtnVisualizar() {
        return btnVisualizar;
    }

    public void setBtnVisualizar(boolean btnVisualizar) {
        this.btnVisualizar = btnVisualizar;
    }

    public boolean isBtnExluir() {
        return btnExluir;
    }

    public void setBtnExluir(boolean btnExluir) {
        this.btnExluir = btnExluir;
    }

    public boolean isIsFechaTela() {
        return isFechaTela;
    }

    public void setIsFechaTela(boolean isFechaTela) {
        this.isFechaTela = isFechaTela;
    }

    public TreeNode getNodeRoot() {
        if (this.usuario.getLogin() != null) {
            //this.usuario = new UsuarioDaoImp().getUsuarioByLogin(this.usuario.getLogin());
            for (int i = 0; i < this.nodeRoot.getChildren().size(); i++) {
                TreeNode treeNode = this.nodeRoot.getChildren().get(i);
                for (Permissao permissao : this.usuario.getPermissoes()) {
                    if (treeNode.getData().toString().equals(permissao.getCadastro().getNome())) {
                        treeNode.setSelected(true);
                        int quantFilhos = treeNode.getChildren().size();
                        for (int j = 0; j < quantFilhos; j++) {
                            if (treeNode.getChildren().get(j).getData().toString().equals(permissao.getTipoPermissao().getNome())) {
                                TreeNode filho = new DefaultTreeNode(permissao.getTipoPermissao().getNome(), null);
                                filho.setSelected(true);
                                treeNode.getChildren().set(j, filho);
                            }
                        }

                        this.nodeRoot.getChildren().set(i, treeNode);
                    }
                }
            }
        }

        return nodeRoot;
    }

    public void setNodeRoot(TreeNode nodeRoot) {
        this.nodeRoot = nodeRoot;
    }

    public TreeNode[] getSelectedNodes() {
        return selectedNodes;
    }

    public void setSelectedNodes(TreeNode[] selectedNodes) {
        this.selectedNodes = selectedNodes;
    }
}

Se você não atualizar e carregar os dados do próximo usuário, os valores serão o do usuário corrente. E se você estiver realizando todas as requisições via ajax, a view não morre, porque você está trabalhando ainda na mesma view.