2014-05-21 25 views
5

tôi sử dụng bảo mật mùa xuân + JSF + primefaces
trong đăng nhập tùy chỉnh, tôi đặt một nút lệnh
nhưng nút lệnh không workin ...
và khi trong p: CommandButton ------ ----> ajax = "false" ---------> là công việc!
và khi được sử dụng f: ajax trong JSF (core) --------> không có công việc
và tôi sử dụng vào mùa xuân tập tin security.xml:
ajax trong an ninh mùa xuân


test.xhtml - -> JSF (core) --------> không có công việc

<?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 lớp

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


} 

nhờ

Trả lời

2

Nó chỉ là một bản ghi trong trang, vậy tại sao lại bận tâm với AJAX?

Tôi đã tích hợp hỗ trợ Spring 3.1.4 LDAP với JSF. Mặc dù ban đầu tôi đã viết một bean xác thực tùy chỉnh, tôi không sử dụng nó nữa. Tôi không phải chuyên gia, và tôi chắc chắn có một cách khác với những gì tôi đã thực hiện.


(1) Simple trang đăng nhập (trích đoạn):

<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) Trong web.xml, tôi tuyên bố một ngữ cảnh param để đặt tên cho tập tin cấu hình bảo mật (đã đề cập ở bước 3 bên dưới).
Tôi cũng tuyên bố chuỗi bộ lọc bảo mật mùa xuân, mà bạn có thể đọc về ở đây: http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/security-filter-chain.html#filter-chains-with-ns

(2,2) Trong khuôn mặt-config Tôi tuyên bố: <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

(2,3) Trong faces- config, tôi khai báo một bean UserSession tùy chỉnh với phạm vi phiên.
đậu UserSession có phương pháp này:

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

(3) đậu UserSession được gọi từ bên trong trang đích (menu.xhtml) được khai báo trong tập tin an ninh cấu hình của tôi (khai báo trong web. xml ở bước 2.1 ở trên):

<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) dùng được thẩm định sau đó chuyển hướng đến menu.xhtml Menu.xhtml gây UserSession đậu để tải.

Hạt UserSession lấy danh sách các Nhà chức trách từ SecurityContext.

đậu UserSession cung cấp giấy gói đơn giản để kiểm tra xem người dùng có thẩm quyền để xem các trang và các nguồn lực:

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

public boolean roleContains(String s); 
public boolean roleEndsWith(String s); 
. . . 
. . . 
Các vấn đề liên quan