我正在开发使用Spring Security 3和LDAP进行身份验证的Spring应用程序。
这是我的代码中的表单登录片段:
<security:form-login
authentication-failure-url="/index.xhtml?error=true"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
当身份验证失败时,我的应用程序将重定向到“/index.xhtml?error=true”url。问题是我不知道如何捕获“错误”变量并在index.xhtml文件中显示一些身份验证失败消息。我没有使用Spring mvc。
第二个问题是更改authentication-failure-url不起作用。
<security:form-login
authentication-failure-url="/error.xhtml"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
我更改了authentication-failure-url,但是尽管有这个改变,它仍然重定向到index.xhtml文件而没有任何变量。
我该如何解决这个问题?
答案 0 :(得分:3)
如果你的index.xhtml
是一个JSP,你可以这样做(直接来自Spring 3 Recipes一书):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty param.error}">
Login error.
Reason ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</c:if>
答案 1 :(得分:1)
重要提示:/index.xhtml?error=true
将error
作为GET
参数发送。
如果您的index.xhtml
是JSP文件,则可以使用隐式request
引用访问该参数:
<%= request.getParameter("error") %>
如果index.xhtml
是您的Web控制器方法/ servlet的URL,则需要从error
对象获取Request
param。
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
String error = req.getParameter("error");
}
最后,如果您的index.xhtml
是一个普通的html文件,您可以使用Java Script获取该参数:
How to retrieve GET parameters from javascript?
关于第二个问题:确保正确重建项目。看起来它没有注意到你的变化。
答案 2 :(得分:0)
<security:form-login
authentication-failure-url="/error.xhtml"
default-target-url="/SomeDefaultUrl.xhtml"
login-page="/index.xhtml" />
“我更改了authentication-failure-url,但是尽管有这个更改,它仍然会重定向到index.xhtml文件而没有任何变量。”
答案:请在<http auto-config="true" use-expressions="true"></http>
正文中定义以下拦截网址。
<intercept-url pattern="/error.xhtml" access="permitAll"/>
您可能没有定义 /error.xhtml 的访问权限,这就是为什么 authentication-failure-url 值不可接受并且正在进入下一个逻辑URL的原因定义即 /index.html
答案 3 :(得分:0)
这里没有任何解决方案适用于我,然后我找到了这个问题,它为我提供了正确的解决方案: spring security 3.1. custom authentication-failure-url with url parameters