6

我目前有一个看起来像这样的设置:

弹簧安全.xml:

<http auto-config="true">
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page="/login"
                default-target-url="/main.html"
                authentication-failure-url="/failedLogin"/>
    <logout logout-url="/logout.html" logout-success-url="/login" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="foo" password="bar" authorities="ROLE_USER" />                
        </user-service>
    </authentication-provider>
</authentication-manager>

网页.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这一切似乎都按预期工作,但是,在特殊情况下,如果用户传入特殊令牌,我希望绕过登录页面。因此,目前,如果用户访问诸如 之类的 url /dog,他们将看到登录页面,如果他们传递了凭据,foo/bar那么他们将登录并看到对应于 的页面/dog

我希望能够使用 URL,例如/dog?token=abcd绕过登录屏幕并将它们直接带到与/dog. 如果他们提供了无效的令牌,那么他们只会看到拒绝访问页面。

4

1 回答 1

9

在 Spring Security 中,您想要涵盖的场景在参考手册的Pre-Authentication Scenarios一章中进行了描述。

基本上你必须:

  • 通过扩展AbstractPreAuthenticatedProcessingFilter或选择其实现之一来创建自定义过滤器,
  • 注册自定义过滤器<custom-filter position="PRE_AUTH_FILTER" ref="yourPreAuthFilter" />
  • 实施或选择实施AuthenticationUserDetailsService的s之一,
  • PreAuthenticatedAuthenticationProvider在(with <property name="yourPreAuthenticatedUserDetailsService">)中注册服务。

编辑:在这个答案中,OP 展示了他实现自定义的方式PRE_AUTH_FILTER

于 2012-08-19T12:42:13.620 回答