针对外部API的Spring身份验证

时间:2015-10-19 06:42:43

标签: java spring rest spring-security

我需要针对外部API对用户进行身份验证,我需要传递用户名密码。 API是 REST Web服务,它将返回 json对象。现在我需要提取" auth_token "(json中的一个元素)并在用户上下文中设置它以进一步请求,因为其他请求需要将此auth_token设置为标题。我们不需要编写认证逻辑。 API的所有登录逻辑都在API的结尾处理。 这是返回的JSON对象的样子:

{
  "success" : true,
  "auth_token" : "a2xvv-mqe_sV_Lhsggkd3Q",
  "email" : "****.***@***.com",
  "role" : "admin",
  "time_zone" : "Mumbai",
  "user_key" : "b3222tf92d",
  "sign_in_count" : 208,
  "organisation" : {
    "name" : null,
    "organisation_key" : null,
    "license" : {
      "license_key" : "tebde23823t5a76828e2et8683fd3b33e2eat5fb"
    }
  }
}

如何在spring安全性中实现此功能。 如果您尽可能向我提供示例步骤,那将是一个很大的帮助。

3 个答案:

答案 0 :(得分:1)

您没有说明如何在应用中获取用户凭据。我假设您有一个登录表单。

如果这是您的方案,则可以配置Spring Security来管理此登录表单。 Spring将以UsernamePasswordAuthenticationToken

的形式获取用户凭据

然后,您可以创建自定义org.springframework.security.authentication.AuthenticationProvider并覆盖此方法:

public Authentication authenticate(Authentication);

在此方法中,您可以提取用户凭据并使用您提及的 REST Web服务

获得 REST Web服务响应后,您可以使用UsernamePasswordAuthenticationToken完成AuthorityUtils。我看不到json中显示的角色,组或类似物,我想你可以从任何地方获取这些信息。

通过这种方式,您可以使用有效的authenticate覆盖SpringSecurityContext方法,并满足您的需求。

希望它有所帮助!

修改

为了回答评论,我提出了一个auth方法的样本:

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    UsernamePasswordAuthenticationToken token = null;
    Authentication result = null;
    User user = null;

    token = (UsernamePasswordAuthenticationToken) authentication;

    if (token != null) {
      if (StringUtils.isNotEmpty(token.getName())) {

        if (YOUR_AUTH_METHOD(token.getName(), (String) token.getCredentials())) {

                //DO what you want to retrieve authorization

                String[] auxAuth = new String[size];

                //Put your roles, groups, ... into auxAuth
      //Role names must be ROLE_XXXXX

                result = new UsernamePasswordAuthenticationToken(
                    token.getName(), token.getCredentials(),
                    AuthorityUtils.createAuthorityList(auxAuth));
            }
        }
    }

    return result;
}

使用此方法可以检索弹簧令牌,然后获取登录名和密码。最后,它管理用户自动化的角色,然后为Spring Security Context构建一个有效的令牌。

答案 1 :(得分:0)

您可以实施自定义AuthenticationProvider。有关详细信息,请参阅this blog post

答案 2 :(得分:0)

你应该实现自己的AuthenticationProvider和"注入它"在豆文件中。

以下是示例类的摘录:

public class LdapAuthProvider implements AuthenticationProvider {

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

        UserDetails user = userDetailsService.loadUserByUsername(username);
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(user,
                authentication.getCredentials(), user.getAuthorities());
        result.setDetails(authentication.getDetails());
        return result;
}

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

}

然后你需要将它注入AuthenticationManager,如下所示:

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="ldapAuthProvider"/>
</authentication-manager>

上述响应假设您了解Spring中的安全性基础(用户详细信息,身份验证令牌,身份验证管理器)。如果没有,请先阅读Spring Security docs