我在我的jsf2 web應用程序中使用spring security 3。jsf彈簧安全登錄錯誤消息
如何在我的登錄表單中顯示錯誤的憑據消息,而不將get參數?login_error附加到authenticated-fail-login-page?
我用相聽衆喜歡這個教程試圖說:
http://tutorials.slackspace.de/tutorial/Custom-login-page-with-JSF-and-Spring-Security-3
但它不工作。
既不帶有preRenderView偵聽器。
既不檢查彈簧安全性,也不顯示消息的最後一個異常。
任何想法?
UPDATE:
我的登錄頁面:
<f:metadata>
<f:viewParam name="error" value="#{autenticacionController.error}" />
<f:event listener="#{autenticacionController.comprobarAuthException}" type="preRenderView" />
</f:metadata>
<h:messages globalOnly="true" layout="table" />
<h:form id="formLogin" prependId="false">
<h:outputLabel for="j_username" value="Usuario:" />
<h:inputText id="j_username" value="#{autenticacionController.administrador.login}" />
<h:outputLabel for="j_password" value="Contraseña:" />
<h:inputSecret id="j_password" value="#{autenticacionController.administrador.password}" />
<h:commandButton value="Entrar" action="#{autenticacionController.loginAction}" />
<h:commandButton value="Cancelar" immediate="true" action="#{autenticacionController.cancelarAction}" />
</h:form>
我管理的bean:
@ManagedBean(name="autenticacionController")
@RequestScoped
public class AutenticacionController extends BaseController {
//entidad "administrador" contra el que validar los campos del form login
private Administrador administrador = new Administrador();
//propiedad de spring-security (true si el usuario no es anónimo)
@SuppressWarnings("unused")
private boolean autenticado;
//propiedad para guardar el param GET si hubo fallo en la autenticación de SS
private int error;
//Constructor vacío del Backing Bean controlador
public AutenticacionController() {
log.info("Creación del backing bean AutenticacionController");
}
@PostConstruct
public void init() {
//inicializar atributos del backing bean
log.info("PostConstruct del backing bean BarcoController");
}
//Getters y setters de atributos del backing bean
public Administrador getAdministrador() {
return administrador;
}
public void setAdministrador(Administrador administrador) {
this.administrador = administrador;
}
public boolean isAutenticado() {
Authentication autenticacion = SecurityContextHolder.getContext().getAuthentication();
boolean resultado = (autenticacion != null) &&
!(autenticacion instanceof AnonymousAuthenticationToken) &&
autenticacion.isAuthenticated();
return resultado;
}
public int getError() {
return error;
}
public void setError(int error) {
this.error = error;
}
//MÉTODO LISTENER del evento preRenderView en la página login.
//Para comprobar si la autenticación de Spring Security falló (error=1).
//En ese caso muestra el error con un faces message.
public void comprobarAuthException (ComponentSystemEvent event){
log.info("listener comprobarAuth");
if (error==1) {
String msj = "";
Exception e = (Exception) UtilJsf.getParamSessionMap(WebAttributes.AUTHENTICATION_EXCEPTION);
log.info("SSexception = "+((e==null)?"null":e.getMessage()));
if (e != null) {
String ultimoUsuario = (String) UtilJsf.getParamSessionMap(WebAttributes.LAST_USERNAME);
log.info("SS last_username = "+ultimoUsuario);
administrador.setLogin(ultimoUsuario);
if (e instanceof BadCredentialsException) {
msj = UtilJsf.getMsjProperties("msjsInfo", "UsuPwdIncorrectos");
} else {
msj = UtilJsf.getMsjProperties("msjsInfo", "ErrorAutenticacion");
}
UtilJsf.mostrarFacesMsjGlobal(msj);
}
}
return;
}
/* ******************************* */
/* Métodos "action" del form login */
/* ******************************* */
// EVENTO: Pulsar el botón "entrar" del form login
// Reenviar(FORWARD) la petición a la URL "/j_spring_security_check" para autenticarse
// También se debe configurar el filtro de spring-security para que procese forwards
public void loginAction() {
try {
FacesContext.getCurrentInstance().getExternalContext().dispatch("/j_spring_security_check");
} catch (IOException e) {
}
}
// EVENTO: Pulsar el boton "cancelar" en el form login
// No hacer nada --> Ir a la pantalla de inicio de la aplic
public String cancelarAction() {
return "/inicio";
}
}
在我的Spring Security的配置,我有:
authentication-failure-url="/faces/paginas/autenticacion/login.xhtml?error=1"
如果我從登錄頁面和監聽器中刪除錯誤參數和viewParam,我只是檢查Spring Security異常,它不起作用。
感謝註銷,我爲它的做法是相似的,我有以下鏈接它:
<h:outputLink value="#{request.contextPath}/j_spring_security_logout" rendered="#{autenticacionController.autenticado}">Cerrar sesión (Administrador)</h:outputLink>
謝謝你的回答。我的方法與您的方法類似,但如果我不將錯誤參數添加到已驗證的失敗登錄頁面,則不起作用。我使用preRenderView監聽器,但在方法中檢查錯誤參數。如果我不使用該參數,只檢查彈簧安全異常,則不起作用。我編輯我的問題添加我的代碼,以便您可以看到。對不起,如果我的英語不是很好,但我來自西班牙。 – choquero70 2012-01-19 22:09:44
@ choquero70我更新了我的答案,並提供了更多詳細信息......如果您瞭解,請告訴我。 – 2012-01-20 02:19:06
謝謝maple_shaft。我想我或多或少地理解你在說什麼,但我必須檢查它。雖然我不明白爲什麼有必要在你的onAuthenticationFailure方法中使用Spring Security異常作爲會話屬性(Spring Security被認爲是這樣做的,但是令人驚訝的是,當我在preRenderView監聽器中檢查它時,它是空的)。 – choquero70 2012-01-22 20:50:22