JSF 2 e JAAS

6 respostas
Diabo_Loiro

Estava implementando um login e fui usar a autenticação do tipo FORM.

Estou usando JSF2 + facelets e não consigo achar nenhum exemplo de como fazer um form com a tag <h:from> e as outras tags JSF, tive que infelizmente colocar <f:verbatin> e por html dentro funciona mais queria ter que escrever html na mão, alguém sabe como fazer o formulário só utilizando as tags do JSF

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Login</title>
    </h:head>
    <h:body>
        <f:verbatim>
            <form method="post" action="#{request.contextPath}/j_security_check">
                <label for="username">Userid</label><input type="text" id="username" name="j_username"/>
                <label for="password">Password</label><input type="password" id="password" name="j_password"/>
                <input type="submit" value="Login"/>
            </form>
        </f:verbatim>
    </h:body>
</html>

6 Respostas

dev.rafael

Isso ñ é possível. O máximo q vc pode fazer é um componente JSF custom p/ construir a form de login p/ vc.

Diabo_Loiro

auhauha alguém mais concorda que deveria existir um componente que suportasse esse recurso, estranho ultimamente estou vendo varias lacunas não preenchidas.

so por curiosidade sabe o motivo de não ser possível?

Obrigado novamente brother

dev.rafael

Os componentes do JSF usam binding dos seus valores com propriedade de algum ManagedBean. No caso do form de login do JAAS vc ñ tem o ManagedBean responsável pelo login e por isso vc usar parametros nomeados j_username e j_password. O mesmo vale p/ a action q é definida pela url j_security_check enquanto uma action do JSF é uma expressão q aponta p/ um método de um ManagedBean.
Vc pode usar o JSF p/ fácilitar a criação e customização da form de login, msm pq as vezes vc ñ quer ou simplesmente ñ pode usar JAAS. O JSF 2 torna isso muito fácil através de Composite Componentes.

Diabo_Loiro

Entedi estava lendo hoje sobre os composite components vlw novamente.

M

Meu login é igual ao do Diabo Loiro!
Só estou tendo problemas com meu web.xml, aqui:

<login-config>
	<auth-method>FORM</auth-method>		
	<form-login-config>
		<form-login-page>/login.xhtml</form-login-page>
		<form-error-page>/negado.xhtml</form-error-page>
	</form-login-config>
</login-config>

Onde o Eclipse fica informando login.jsp e negado.jsp não existem.
Na verdade eles existem, mas com a extensão .xhtml .
O meu faces servlet é assim:

<servlet-mapping>
	<servlet-name>Faces Servlet</servlet-name>
	<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Vocês tem o mesmo problema?

Aislim_Shanon

utilizo jaas + jsf + primefaces..

<h:form>
		        
		     	<p:growl id="avisos" showDetail="true" life="3000" />
	        	<p:messages id="mensagens" for="login" showDetail="true" autoUpdate="true" globalOnly="true"/>
		        
		        <h:inputHidden id="id" value="#{userMB.from}" />
        
		    	<p:focus for="email" />
		    	<p:fieldset legend="Login">
		    		<h:panelGrid columns="3" cellpadding="5">
		                
		            	<h:outputText value="E-mail: " />
		 				<p:inputText id="email" value="#{userMB.user.email}" required="true" label="Login"/>  
				        <p:message for="email" />  
				            
				     	<h:outputText value="Senha: " />
		 				<p:password id="password"  value="#{userMB.user.password}" required="true" label="Password"/>  
				   		<p:message for="password" />  
				            
		                
		            </h:panelGrid>
			</p:fieldset>
		        	
		    <p:commandButton value="Entrar" icon="ui-icon-disk" action="#{userMB.login}" update="avisos,mensagens" ajax="false" />
		        
		</h:form>

E o managed bean:

package com.mb;
 
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//import javax.security.auth.login.FailedLoginException;

import com.facade.UserFacade;
import com.model.User;
 
@SessionScoped
@ManagedBean
public class UserMB {
    private User user;
 
    @EJB
    private UserFacade userFacade;
    
    private static final String INDEX = "index";  
    
    private static final String STAY_IN_THE_SAME_PAGE = null;  
    
    @PostConstruct
    public void init(){  
        user = new User();  
    }  
    
    public User getUser(){
        if(user == null || user.getEmail() == null){
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            if (context.getUserPrincipal() != null){
            	String userEmail = context.getUserPrincipal().getName();
 
            	user = userFacade.findUserByEmail(userEmail);
            }
        }
 
        return user;
    }
    
    public void setUser(User usuario) {  
        this.user = usuario;  
    }  
 
    public boolean isUserAdmin(){
        return getRequest().isUserInRole("ADMIN");
    }
    
    public boolean isUserLoggedIn(){
		
        if (getContext().getExternalContext().getUserPrincipal() != null)
			return true;
		
		return false;
    	
    }
 
    public String logOut(){
        //getRequest().getSession().invalidate();
    	try {
			getRequest().logout();
			
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
        user = new User();
        return "logout";
    }
 
    private HttpServletRequest getRequest() {
        return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    }
    
      
    public String login(){ 
    	
    	
    	try {
    		
    		if (getContext().getExternalContext().getUserPrincipal() == null)
    			getRequest().login(user.getEmail(), user.getPassword());
    		
			return INDEX; 

		} catch (ServletException e) {
			
				sendErrorMessageToUser("login", "Não foi possível se logar.", "Verifique seu usuário e senha.");
			
			return STAY_IN_THE_SAME_PAGE;  
		} 
    	
    }  
    
    private void sendInfoMessageToUser(String title, String message){
        FacesContext context = getContext();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, title, message));
    }
    
    private void sendInfoMessageToUser(String messageBox, String title, String message){
        FacesContext context = getContext();
        context.addMessage(messageBox, new FacesMessage(FacesMessage.SEVERITY_INFO, title, message));
    }
 
    private void sendErrorMessageToUser(String title, String message){
        FacesContext context = getContext();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, title, message));
    }
    
    private void sendErrorMessageToUser(String messageBox, String title, String message){
        FacesContext context = getContext();
        context.addMessage(messageBox, new FacesMessage(FacesMessage.SEVERITY_ERROR, title, message));
    }
 
    private FacesContext getContext() {
        FacesContext context = FacesContext.getCurrentInstance();
        return context;
    }


}
Criado 12 de novembro de 2010
Ultima resposta 9 de ago. de 2012
Respostas 6
Participantes 4