Skip to main content
 首页 » 编程设计

Spring Security Authentication Provider

2022年07月19日126shanyou

Spring Security Authentication Provider 介绍

本文介绍spring security如何相比简单的UserDetailService上实现灵活的认证。

Authentication Provider

spring security提供了多种执行认证方式,但都遵循一个简单的约定——AuthenticationProvider处理认证请求,然后返回授信后的完整认证对象。

标准的、最常用的实现是DaoAuthenticationProvider——从只读user Dao中返回 user details。user details仅通过username发挥整个用户实体,大多数场景这完全可以满足。

很多特定场景仍然需要访问完整的认证请求去执行认证过程——举例,当对一些外部第三方认证服务,认证请求需要用户名和密码,两者都是必须的。

针对这些情况,我们需要自定义Authentication Provider。

@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()) { 
   
            // 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); 
    } 
} 

注意,上面代码中返回的认证对象中授权权限是空,因为实际中应该有特定应用给提供。

注册Authentication Provider

现在Authentication Provider已经定义好了,我们需要在Security Configuration中进行注册,可以使用xml和javaConfig方式,两者意义都一样,下面给出javaConfig方式代码:

@Configuration 
@EnableWebSecurity 
@ComponentScan("org.baeldung.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(); 
    } 
} 

测试认证

对客户端来说,服务器端是否为自定义Authentication Provider都一样,我们使用简单的curl命令行工具(windows用户可以通过git bash)发送认证请求:

curl --header "Accept:application/json" -i --user user1:user1Pass  
    http://localhost:8080/spring-security-custom/api/foo/1 

上面示例中我们使用http基本认证保护rest api。因此从服务器端返回期望的200。

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Sun, 02 Jun 2013 17:50:40 GMT 

总结

本文讨论了如何在spring Security中自定义Authentication Provider。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/79824019