我可以使用API​​调用通过Spring Security对其他应用程序进行身份验证吗?

时间:2019-01-29 20:08:00

标签: spring spring-boot spring-security

我正在使用Spring Boot。最终目标是创建一个简单的仪表板,以提供有关通过Tomcat部署的另一个Web应用程序的统计信息和示例。 API调用。您还可以使用API​​通过SOAP进行身份验证,这是我目前想通过HTTPS执行的操作。我一直在寻找Spring Security这样的指南:https://www.baeldung.com/spring-security-authentication-provider

我的主要问题是:Spring Security是否适合我想要做的事情?根据上面的链接,我有以下代码:

@Component
public class CustomAuthenticationProvider
  implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {

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

        try {

            ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
            a.authenticate(name, password);

            //authentication successful return token
            return new UsernamePasswordAuthenticationToken(
                name, password, new ArrayList<>());

        } catch(ApiAuthenticationException e) {
            //Authentication failed return null
            return null;
        }
    }

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

我是不是把这棵树弄错了?这更多的是业余爱好/学习项目,因此,如果我愿意,我总是可以放弃这个想法并尝试其他尝试。

1 个答案:

答案 0 :(得分:0)

这当然是解决问题的一种方法。在您的示例中,假设您已经配置了httpBasic()身份验证

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .httpBasic();
    }

formLogin()身份验证

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .formLogin();
    }

这些情况中的每一个都会在过滤器链中插入一个过滤器。这些过滤器将从标题(http-basic)或HTTP参数(form-login)中读取用户名和密码。它采用这些值并创建UsernamePasswordAuthenticationToken并调用您的自定义处理程序。

您也可以通过简单地实现过滤器而完全无需自定义身份验证提供程序来完成此操作

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .addFilter(new MyCustomFilter());
    }


    public static class MyCustomFilter extends OncePerRequestFilter {
        public void doFilterInternal(HttpServletRequest request,
                                     HttpServletResponse response,
                                     FilterChain chain) {

       if (<should we attempt authentication based on logic> {
           try {
               String username = ...
               String password = ...
               ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
               a.authenticate(name, password);

               //authentication successful return token
              SecurityContextHolder
                  .getContext()
                  .setAuthentication(
                      new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>())
                  );

            } catch(ApiAuthenticationException e) {
                //Authentication failed maybe log it?
            }       
        }
        //continue
        chain.doFilter(request, response);
    }

千种为猫皮的方法。您选择一个适合您的产品。身份验证提供程序方法有效,您只需要知道有一个过滤器可以为您创建UsernamePasswordAuthenticationToken对象。如果不配置这些过滤器,则永远不会获得回调到身份验证提供程序。