如何重定向到一个简单的页面?

时间:2018-05-10 08:58:28

标签: java spring spring-security

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

表单和基本登录选项

您可能想知道在提示您登录时登录表单的来源,因为我们没有提及任何HTML文件或JSP。事实上,由于我们没有为登录页面明确设置URL,因此Spring Security会根据启用的功能自动生成一个URL,并使用处理提交的登录的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元素中省略了pattern属性,则它匹配所有请求。创建不安全模式是此语法的一个简单示例,其中模式映射到空过滤器链[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的一个实例。您可以在Core Filters一章以及命名空间附录中找到更多相关内容,以及有关如何在身份验证失败时自定义流的信息。

Spring Security Reference docs

相关问题