2014-05-21 8 views
5

I con sicurezza a molla + JSF + primefaces
in login personalizzati, ho messo un pulsante di comando
ma pulsante di comando non workin ...
e quando in p: CommandButton ------ ----> ajax = "false" ---------> è lavoro!
e quando usato F: Ajax nel JSF (core) --------> nessun lavoro
e io uso nella primavera del file security.xml:
ajax nella sicurezza primavera


test.xhtml - -> JSF (core) --------> nessun lavoro

<?xml version="1.0" encoding="UTF-8"?> 
    <!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" 
      xml:lang="en" lang="en"> 
    <head> 
     <title>faces-request</title>   
    </head> 
    <body> 
    <h:form> 
     <center> 
      <h:outputText id="outtxt" value="#{authentiocationBean.ajaxTest}"/><br/> 
      <h:inputText id="intxt" value="#{authentiocationBean.ajaxTest}"/><br/> 
      <h:commandButton value="Submit"> 
       <f:ajax execute="intxt" render="outtxt"/> 
      </h:commandButton>   
     </center> 
    </h:form> 

    </body> 
    </html> 


Spring_security.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="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.2.xsd"> 


    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/Admin/*" access="hasRole('ROLE_ADMIN')"/> 
     <intercept-url pattern="/user/*" access="hasAnyRole('ROLE_USER,ROLE_ADMIN')"/>   
     <form-login login-page="/login.xhtml" 
        authentication-failure-url="/Fail.xhtml?error"/> 
     <logout logout-url="/j_spring_security_logout" delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE" 
       invalidate-session="true" 
       logout-success-url="/login.xhtml"/> 
     <session-management session-authentication-error-url="/401.xhtml" session-fixation-protection="migrateSession"> 
      <concurrency-control max-sessions="1" expired-url="/login.xhtml"/> 
     </session-management> 

     <remember-me key="myAppKey"/> 
     <access-denied-handler error-page="/AccDe.xhtml"/> 
     <headers> 
      <xss-protection/> 
      <frame-options/> 
      <cache-control/> 
      <content-type-options/> 
     </headers> 
     <csrf/> 

    </http> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider> 
      <jdbc-user-service data-source-ref="myDataSource" 
           users-by-username-query="select username, password, active from users where username=?" 
           authorities-by-username-query="select us.username, ur.authority from users us, user_roles ur 
        where us.user_id = ur.user_id and us.username =? " 
        /> 
      <password-encoder ref="passwordEncoder" hash="sha-256"/> 

     </authentication-provider> 
    </authentication-manager> 


    <bean id="passwordEncoder" 
      xmlns="http://www.springframework.org/schema/beans" 
      class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> 
     <!--org.springframework.security.crypto.password.PasswordEncoder  for salt!--> 
     <constructor-arg value="256"/> 
    </bean> 



</beans:beans> 


LoginPage:

<?xml version='1.0' encoding='UTF-8' ?> 
<!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:p="http://primefaces.org/ui"> 
<h:head> 

    <title>faces-request</title>  
</h:head> 
<h:body> 
    <h:form prependId="false" id="formLogin"> 
     <center> 
      <p:panelGrid style="border-width: 0px;" columns="2"> 
       UserName: 
       <p:inputText required="true" id="j_username"/> 
       Password: 
       <p:password required="true" id="j_password"/> 
      </p:panelGrid>    
      <p:commandButton type="submit" id="login" action="#{authentiocationBean.doLogin()}" value="Login"/> 
      <p:outputLabel for="_spring_security_remember_me" value="Remember me: "/> 
      <p:selectBooleanCheckbox id="_spring_security_remember_me"/> 
      <br/> 
     </center> 
    </h:form> 
</h:body> 
</html> 

classe AuthentiocationBean

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 

import java.io.IOException; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 


/** 
* @author Admin 
*/ 
@RequestScoped 
@ManagedBean 
public class AuthentiocationBean { 
    public String ajaxTest = "Test"; 
    boolean isLogged = false; 
    public String role = "ROLE_ADMIN"; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    String name = auth.getName(); 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public String doLogin() throws IOException, ServletException { 
     isLogged = true; 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     ExternalContext context = facesContext.getExternalContext(); 
     RequestDispatcher dispatcher = ((ServletRequest) context.getRequest()).getRequestDispatcher("/j_spring_security_check"); 
     dispatcher.forward((ServletRequest) context.getRequest(), (ServletResponse) context.getResponse()); 
     FacesContext.getCurrentInstance().responseComplete(); 
     // It's OK to return null here because Faces is just going to exit. 
     return null; 
    } 

    public void doLogout() { 
//  FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
//  return "/logout.xhtml"; 
//  return null; 
    } 

    public boolean isLogged() { 
     return isLogged; 
    } 

    public void setLogged(boolean logged) { 
     isLogged = logged; 
    } 

    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    public String getAjaxTest() { 
     return ajaxTest; 
    } 

    public void setAjaxTest(String ajaxTest) { 
     this.ajaxTest = ajaxTest; 
    } 


} 

grazie

risposta

2

E 'solo un registro in pagina, quindi perché preoccuparsi di AJAX?

Ho integrato Spring 3.1.4 supporto LDAP con JSF. Anche se inizialmente ho scritto un bean di autenticazione personalizzato, non lo uso più. Non sono esperto, e sono sicuro che c'è un modo diverso da quello che ho implementato.


(1) semplice pagina di login (estratto):

<h:inputText id="j_username"/> <h:inputText type="password" id="j_password" value=""/> <h:commandButton name="submit" type="submit" value="Log In" /> <input type="reset" value="Reset" />

(2,1) In web.xml, dichiaro un contesto-param dare un nome al file di configurazione della sicurezza (menzionato nel passaggio 3 di seguito).
Dichiaro inoltre la catena dei filtri di sicurezza Primavera, che potete leggere qui: http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/security-filter-chain.html#filter-chains-with-ns

(2,2) In faces-config dichiaro: <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

(2,3) In faces- config, dichiaro un bean UserSession personalizzato con ambito di sessione.
UserSession fagiolo ha questo metodo:

@PostConstruct 
public void loadAuthorities() { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    . . . 
    . . . 
} 

(3) fagioli UserSession si riferisce a dall'interno della pagina di destinazione (menu.xhtml) che viene dichiarata nel mio file di protezione di configurazione (dichiarata nel web. xml nel passaggio 2.1 sopra):

<security:form-login default-target-url="/menu.xhtml" always-use-default-target="true"  authentication-failure-url="/denied.xhtml" />     
<security:logout invalidate-session="true" delete-cookies="JSESSIONID" logout-url="/j_spring_security_logout" /> 

(4) utente è autenticato poi reindirizzato al menu.xhtml menu.xhtml provoca UserSession fagiolo caricare.

Il bean UserSession estrae un elenco di autorità da SecurityContext.

UserSession bean fornisce wrapper semplice per verificare se un utente ha l'autorità per visualizzare le pagine e risorse:

public boolean isRole(String role) { 
    return authorities.contains((String) role); 
} 

public boolean roleContains(String s); 
public boolean roleEndsWith(String s); 
. . . 
. . .