【问题标题】:Spring Boot Authorization Server send request to external service to get user detailsSpring Boot Authorization Server 向外部服务发送请求以获取用户详细信息
【发布时间】:2018-02-01 12:56:50
【问题描述】:

我有很多服务,我想通过身份验证服务集中我的身份验证。现在我是 Spring Boot 的新手,我不知道如何使这成为可能。

我只是从 Spring 中实现了正常的安全性,它工作得很好,我只找到了一些关于 jdbcAuthenticationinMemoryAuthentication 等的教程,但没有找到身份验证服务向另一个服务发送请求的身份验证。有人对此有所了解吗?

我基于令牌的安全性 -> JWT

我认为我需要操纵AuthenticationManagerBuilder,因为它决定了用户名是否有效。

protected void configure(AuthenticationManagerBuilder auth) throws Exception {
}

我向 Feign 提出请求 - 可能是此代码的错误位置

@Override
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException, IOException, ServletException {
    AccountCredentials credentials = new ObjectMapper()
            .readValue(req.getInputStream(), AccountCredentials.class);

    UserRequest userRequest = Feign.builder()
            .decoder(new GsonDecoder())
            .target(UserRequest.class,"http://localhost:7998/api/user-service/user/" + credentials.getUsername());

    return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(credentials.getUsername(),credentials.getPassword(),emptyList()));
}

【问题讨论】:

  • JWT 背后的理念是它们是无状态且自包含的。
  • 是的,但要获得令牌,您需要验证用户名和密码。而且这些数据不属于我的身份验证服务。他应该总是问我的用户服务。之后,他归还了令牌

标签: java spring spring-security authorization microservices


【解决方案1】:

你可以这样配置:

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception
{
    auth.userDetailsService(getUserDetailsService());
}

@Bean
UserDetailsService getUserDetailsService() {
  return username ->
  {
    JSONObject user = callUserService(username); //Here you send the UserRequest
    if(user.has("email")) {
       return new User(
         user.getString("email"),
         user.getString("password"),
         true, true, true, true,
         Collections.emptyList());
     } else {
          throw new BadCredentialsException("BadCredentialsException");
      }
    };
 }

【讨论】:

  • 是否有可能获取请求数据类型?因为它将通过请求正文发送,我需要我的 API 请求正文用户名。也许作为一个参数? PS:它适用于您的方法,只是我需要请求。
  • 我认为你需要提供一个你需要的例子。另外,如果此答案对您有用,请将其标记为正确。
  • 我不知道如何,但用户名已经从请求正文中获得了用户名:D 你能解释一下吗?返回用户名 -> {
  • 我认为这就是Spring 自动执行的操作。它获取您发送给授权服务的用户名并使用它来调用getUserDetailsService 返回的函数。
  • 如何从控制器获取用户名和密码给userDetailsS​​ervice?这样我们就可以将用户名和密码传递给外部 API。
猜你喜欢
  • 2020-07-17
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2016-11-27
  • 2016-06-02
  • 1970-01-01
相关资源
最近更新 更多