Alterar senha do usuário logado

Bom dia pessoal, gostaria da ajuda de vocês mais uma vez.

Estou desenvolvendo um sistema com Primefaces 5.0 e até agora ia tudo bem, mas, me deparei com a necessidade de criar uma maneira do usuário alterar a sua própria senha.
O usuário, quando cadastrado, recebe uma senha “padrão” do sistema, aí o gestor informa o login e a senha para ele que, ao acessar pela primeira vez, recebe um Dialog em ‘modal’ para alterar a senha.
Outro caso de alteração seria por necessidade, caso o usuário ‘desconfie’ que alguém tenha utilizado a sua senha, etc…

O que eu tenho até então:

Quando o usuário loga no sistema, junto do login, eu retorno o usuário inteiro, não faço somente a verificação, recupero todos os dados do usuário na sessão.

LoginBean:

public String efetuaLogin() throws NoSuchAlgorithmException {
	usuario.setSenha(Criptografia.criptografar(usuario.getSenha()));

	Usuario perfilUsuario = dao.existe(this.usuario);

	if (perfilUsuario != null) {
		this.usuario = perfilUsuario;
		usuarioLogado.logar(usuario);
		// eventoLogin.fire(usuario);
		FacesContext.getCurrentInstance().addMessage("LOGIN",
				new FacesMessage(FacesMessage.SEVERITY_INFO, "Bem vindo ", usuario.getUsuarioNome()));
		return "index?faces-redirect=true";
	} else {
		usuarioLogado.deslogar();
		this.usuario = new Usuario();
		FacesContext.getCurrentInstance().addMessage("LOGIN",
				new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO DE LOGIN", "Usuário ou senha inválidos"));
		return "login";
	}
}

E aí no meu _template.xhtml eu coloquei o Dialog. Por que no _template.xhtml? Porque eu criei um ‘botão’ para ele no Menu ( megaMenu ), então, por questão de praticidade, ele está ali…
só o Dialog

<p:dialog widgetVar=“alteraSenha” header=“Alterar Senha"
visible=”#{usuarioLogadoBean.usuario.senha eq ‘altereiÉclaro’ ? ‘true’ : ‘false’}“
rendered=“true” appendTo=”@(body)" draggable=“false” modal="true"
resizable=“false” style=“width: 230px; height: 300px;”>

		<h:form
			style="width: 230px; height: 190px; margin-left: 1%; margin-right: 1px; padding-top: 5px;">
			<p:growl id="msgs" showDetail="true" />
			<div class="ui-g-12" style="padding-bottom: 10%">
				<p:password id="nova" match="confirma"
					validatorMessage="As senhas precisam ser iguais" required="true"
					requiredMessage="Informe a nova senha" placeholder="Nova senha"
					style="text-align:center; height: 25px;" />
			</div>
			<div class="ui-g-12" style="padding-bottom: 10%">
				<p:password id="confirma" match="confirma"
					value="#{usuarioBean.usuario.senha}" required="true"
					requiredMessage="Confirme a nova senha"
					placeholder="Confirmar senha"
					style="text-align:center; height: 25px;" />
			</div>
			<p:separator />
			<div class="ui-g12" style="padding-top: 10%;">
				<h:commandButton value="Alterar" action="#{usuarioBean.grava()}"
					ajax="false" />
			</div>
		</h:form>
	</p:dialog>

O problema: não sei como passar os dados do usuário logado para o método que grava.

Vi um post que falava sobre “Adicionar e Recuperar” dados do usuário na sessão ( JSF ), mas, confesso que não entendi 'como eu devo fazer, ou aonde devo fazer isto"…

Este é o post: https://jbossdivers.wordpress.com/2011/09/12/adicionando-e-recuperando-objetos-de-sessao-no-jsf/

Eu agradeço muito pela ajuda.

Abraço!

Vamos por partes. Você diz:

Posso entender que já esteja colocando os dados na sessão?
Se sim, por que diz isso:

Basicamente, tudo o que você vai fazer será no teu managed bean (backing bean). Receber login e senha, verificar se está nulo, com caracteres a menos, se o email está em padrão esperado, invocar os dados no DAO, colocar na sessão caso ok, retornar erro caso não, recuperar da sessão, etc.

drsmachado, obrigado pela resposta.

Então, o “conceito” eu entendo, o problema é que, sou meio ‘novato’ em JEE, e me perco um pouco com algumas coisas que são até básicas ( como esta por exemplo ).

Minha questão seria: Tendo todos os dados do usuários carregados na sessão ( recupero os dados pelo método UsuarioLogadoBean ), como eu faço para passar estes dados acrescentando a nova senha ao método “gravar” que está no meu UsuárioBean?

Se tiver um link para um post que você já tenha visto, ou um trecho de código para que eu possa me basear, eu agradeço.

Entenda, não estou querendo “mastigado”, mas eu consigo compreender melhor olhando um exemplo ( no caso código ).

Obrigado!

Porque tem dois managedbeans que tratam do usuário (UsuarioBean e UsuarioLogadoBean)?
Eles são entidades diferentes do sistema? Porque um usuário logado deixa de ser usuário?
Eu criaria apenas um managed bean chamado UsuarioManagedBean, colocaria tudo o que você separou nele e não teria estes problemas.
Ouuuuuu então, faria com que UsuarioLogadoBean fosse uma extensão de UsuarioLogado, aí, por herança, fica fácil, não acha? Mais sentido nisso, não concorda?

Então, entendo, mas olha o meu ‘cenário’:

UsuarioBean é um @RequestScoped e o UsuarioLogadoBean é um @SessionScoped.

Não iria dar “pau” misturar isto?

Entendi.
Bom, neste caso, eu não consigo te dizer qual seria o comportamento caso você estenda o UsuarioLogadoBean, nunca precisei trabalhar com este tipo de diferença.

drsmachado, agradeço pela ajuda, acabei compreendendo como fazer pelo link que mencionei mais acima ( https://jbossdivers.wordpress.com/2011/09/12/adicionando-e-recuperando-objetos-de-sessao-no-jsf/1 )

Caso alguém tenha a mesma ‘necessidade’ que eu, segue o que fiz…

No meu LoginBean, quando eu verifico o login ( usuário e senha ), eu já ‘seto’ na sessão os dados do usuário:

public String efetuaLogin() throws NoSuchAlgorithmException {
	usuario.setSenha(Criptografia.criptografar(usuario.getSenha()));

	Usuario perfilUsuario = dao.existe(this.usuario);

	if (perfilUsuario != null) {
		this.usuario = perfilUsuario;
		usuarioLogado.logar(usuario);
		// eventoLogin.fire(usuario);

		FacesContext fc = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
		
		session.setAttribute("ID_USUARIO", this.usuario.getId());
		session.setAttribute("TIPO_USUARIO", this.usuario.getTipo());
		session.setAttribute("LOGIN_USUARIO", this.usuario.getLogin());
		session.setAttribute("STATUS_USUARIO", this.usuario.getStatus());
		session.setAttribute("NOME_USUARIO", this.usuario.getUsuarioNome());

		return "index?faces-redirect=true";

	} else {
		usuarioLogado.deslogar();
		this.usuario = new Usuario();

		FacesContext.getCurrentInstance().addMessage("LOGIN",
				new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO DE LOGIN", "Usuário ou senha inválidos"));

		return "login";
	}
}

E depois, quando eu quero alterar a senha do usuário logado, eu ‘pego’ os valores da sessão:

@Transacional
public String alteraSenhaUsuario() throws InterruptedException {
	HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
			.getRequest();
	HttpServletRequest request = (HttpServletRequest) req;
	HttpSession session = (HttpSession) request.getSession();

	usuario.setId((Long) session.getAttribute("ID_USUARIO"));
	usuario.setLogin((String) session.getAttribute("LOGIN_USUARIO"));
	usuario.setStatus((String) session.getAttribute("STATUS_USUARIO"));
	usuario.setUsuarioNome((String) session.getAttribute("NOME_USUARIO"));
	usuario.setTipo((NivelDeAcesso) session.getAttribute("TIPO_USUARIO"));

	System.out.println("Alterando a senha do usuário...");

	if (usuario.getId() != null) {
		dao.atualiza(usuario);
	}
	this.usuario = new Usuario();
	FacesContext.getCurrentInstance().addMessage("SENHA", new FacesMessage(FacesMessage.SEVERITY_INFO,
			"Senha alterada ", "Faça login novamente com a nova senha"));
	session.invalidate();
	return "login?faces-dispatch=true";
}

Simples demais.

Tenho muita dificuldade com coisas ‘óbvias e simples’.

Por que?

Porque até 8 meses atrás eu desenvolvia em JSE e fazia até o JDBC na ‘unha’, acostumei a ter que construir tudo baseado em dezenas ou centenas de linhas…

Novamente agradeço pela atenção.

Abraço!