1

我实际上已经坚持了一段时间,现在不知道如何更进一步。我想拥有多个标签,但据我了解,这在同一个 http 块中是不可能的。这样做的原因是我希望 authentication-failure-url 指向登录尝试来自的页面(并且在成功尝试时还将用户重定向回该站点)。

我有一个文件 header.jsp,其中有我的登录表单。而且我希望将来在我的所有页面上都包含它,以使用户能够从所有页面登录而不会被重定向。

我该怎么做呢?

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

<http pattern="/resources/**" security="none" />

<http pattern="/project/" security="none" />

<http use-expressions="true">

        <!-- Authentication policy -->

        <form-login login-page="/signin" login-processing-url="/signin/authenticate" authentication-failure-url="/signin?error=bad_credentials" />

        <logout logout-url="/signout" delete-cookies="JSESSIONID" />

        <intercept-url pattern="/addcourse" access="isAuthenticated()" />

        <!--<intercept-url pattern="/**" access="isAuthenticated()"  />-->

</http>

据我了解,我可以使用多个 HTTP 块?像这样的东西:

<!-- 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)

另一种尝试是在 security.xml 中创建一个过滤器,以正确路由流量。我不确定如何做到这一点。

我希望有人可以帮助我,并说什么方法是合适的。

最好的问候,尼尔西

4

2 回答 2

1

我要准确回答

这样做的原因是我希望 authentication-failure-url 指向登录尝试来自的页面(并且在成功尝试时还将用户重定向回该站点)。

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

<http ... entry-point-ref="LoginUrlAuthenticationEntryPoint"> 
   ...

之后在同一个春天,我们定义了入口点:

<bean id="LoginUrlAuthenticationEntryPoint"
 class="YOU_CLASS_LoginUrlAuthenticationEntryPoint">
 <property name="loginFormUrl" value="/signin" />
</bean>

现在您已将入口点声明为org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint. 这样做的目的是在登录后添加到登录 url 返回真实页面的路径,因此您的登录 url 将如下所示:http://mysite/signin?redirect_url=http://mysite/some_page.jsp

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

之后使用RedirectUrlBuilder创建看起来像的路径http://mysite/signin?redirect_url=http://mysite/some_page.jsp并从此方法返回它。快完成了……

成功登录后分析参数redirect_url并将用户重定向到它的页面

于 2013-10-05T08:50:40.237 回答
-1

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

为此,请实现自定义AuthenticationSuccessHandlerand AuthenticationFailureHandler

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

失败:返回 HTTP 401 Unauthorized 表示失败,并在客户端显示错误信息

于 2013-10-01T19:41:03.453 回答