我需要针对外部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安全性中实现此功能。 如果您尽可能向我提供示例步骤,那将是一个很大的帮助。
答案 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。