当前位置: 首页 > 知识库问答 >
问题:

如何使Spring Security在CAS服务器成功认证后将用户重定向到原始请求页面

潘翰藻
2023-03-14

我有一个spring boot RESTFul web应用程序,它使用CAS服务器进行企业单点登录。如果未登录的用户试图访问安全页,则该用户将被重定向到CAS服务器进行身份验证。在成功的身份验证后,用户会被重定向到spring boot RESTFul web应用程序的主页--而不是用户试图访问的安全页面。我们如何将用户直接重定向到安全页面,用户在成功登录后希望访问该页面?

spring-security-cas-client用于实现CAS身份验证。实现AuthenticationSuccessShandler以将UseReferer设置为true。Spring Security配置类如下所示:

package com.example.app

import java.util.Arrays;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.cas.ServiceProperties;
import org.springframework.security.cas.authentication.CasAuthenticationProvider;
import org.springframework.security.cas.web.CasAuthenticationFilter;    
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.security.web.authentication.logout.LogoutFilter;

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

private AuthenticationProvider authenticationProvider;
private AuthenticationEntryPoint authenticationEntryPoint;
private SingleSignOutFilter singleSignOutFilter;
private LogoutFilter logoutFilter;

@Autowired
public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, 
AuthenticationEntryPoint 
eP,
                      LogoutFilter lF
                      , SingleSignOutFilter ssF
) {
    this.authenticationProvider = casAuthenticationProvider;
    this.authenticationEntryPoint = eP;

    this.logoutFilter = lF;
    this.singleSignOutFilter = ssF;

}

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
    .antMatchers("/api/**", "/path-1", "/path-2")
    .authenticated()
    .and()
    .authorizeRequests()
    .regexMatchers("/")
    .permitAll()
    .and()
    .httpBasic()
    .authenticationEntryPoint(authenticationEntryPoint)
    .and()
    .logout().logoutSuccessUrl("/logout")
    .and()
    .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
    .addFilterBefore(logoutFilter, LogoutFilter.class);

}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.authenticationProvider(authenticationProvider);
}

@Override
protected AuthenticationManager authenticationManager() throws Exception {
  return new ProviderManager(Arrays.asList(authenticationProvider));
}

@Bean
public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception {
  CasAuthenticationFilter filter = new CasAuthenticationFilter();
  filter.setServiceProperties(sP);
  filter.setAuthenticationManager(authenticationManager());
  return filter;
}

@Bean
public AuthenticationSuccessHandler successHandler() {
    SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
    handler.setUseReferer(true);
    return handler;
}

共有1个答案

龙令
2023-03-14

使用SavedRequestAwareAuthenticationSuccessShandler而不是SimpleEurlAuthenticationSuccessShandler可能有助于实现重定向。

@Bean
public AuthenticationSuccessHandler successHandler() {
    SavedRequestAwareAuthenticationSuccessHandler handler = new SavedRequestAwareAuthenticationSuccessHandler();
    handler.setTargetUrlParameter("redirectTo");
    handler.setDefaultTargetUrl("/");
    return handler;
}
 类似资料:
  • 本文首次展示了SAML认证的过程:https://developers.google.com/google-apps/sso/saml_reference_implementation 我的应用程序目前与之兼容。但是,当用户单击SP提供的页面上的链接时,请求被重定向到IDP进行身份验证。用户可以在地址栏中清楚地看到IDP URL,感觉很慢。 我的情况:SP位于Jetty上,IDP位于Jboss6.

  • 问题内容: 我正在构建我的第一个Angular.js应用程序,并且正在使用Yeoman。 Yeoman使用Grunt来允许您使用命令’grunt server’运行node.js连接服务器。 我正在html5模式下运行我的angular应用程序。根据angular文档,这需要修改服务器以将所有请求重定向到应用程序的根目录(index.html),因为angular应用程序是单页ajax应用程序。

  • 根据OneLogin留档,通过API调用登录用户的最后步骤是: 生成session_token并通过表单POST将其提交到OneLogin url 然后OneLogin服务器将为您启动会话,并向您的浏览器返回一个仅适用于httpOnly的域特定cookie 识别表单POST返回了302重定向状态,并将用户发送到另一个页面 我的问题是你应该如何处理第三个问题?尤其是对于返回的cookie。 文档指出

  • 在我的Laravel应用程序中,我有一个只能由Auth用户访问的私人页面。我也使用社交登录,所以当用户未登录就进入私人页面时,Laravel会将用户发送到登录页面,成功登录后,用户会被发送回原始目的地(私人页面)。只有当用户通过Laravel内置认证系统登录时,但当用户通过社交登录方法登录时,用户将被引导到主页。 这是我登录后的社交登录处理程序: 如果用户在会话中出现,我如何将其发送到原始目的地,

  • 我正在我是身份提供者的地方实施SSO,现在我能够成功登录到服务提供者。但它把我带到了主页。我想在发布响应时指定着陆页URL。搜索了很多,但找不到任何令人信服的东西。不太知道SAML响应的哪个元素携带着陆页URL或采用我必须指定的形式。使用java和opensaml库生成响应。

  • 嗨,我需要知道如何通过验证用户角色来重定向应用程序,就像:如果ROLE_USER重定向到accountuser.xhtml或者如果ROLE_ADMIN重定向到accountadmin.xtml那样 使用spring security 和身份验证方法 这是我的账户流水: