具有 Spring Security 和 Java Config 的自定义身份验证提供程序

Posted

技术标签:

【中文标题】具有 Spring Security 和 Java Config 的自定义身份验证提供程序【英文标题】:Custom Authentication provider with Spring Security and Java Config 【发布时间】:2014-05-01 15:40:38 【问题描述】:

如何使用 Spring Security 和 Java 配置来定义自定义身份验证提供程序? 我想在我自己的数据库上执行登录检查凭据。

【问题讨论】:

spring 安全文档为您提供所需的所有信息 - 如何配置配置的 XML 和端点。此外,您必须支持“创建帐户”、“忘记密码”等流程,您可以使用此开源:github.com/OhadR/oAuth2-sample/tree/master/authentication-flows 【参考方案1】:

以下是您需要的(CustomAuthenticationProvider 是您的实现,需要由 Spring 管理)

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        /**
         * Do your stuff here
         */
    

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

【讨论】:

除了现有的身份验证提供者之外,是否可以注册自定义身份验证提供者? @Seppl 我不认为这样的东西是开箱即用的(虽然我很容易被误会),但我很确定这样的东西可以相对容易地实现。查看this 根据 Spring Docu,auth.authenticationProvider() 将“根据传入的自定义 AuthenticationProvider 添加身份验证”。我猜你会以这种方式获得一堆提供者。【参考方案2】:

如baeldung.com 所示,定义您的身份验证提供程序如下:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider 

    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException 

        String name = authentication.getName();
        String password = authentication.getCredentials().toString();

        if (shouldAuthenticateAgainstThirdPartySystem(username, password)) 

            // use the credentials
            // and authenticate against the third-party system
            return new UsernamePasswordAuthenticationToken(
              name, password, new ArrayList<>());
         else 
            return null;
        
    

    @Override
    public boolean supports(Class<?> authentication) 
        return authentication.equals(
          UsernamePasswordAuthenticationToken.class);
    

下面的代码是对应的java配置:

@Configuration
@EnableWebSecurity
@ComponentScan("org.project.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private CustomAuthenticationProvider authProvider;

    @Override
    protected void configure(
      AuthenticationManagerBuilder auth) throws Exception 

        auth.authenticationProvider(authProvider);
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests().anyRequest().authenticated()
            .and()
            .httpBasic();
    

【讨论】:

您只是直接从baeldung.com/spring-security-authentication-provider 复制的。虽然答案肯定有帮助,但归属来源也是必要的。

以上是关于具有 Spring Security 和 Java Config 的自定义身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章

具有角色的经过身份验证的用户的 Spring Security Java 配置

具有 CAS 身份验证和自定义授权的 Spring Security

具有 Spring Security 的公共和私有 REST API

具有数据库角色的 Spring Security SAML

具有 Active Directory 和数据库角色的 Spring Security

具有Spring Security的多个用户