GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Ajuda na parte do login do projecto

mysql
primefaces
tomcat
jsf
javaweb
Tags: #<Tag:0x00007f75faf73678> #<Tag:0x00007f75faf734e8> #<Tag:0x00007f75faf732e0> #<Tag:0x00007f75faf73088> #<Tag:0x00007f75faf72f48>

#15
Seria algo mais ou menos assim:

if(usuario.isAdmin()) {
//Faz algo
}
else if(usuario.isAdministrador()){
//Faz algo
}
else if(usuario.isControlado()){
//Faz algo
}
//E assim por diante

O que estaria a pegar com o usuario.isAdministrador e os restantes?


#16

O que vc quiser fazer.

O sistema é seu, você que decide o que tem que acontecer caso o usuario for admin ou adminstrador ou funcionario


#17

Por acaso o is pega algum valor?


#18

Na realidade estou pouco confuso como resolver este problema porque, criei três paginas index ou página principal, um para funcionário que tem uma barra de ferramentas diferente com o index do administrador e admin, o mesmo se aplica aos outros dois usuários, isto porque cada usuário teria funções diferentes no sistema, teria que encaminha-los para as suas respectivas paginas principais. E como poderia fazer? Tentei da maneira que exemplificaste mas nao resultou assinalou erro e da minha tambem deu erro…

A classe DAO ficou assim

    public Usuario obterUsuario(Usuario u) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("Select * from usuario ");
		sql.append("where usuario=? and senha=? ");

		Connection conexao = Conexao.conectar();
		PreparedStatement stmt = conexao.prepareStatement(sql.toString());

		ResultSet resultado = stmt.executeQuery();

		if (resultado.next()) {
			u.setUsuario(resultado.getString("usuario"));
			u.setSenha(resultado.getString("senha"));
			return u;
		} else {
			return null;
		}

	}

e a classe BEAN

    public void login() {
		
		try {
			UsuarioDAO udao = new UsuarioDAO();
			usuario = udao.obterUsuario(usuario);
		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

#19

O is seria o get.

Quando se tem uma variável do tipo boolean, a convenção diz para usar is no lugar de get.


#20

Qual seria o erro?

Tem a maneira correta, que é usar um autorizador para ser executado em todas as páginas que for acessar e tem a maneira para teste.

Vamos pro teste inicialmente:
Se você quer fazer um redirecionamente para uma página depois de efetuar um login, você tem que mudar o retorno do seu método para String, e então você retorna o nome da página ou pasta + página juntamente com a extensão

return “index.xhtml”;


#21
public String login() {

	try {
		UsuarioDAO udao = new UsuarioDAO();
		usuario = udao.obterUsuario(usuario);
		if (usuario.getNome().equals("ayrton") && usuario.getSenha().equals("12345")) {
			return "indexFuncionario.xhtml";
		} else if (usuario.getNome().equals("raquel") && usuario.getSenha().equals("12345")) {
			return "indexAdmin.xhtml";
		} else if(usuario.getNome().equals("francisco") && usuario.getSenha().equals("12345")) {
			return "indexAdministrador.xhtml";
		}else {
			return null;
		}

	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
}

Assim não deu erro. Esta correcto? Esses valores estao armazenados na base de dados


#22

Seria mais ou menos esse esquema mesmo, você ve qual usuário que é, e ai redireciona para uma certa pagina.

O mais correto seria no banco ter umas colunas informando o que o usuario é, ao invés de você checar nome e senha


#23

Seria tipo criar uma coluna com níveis de acesso tipo 1, 2, 3 e uma tabela onde cada id representará uma tipo de usuario e haveria uma relação entre elas?


#24

Na verdade deu um erro ao tentar logar, e não aceita o metodo login diz que tem que ser um metodo void…

	<div id="login-panel">
		<h:form>
			<table>
				<tr>
					<td>Usuário</td>
			
					<td><p:inputText size="15" placeholder="Usuário" value="#{MBLoginBean.usuario.usuario}"/></td>
				</tr>



				<tr>
					<td>Senha</td>

					<td><p:password size="15" placeholder="Senha" value="#{MBLoginBean.usuario.senha}"/></td>
				</tr>

				<tr>
					<td colspan="2"><h:commandButton value="Entrar"
							style="horizontal-align:center;" actionListener="#{MBLoginBean.login}" /></td>
				</tr>

			</table>

		</h:form>

#25

Muda de actionListener para Action

actionListener: executar uma lógica relacionada a view ou disparar uma ação antes de uma lógica de negócio. O método tem que ser void

Action é para navegação de páginas ou regra de negocio


#26

Bem, ao trocar ele me direciona para uma pagina de erro ao usar o commandbutton da biblioteca do jsf, mas quando uso o commandbutton do primefaces não acontece nada. Aparece a seguinte pagina de erro.

HTTP Status 500 – Internal Server Error
Type Exception Report

Message /pages/login.xhtml @67,95 value="#{MBLoginBean.usuario.usuario}": Target Unreachable, [usuario] returned null

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: /pages/login.xhtml @67,95 value="#{MBLoginBean.usuario.usuario}": Target Unreachable, [usuario] returned null
	javax.faces.webapp.FacesServlet.service(Unknown Source)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

javax.el.PropertyNotFoundException: /pages/login.xhtml @67,95 value="#{MBLoginBean.usuario.usuario}": Target Unreachable, [usuario] returned null
	com.sun.faces.facelets.el.TagValueExpression.getType(Unknown Source)
	org.primefaces.util.ComponentUtils.getConverter(ComponentUtils.java:152)
	org.primefaces.renderkit.InputRenderer.getConvertedValue(InputRenderer.java:199)
	javax.faces.component.UIInput.getConvertedValue(Unknown Source)
	javax.faces.component.UIInput.validate(Unknown Source)
	javax.faces.component.UIInput.executeValidate(Unknown Source)
	javax.faces.component.UIInput.processValidators(Unknown Source)
	javax.faces.component.UIForm.processValidators(Unknown Source)
	javax.faces.component.UIComponentBase.processValidators(Unknown Source)
	javax.faces.component.UIComponentBase.processValidators(Unknown Source)
	javax.faces.component.UIViewRoot.processValidators(Unknown Source)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(Unknown Source)
	com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
	com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
	javax.faces.webapp.FacesServlet.service(Unknown Source)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

javax.el.PropertyNotFoundException: Target Unreachable, [usuario] returned null
	org.apache.el.parser.AstValue.getTarget(AstValue.java:124)
	org.apache.el.parser.AstValue.getType(AstValue.java:58)
	org.apache.el.ValueExpressionImpl.getType(ValueExpressionImpl.java:174)
	com.sun.faces.facelets.el.TagValueExpression.getType(Unknown Source)
	org.primefaces.util.ComponentUtils.getConverter(ComponentUtils.java:152)
	org.primefaces.renderkit.InputRenderer.getConvertedValue(InputRenderer.java:199)
	javax.faces.component.UIInput.getConvertedValue(Unknown Source)
	javax.faces.component.UIInput.validate(Unknown Source)
	javax.faces.component.UIInput.executeValidate(Unknown Source)
	javax.faces.component.UIInput.processValidators(Unknown Source)
	javax.faces.component.UIForm.processValidators(Unknown Source)
	javax.faces.component.UIComponentBase.processValidators(Unknown Source)
	javax.faces.component.UIComponentBase.processValidators(Unknown Source)
	javax.faces.component.UIViewRoot.processValidators(Unknown Source)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(Unknown Source)
	com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
	com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
	javax.faces.webapp.FacesServlet.service(Unknown Source)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

O metodo bean ficou assim

	public String login() {

		try {
			usuario = new Usuario();
			UsuarioDAO udao = new UsuarioDAO();
			usuario = udao.obterUsuario(usuario);
			if (usuario.getNome().equals("ayrton") && usuario.getSenha().equals("12345")) {
				return "indexFuncionario.xhtml";
			} else if (usuario.getNome().equals("raquel") && usuario.getSenha().equals("12345")) {
				return "indexAdmin.xhtml";
			} else if(usuario.getNome().equals("francisco") && usuario.getSenha().equals("12345")) {
				return "indexAdministrador.xhtml";
			}else {
				return null;
			}
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}

#27

Na sua página xhtml tem os campos usuario e senha não tem?

Bom… Você não postou o código todo, eu diria que JSF esta tentando inserir um valor no seu objeto e o seu objeto esta nulo (você inicializou no método login)


#28

Sim tem

@ManagedBean(name = "MBLoginBean")
@SessionScoped
public class LoginBean implements Serializable {

	private static final long serialVersionUID = 5181306173238681349L;
	private Usuario usuario;

	public Usuario getUsuario() {
		return usuario;
	}

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

	public String login() {

		try {
			usuario = new Usuario();
			UsuarioDAO udao = new UsuarioDAO();
			usuario = udao.obterUsuario(usuario);
			if (usuario.getNome().equals("ayrton") && usuario.getSenha().equals("12345")) {
				return "indexFuncionario.xhtml";
			} else if (usuario.getNome().equals("raquel") && usuario.getSenha().equals("12345")) {
				return "indexAdmin.xhtml";
			} else if(usuario.getNome().equals("francisco") && usuario.getSenha().equals("12345")) {
				return "indexAdministrador.xhtml";
			}else {
				return null;
			}
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}

}

Tenho que inicializar o usuário fora do método login??


#29

Sim, isso foi falado no meu segundo post

Como que o seu objeto vai receber os valores dos campos, se ele esta null antes de ser chamado o metodo login?


#30

O erro desapareceu ao tentar fazer o login, só que a página que devia aparecer não aparece simplesmente processa e mantém na mesma página de login e limpa os campos. Fui ver na console e aparece o seguinte erro:

java.sql.SQLException: No value specified for parameter 1
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1036)
	at mz.com.SistemaArmazemFCSP.DAO.UsuarioDAO.obterUsuario(UsuarioDAO.java:47)
	at mz.com.SistemaArmazemFCSP.Beans.LoginBean.login(LoginBean.java:32)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(Unknown Source)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(Unknown Source)
	at com.sun.faces.application.ActionListenerImpl.processAction(Unknown Source)
	at javax.faces.component.UICommand.broadcast(Unknown Source)
	at javax.faces.component.UIViewRoot.broadcastEvents(Unknown Source)
	at javax.faces.component.UIViewRoot.processApplication(Unknown Source)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(Unknown Source)
	at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
	at javax.faces.webapp.FacesServlet.service(Unknown Source)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:412)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1385)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

Penso que seja no método DAO, certo? Fui confirmar mas não vi nenhum erro.

Aqui esta o método:

public Usuario obterUsuario(Usuario u) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("Select * from usuario ");
		sql.append("where usuario=? and senha=? ");

		Connection conexao = Conexao.conectar();
		PreparedStatement stmt = conexao.prepareStatement(sql.toString());

		ResultSet resultado = stmt.executeQuery();

		if (resultado.next()) {
			u.setUsuario(resultado.getString("usuario"));
			u.setSenha(resultado.getString("senha"));
			return u;
		} else {
			return null;
		}

	}

#31

O erro diz que não foi passado nenhum parametro para o sql.

Os seus parametros são os ‘=?’

Você tem que passar os valores para os parametros usuario e senha

Tipo assim:

PreparedStatement p = con.prepareStatement("select * from people where 
(first_name = ? or last_name = ?) and address = ?");
p.setString(1, name);
p.setString(2, name);
p.setString(3, address);

Se quiser saber mais, procure por: PreparedStatement Parameters


#32

Bem agora fiquei um pouco confuso… Ao fazer isso terei que alterar novamente o meu método DAO, que esta assim :

	public Usuario obterUsuario(Usuario u) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("Select * from usuario ");
		sql.append("where usuario=? and senha=? ");

		Connection conexao = Conexao.conectar();
		PreparedStatement stmt = conexao.prepareStatement(sql.toString());

		ResultSet resultado = stmt.executeQuery();

		if (resultado.next()) {

			u.setUsuario(resultado.getString("usuario"));
			u.setSenha(resultado.getString("senha"));
			return u;
		} else {
			return null;
		}

	}

#33

E que outra solução teria? Se esta errado (nao funciona) tem que alterar.

Você tem que passar os parametros para a query.


#34

Bem, penso que fiz tudo errado…
Poderia seguir este tutorial e aproveitar para o meu sistema, visto que este projecto foi implementado em páginas em jsp, e as minhas páginas estao em xhtml… Haverá diferenças na implementaçao? . https://o7planning.org/en/11071/create-a-simple-login-application-and-secure-pages-with-java-servlet-filter#a11046510