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

使用Spring Security在一个应用程序中结合数据库和SAML身份验证

邵刚洁
2023-03-14

我正在尝试使用Spring Security(spring-security-starter)在Spring boot(2.2.4)应用程序中实现身份验证和授权。

用例:基于用户名,我想将用户重定向到特定的身份验证提供者

>

  • 如果用户名以“mit”结尾。com’使用数据库验证用户身份(我使用的是hibernate)——为此,我可以使用spring的UserDetailService
  • 如果用户名以“eInfo”结尾。com使用SAML2.0协议对用户进行身份验证——使用身份提供者,如Okta、SSOCIRCE、OneLogin等。

    我无法得到我怎么能做到这一点。我尝试使用自定义过滤器,但不能这样做。

    我读了很多文章,但都没能做到这一点。

    我只使用SAML编写了以下验证代码。它运转良好。将用户带到okta idp进行登录。

    package com.example.demo;
    
    import static org.springframework.security.extensions.saml2.config.SAMLConfigurer.saml;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.HttpMethod;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.saml.userdetails.SAMLUserDetailsService;
    
    @EnableWebSecurity
    @Configuration
    @EnableGlobalMethodSecurity(securedEnabled = true)
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Autowired
        SAMLUserDetailsService userDetailsService;
    
        @Value("${security.saml2.metadata-url}")
        String metadataUrl;
    
        @Value("${server.ssl.key-alias}")
        String keyAlias;
    
        @Value("${server.ssl.key-store-password}")
        String password;
    
        @Value("${server.port}")
        String port;
    
        @Value("${server.ssl.key-store}")
        String keyStoreFilePath;   
    
        //Uisng SAML2.0
        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .apply(saml())
                    .serviceProvider()
                        .keyStore()
                            .storeFilePath(this.keyStoreFilePath)
                            .password(this.password)
                            .keyname(this.keyAlias)
                            .keyPassword(this.password)
                            .and()
                        .protocol("https")
                        .hostname(String.format("%s:%s", "localhost", this.port))
                        .basePath("/")
                        .and().userDetailsService(userDetailsService)
                    .identityProvider()
                    .metadataFilePath(this.metadataUrl);
        }
    
    }
    

    任何人都可以指导我,这样我就可以配置任何IDP,比如okta、SSOCIRCE、OneLogin等。

  • 共有1个答案

    充浩波
    2023-03-14

    利用Spring Security的AuthenticationProvider实现多个自定义身份验证提供程序,并按适当的顺序注册它们(按顺序进行评估)。

    自定义数据库身份验证提供程序

    public class MitComAuthProvider implements AuthenticationProvider {
       public Authentication authenticate(Authentication auth) {
          // if user matches 'mit.com', auth with database
          // look up and auth
          // else return null (to try next auth provider)
       }
    }
    

    自定义SAML身份验证提供程序(与Spring Security一起提供)

    public class EInfoChipsAuthProvider extends SAMLAuthenticationProvider {
       public Authentication authenticate(Authentication auth) {
          // if user matches 'einfochips.com', auth with SAML
          // super.authentication(auth)
          // else return null (to try next auth provider) or throw auth exception
       }
    }
    

    然后,在您的WebSecurityConfigrerAdapter中注册两个身份验证提供程序

    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
       @Autowired
       private MitComAuthProvider mitComAuthProvider;
    
       @Autowired
       private EInfoChipsAuthProvider eInfoChipsAuthProvider;
    
       public void configure(AuthenticationManagerBuilder auth) throws Exception {
           auth.authenticationProvider(mitComAuthProvider);
           auth.authenticationProvider(eInfoChipsAuthProvider);
       }
    
       ...
    }
    
     类似资料:
    • 我有另一个web应用程序B(显然它有自己的数据库)。我希望应用程序B的用户应该使用activiti explorer。因此,我需要应用程序B的身份验证,我需要使用什么方法/步骤。

    • 问题内容: 我想在我的Java应用程序中使用Windows NTLM认证来透明地认证Intranet用户。如果使用浏览器(单点登录),用户将不会注意到任何身份验证。 我发现了一些具有NTLM支持的库,但是不知道要使用哪个库: http://spnego.sourceforge.net/ http://sourceforge.net/projects/ntlmv2auth/ http://jcifs

    • 我有一个Java桌面应用程序。我发现了很多关于web应用SSO身份验证的在线资源。我需要一个旧的学校桌面应用程序同样的东西。基本上,我需要该应用程序打开浏览器窗口,让用户根据ADF进行身份验证,然后取回令牌。 如何使用ADFS/SAML添加SSO身份验证?

    • 我正在使用带有azure AD登录选项(OpenId身份验证)的mvc应用程序。我需要为管理员提供模拟选项。所以我决定对这个模拟登录使用表单身份验证。现在我的问题是在webconfig中启用表单身份验证会影响azure AD登录。一旦添加了表单身份验证,它将使用belo url连续显示重定向,http://localhost:9666/members/logon?ReturnUrl=/member

    • 实际上,我们正在开发一个应用程序,在Spring boot 1.5中,通过oauth2实现的Spring security完成身份验证和授权,现在我们有一个要求,在身份验证部分,拆分身份验证,并将身份验证部分转移到第三方,即SAML集成, 流程:登录- 如何在my spring security中仅使用userid授权用户,并生成自定义令牌(自定义任何spring security筛选器), 如何

    • 我正在尝试制作一个适配器,它将显示给listview实时数据库内容。 带适配器返回null得身份验证: 类: 请求布局: