2014-05-21 4 views
5

я с помощью пружины безопасности + JSF + primefaces
в пользовательском входе, я поставил командную кнопку
но кнопка команды не Workin ...
и когда в р: CommandButton ------ ----> ajax = "false" ---------> это работа!
и при использовании F: Ajax в JSF (ядро) --------> нет работы
и я использую весной security.xml файла:
Аякса весной безопасность


test.xhtml - -> JSF (ядро) --------> нет работы

<?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> 

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; 
    } 


} 

благодаря

ответ

2

Это просто журнал на странице, так зачем беспокоиться с AJAX?

У меня встроенная поддержка Spring 3.1.4 LDAP с поддержкой JSF. Хотя я изначально написал собственный компонент аутентификации, я больше не использую его. Я не эксперт, и я уверен, что есть другой путь от того, что я реализовал.


(1) Simple Войти страницу (выдержка):

<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) В web.xml, я объявляю контекстные параметры назвать файл конфигурация безопасности (упомянутый в пункте 3 ниже).
Заявляю также фильтр цепи Spring безопасности, которые вы можете прочитать о здесь: http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/security-filter-chain.html#filter-chains-with-ns

(2.2) в лицах-конфигурации Заявляю: <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

(2,3) В faces- config, я объявляю пользовательский компонент UserSession с областью сеанса.
UserSession боб имеет этот метод:

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

(3) UserSession боб называют внутри целевой страницы (menu.xhtml) которая объявлена ​​в моем файле конфигурации безопасности (объявленная в Интернете. xml на шаге 2.1 выше):

<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) пользователь аутентифицирован затем перенаправляется menu.xhtml Menu.xhtml вызывает UserSession фасоли для загрузки.

UserSession bean вытаскивает список полномочий из SecurityContext.

UserSession боб предоставляет простые обертки, чтобы проверить, имеет ли пользователь полномочия просматривать страницы и ресурсы:

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

public boolean roleContains(String s); 
public boolean roleEndsWith(String s); 
. . . 
. . . 
Смежные вопросы