首页 > 解决方案 > 如何重定向到一个简单的页面?

问题描述

我正在使用 Spring Security,但我遇到了一个大问题。

用户登录并关闭页面后,当他再次进入“mysite.com”时,他应该被重定向到“/dashboard”,但他收到错误 404,找不到页面。

他再次登录的唯一方法是使用其他浏览器或服务器。

我的配置有什么问题??如果他已经登录,它不会重定向到 /dashboard。

  @Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
            .antMatchers("/settings", "/users", "/teams", "/docker-status", "/container-creation").hasAuthority("Administrator")
            .anyRequest().authenticated()
            .and()
            .formLogin().permitAll()
                .loginPage("/login").permitAll()
                .defaultSuccessUrl("/dashboard")
                .failureUrl("/login?error")
                .successHandler(authenticationSuccessHandler)
            .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .logoutSuccessHandler(logoutSuccessHandler)
            .and()
            .exceptionHandling().accessDeniedHandler(accessDeniedHandler);
}

标签: javaspringspring-security

解决方案


表单和基本登录选项

当提示您登录时,您可能想知道登录表单是从哪里来的,因为我们没有提到任何 HTML 文件或 JSP。事实上,由于我们没有为登录页面显式设置 URL,Spring Security 会自动生成一个,基于启用的功能并使用处理提交登录的 URL 的标准值,用户将使用的默认目标 URL登录后发送到等等。但是,命名空间提供了大量支持以允许您自定义这些选项。例如,如果您想提供自己的登录页面,您可以使用:

<http>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>

另请注意,我们添加了一个额外的intercept-url元素来说明对登录页面的任何请求都应该可供匿名用户使用 [3] 以及 AuthenticatedVoter 类,以获取有关如何处理 IS_AUTHENTICATED_ANONYMOUSLY 值的更多详细信息。]。否则请求将被模式 /** 匹配,并且无法访问登录页面本身!这是一个常见的配置错误,会导致应用程序出现无限循环。如果您的登录页面看起来是安全的,Spring Security 将在日志中发出警告。也可以让所有匹配特定模式的请求完全绕过安全过滤器链,方法是为模式定义一个单独的 http 元素,如下所示:

<http pattern="/css/**" security="none"/>
<http pattern="/login.jsp*" security="none"/>

<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page='/login.jsp'/>
</http>

从 Spring Security 3.1 开始,现在可以使用多个 http 元素为不同的请求模式定义单独的安全过滤器链配置。如果从 http 元素中省略了模式属性,则它匹配所有请求。创建不安全模式是这种语法的一个简单示例,其中模式被映射到一个空的过滤器链 [4]。我们将在“安全过滤器链”一章中更详细地了解这种新语法。

重要的是要意识到这些不安全的请求将完全忽略任何与 Spring Security web 相关的配置或其他属性,例如 requires-channel,因此您将无法访问当前用户的信息或在请求期间调用安全方法。如果您仍希望应用安全过滤器链,请使用 access='IS_AUTHENTICATED_ANONYMOUSLY' 作为替代方案。

如果您想使用基本身份验证而不是表单登录,则将配置更改为

<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<http-basic />
</http>

然后,基本身份验证将优先,并在用户尝试访问受保护的资源时用于提示登录。如果您希望使用表单登录,则在此配置中仍然可用,例如通过嵌入在另一个网页中的登录表单。

设置默认登录后目标

如果尝试访问受保护资源时未提示表单登录,则default-target-url选项将发挥作用。这是用户成功登录后将转到的 URL,默认为“/”。您还可以通过将 always-use-default-target 属性设置为“true”来进行配置,以便用户始终在此页面结束(无论登录是“按需”还是他们明确选择登录) . 如果您的应用程序始终要求用户从“主页”页面开始,这将非常有用,例如:

<http pattern="/login.htm*" security="none"/>
<http use-expressions="false">
<intercept-url pattern='/**' access='ROLE_USER' />
<form-login login-page='/login.htm' default-target-url='/home.htm'
        always-use-default-target='true' />
</http>

为了更好地控制目标,您可以使用 authentication-success-handler-ref 属性作为default-target-url的替代方法。引用的 bean 应该是 AuthenticationSuccessHandler 的一个实例。您将在核心过滤器一章和命名空间附录中找到更多相关信息,以及有关在身份验证失败时如何自定义流程的信息。

Spring 安全参考文档


推荐阅读