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

如何更改Spring Security SAML的默认SP SSO URL?

姚浩歌
2023-03-14

我尝试在我的项目中集成Spring Security SAML。我体验过okta的演示。我知道URI /saml/SSO用于使用Idp中的SAML响应。但是我在我的Idp中注册了一个与URI /saml/SSO不同的消费-uri,它不能更改。

因此,我必须找到一种方法来更改默认的SSO进程URL。

我想我需要在下一步做一些改变:

  1. 更改FilterChainProxy
public FilterChainProxy samlFilter() throws Exception {
        List<SecurityFilterChain> chains = new ArrayList<>();
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"),
                samlEntryPoint));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/logout/**"),
                samlLogoutFilter));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/metadata/**"),
                metadataDisplayFilter));
        // chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"),
        // samlWebSSOProcessingFilter()));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/consume/**"),
        samlWebSSOProcessingFilter()));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSOHoK/**"),
                samlWebSSOHoKProcessingFilter()));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SingleLogout/**"),
                samlLogoutProcessingFilter));
        chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"),
                samlDiscovery));
        return new FilterChainProxy(chains);
       }
public class CustomSAMLProcessingFilter extends SAMLProcessingFilter {
    public CustomSAMLProcessingFilter() {
        this("/saml/consume");
    }

    public CustomSAMLProcessingFilter(String defaultFilterProcessesUrl) {
        super(defaultFilterProcessesUrl);
    }

    @Override
    protected String getProfileName() {
        return super.getProfileName();
    }

    @Override
    protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {
        return super.requiresAuthentication(request, response);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        return super.attemptAuthentication(request, response);
    }
}
    @Bean
    public SAMLProcessingFilter samlWebSSOProcessingFilter() throws Exception {
        // SAMLProcessingFilter samlWebSSOProcessingFilter = new SAMLProcessingFilter();
        SAMLProcessingFilter samlWebSSOProcessingFilter = new CustomSAMLProcessingFilter("/saml/consume");
        samlWebSSOProcessingFilter.setAuthenticationManager(authenticationManager());
        samlWebSSOProcessingFilter.setAuthenticationSuccessHandler(samlAuthSuccessHandler);
        samlWebSSOProcessingFilter.setAuthenticationFailureHandler(samlAuthFailureHandler);
        return samlWebSSOProcessingFilter;
    }
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/pre-auth**").permitAll()
                .antMatchers("/form-login**").permitAll()
                .antMatchers("/error").permitAll()
                .antMatchers("/saml/**").permitAll()
                .antMatchers("/saml2/**").permitAll()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/img/**").permitAll()
                .antMatchers("/js/**").permitAll()
                .antMatchers("/sw.js").permitAll()
                .anyRequest().authenticated();

之后,当我尝试登录时,过滤器链中没有任何反应。在控制台中,我的项目收到了SAML响应,但没有更多反应。网页显示错误页面。

当我之前做过Okat演示时,它得到了我的登录信息并显示在成功页面中。

我想知道如何更改默认SSO进程URL并成功登录。请你们给我一些想法或建议来帮助我解决这个问题,谢谢!

共有1个答案

巫马昆琦
2023-03-14

您似乎正在使用旧的处于维护模式的spring security saml项目。请改用Spring Security的SAML支持。

在Spring Security的SAML支持中,断言ConsumerServiceLocation的默认值是登录/saml2/sso/{registrationId}
应用程序将处理任何包含SAMLResponse参数的POST请求。

您可以在创建相关PartyRegistration时对此进行自定义。

如果您使用的是Spring Boot,您可以在application.yml.中配置它

spring:
  security:
    saml2:
      relyingparty:
        registration:
          one:
            identityprovider:
              metadata-uri: https://idp/metadata.php
            acs:
              location: "{baseUrl}/custom/{registrationId}"

要更新登录处理URL,您可以自定义HttpSecurity

http
    .saml2Login(saml2 -> saml2
            .loginProcessingUrl("/custom/{registrationId}")
    );
 类似资料:
  • 问题内容: 尝试更改列的数据类型并设置新的默认值时遇到以下错误: 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’VARCHAR(255)NOT NULL SET DEFAULT’{}’‘附近使用正确的语法 问题答案: 同样的第二种可能性(感谢juergen_d):

  • 在尝试更改列的数据类型并设置新的默认值时,我遇到以下错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解第1行“varchar(255)NOT NULL SET DEFAULT”{}“附近使用的正确语法

  • 问题内容: 如何更改默认的Virtualenvwrapper提示符?默认情况下,使用“ workon <name_of_env>”之类的命令在特定的虚拟环境上工作,会将virtualenv的名称添加到提示中。如果您未使用默认命令提示符,则此方法可能效果不佳。 问题答案: 默认情况下,当使用命令“ workon ”切换到virtualenv时,virtualenvwrapper将在字符串(( ))前

  • 问题内容: 我使用IntelliJ IDEA作为开发环境,并使用Maven进行依赖项管理。我经常在IDEA之外构建我的项目结构(目录,poms等),然后使用将该项目导入。这很好用,除了在poms中我指定maven-compiler-plugin应该使用JDK 1.6,并且在导入时,IDEA通知我和,然后提示重新加载项目。这很烦人,因为我总是使用相同的JDK版本。 如何更改IntelliJ IDEA

  • xampp中的php.ini文件位于此处: phpinfo包含以下信息: 配置文件(php.ini)路径C:\WINDOWS 已加载的配置文件(无) 扫描此目录以获取更多信息。ini文件(无) 如何更改目录?

  • 当启动一个流浪者盒子时,“默认”这个名字来自哪里? 有没有办法设定这个?

  • 我如何更改IntelliJ IDEA使用的默认JDK,这样我就不必在每次导入新项目时重新加载我的项目了?

  • 问题内容: 我有一个表,其中的列类型为默认值,每次更新都更新为。 我想删除此列上的“更新时”功能。如何编写alter语句? 我尝试了以下方法: 但这没用。 问题答案: 皮特几乎是正确的,但对“更改”使用了错误的语法: 请注意,您必须重复列名。另外,请确保您使用反引号而不是单引号来转义列名时间,以防止将其解释为mysql列时间类型。 通过指定CURRENT_TIMESTAMP的默认值,MySQL将不