Spring Security 3.1.4使用同一身份验证管理器在不同页面上创建多个登录表单

Spring Security 3.1.4使用同一身份验证管理器在不同页面上创建多个登录表单,spring,login,spring-security,spring-social,Spring,Login,Spring Security,Spring Social,事实上,我已经被这个问题困扰了一段时间,现在不知道该怎么进一步了。 我希望有多个标记,但据我所知,这在同一个http块中是不可能的。 原因是我希望身份验证失败url指向登录尝试来自的页面(并且在成功尝试时将用户重定向回该站点) 我有一个header.jsp文件,其中有我的登录表单。我希望将来在我的所有页面上都包含这一点,以便用户能够从所有页面登录,而无需重定向 我该怎么做 我的大部分代码都取自spring示例。(安全+社会+注册示例) 这是my security.xml的重要部分(没有任何尝试)

事实上,我已经被这个问题困扰了一段时间,现在不知道该怎么进一步了。 我希望有多个标记,但据我所知,这在同一个http块中是不可能的。 原因是我希望身份验证失败url指向登录尝试来自的页面(并且在成功尝试时将用户重定向回该站点)

我有一个header.jsp文件,其中有我的登录表单。我希望将来在我的所有页面上都包含这一点,以便用户能够从所有页面登录,而无需重定向

我该怎么做

我的大部分代码都取自spring示例。(安全+社会+注册示例) 这是my security.xml的重要部分(没有任何尝试)

另一种尝试是在security.xml中创建一个过滤器,以正确路由流量。我不知道怎么做

我希望有人能在这方面帮助我,并说什么是合适的方法

致以最良好的祝愿,
Nilsi

通过Ajax发布登录表单,如果需要,在成功登录时刷新当前页面(可能会提示用户这样做),或者在登录失败时显示错误消息“login failed”

要执行此操作,请实现自定义的
AuthenticationSuccessHandler
AuthenticationFailureHandler

成功:返回HTTP 204 No内容作为成功的指示,并在客户端重新加载页面


失败:返回HTTP 401 Unauthorized以指示失败,并在客户端显示错误消息

原因是我希望身份验证失败url指向登录尝试来自的页面(并且在成功尝试时将用户重定向回该站点)

为此,我们在项目中添加了非常简单的入口点,如下所示:

<http ... entry-point-ref="LoginUrlAuthenticationEntryPoint"> 
   ...
然后使用
RedirectUrlBuilder
创建类似
http://mysite/signin?redirect_url=http://mysite/some_page.jsp
并从此方法返回。差不多完成了

成功登录后,分析参数
重定向\u url
并将用户重定向到it页面

<!-- Login place 1, sign in page -->
<http pattern="/signin" use-expressions="true">
    <form-login login-page="/signin" login-processing-url="/signin/authenticate" authentication-failure-url="/signin?error=bad_credentials" />
    <intercept-url pattern="/addcourse" access="isAuthenticated()" />
    <logout logout-url="/signout" delete-cookies="JSESSIONID" />
</http>

<!--Login place 2, start page -->
<http pattern="/" use-expressions="true">
    <form-login login-page="/" login-processing-url="/signin/authenticate" authentication-failure-url="/?error=bad_credentials" />
    <logout logout-url="/signout" delete-cookies="JSESSIONID" />
</http>
Sep 26, 2013 11:57:43 PM org.apache.catalina.core.StandardContext listenerStart

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'providerSignInController' defined in class path resource [com/courseportal/project/config/SocialConfig.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.security.web.savedrequest.RequestCache]: : No qualifying bean of type [org.springframework.security.web.savedrequest.RequestCache] is defined: expected single matching bean but found 2: org.springframework.security.web.savedrequest.HttpSessionRequestCache#0,org.springframework.security.web.savedrequest.HttpSessionRequestCache#1; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.security.web.savedrequest.RequestCache] is defined: expected single matching bean but found 2: org.springframework.security.web.savedrequest.HttpSessionRequestCache#0,org.springframework.security.web.savedrequest.HttpSessionRequestCache#1

    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
<http ... entry-point-ref="LoginUrlAuthenticationEntryPoint"> 
   ...
<bean id="LoginUrlAuthenticationEntryPoint"
 class="YOU_CLASS_LoginUrlAuthenticationEntryPoint">
 <property name="loginFormUrl" value="/signin" />
</bean>
import import org.springframework.security.web.util.*;
...
public class YOU_CLASS_LoginUrlAuthenticationEntryPoint extends
    LoginUrlAuthenticationEntryPoint {
...
@Override
protected String buildRedirectUrlToLoginPage(
      HttpServletRequest request, 
      HttpServletResponse response,
      AuthenticationException authException) {
//following code check if your on login page already, then you don't add redirect
    String loginForm = 
        determineUrlToUseForThisRequest(request, response, authException);

    if (UrlUtils.isAbsoluteUrl(loginForm)) {
        return loginForm;
    }