当前位置: 首页 > 知识库问答 >
问题:

在Spring Security中实现自定义身份验证

井疏珂
2023-03-14

关于我在Spring安全方面的问题,我想请求你的帮助。我有一个要求,其中我必须验证登录凭据的基础上的选项所选择的用户。选项1将通过第三方服务验证登录用户。选项2将是使用数据库身份验证级别的常规验证。我如何实现这一点?

共有1个答案

江同化
2023-03-14

总体战略

  1. 提供org.springframework.security.authentication.authenticationprovider的自定义实现,将身份验证委托给适当的后端(第三方服务、另一个authenticationprovider等)。
  2. 将用户选择的选项传递给自定义AuthenticationProvider,使其能够选择正确的身份验证后端。
  3. 将自定义AuthenticationProvider配置为默认身份验证提供程序

步骤1:实现AuthenticationProvider

AuthenticationProvider是具有单个方法的接口。因此,自定义实现可能如下所示:

class DelegatingAuthenticationProvider implements AuthenticationProvider {
  @Autowired
  private ThirdPartyAuthenticationService service;

  @Autowired
  @Qualifier("anotherAuthenticationProvider")
  private AuthenticationProvider provider;

  @Override
  public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
    // Get the user selection.
    String selection = (String) authentication.getDetails();

    // Take action depending on the selection.
    Authentication result;
    if("ThirdParty".equals(selection)) {
      // Authenticate using "service" and generate a new
      // Authentication "result" appropriately.
    }
    else {
      // Authenticate using "provider" and generate a new
      // Authentication "result" appropriately.
    }

    return result;
  }
}

步骤2:将用户选择传递给AuthenticationProvider

上面的AuthenticationProvider实现从Authentication对象的Details属性中提取用户选择。大概,在调用AuthenticationProvider之前,必须从HttpServletRequest中提取用户选择并将其添加到Authentication对象中。这意味着,在调用AuthenticationProvider之前,需要调用同时访问AuthenticationHttpServletRequest对象的另一个组件。

Authentication对象由AbstractauthEnticationProcessingFilter的实现创建。该类有一个名为AttreauthEntication的方法,它接受HttpServletRequest对象并返回Authentication对象。因此,这似乎是实现所需内容的一个很好的候选者。对于基于用户名-密码的身份验证,实现类是UsernamePasswordAuthenticationFilter。该类返回UsernamePasswordAuthenticationToken的新实例,它是Authentication的实现。因此,扩展UsernamePasswordAuthenticationFilter的类就足够了。

class ExtendedUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
  @Override
  public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    ...
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password);
    authentication.setDetails(obtainUserSelection(request));

    ...

    return authentication;
  }
}

GreateUserSelection是从请求中获取用户选择的私有方法。

第3步:配置

在Spring Security配置中配置AuthenticationProvider和过滤器实现。具体步骤将根据使用XML还是Java配置而有所不同。

 类似资料:
  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 我想要自定义firebase身份验证,其中用户管理下级用户的角色。我需要指导,了解如何实现自己的后端身份验证系统。文档中到处都提到“将用户名和密码发送到后端以生成自定义令牌”。这个后端是什么?我在哪里追求这个?我的知识领域是firebase,firebase functions,angular 2/4,ionic2,用于本次讨论。。。谢谢

  • 问题内容: 我可以使用Google帐户在AppEngine中对用户进行身份验证的方式非常好。 但是,我需要使用 自定义的身份验证登录系统 。 我将有一个AppUsers表,其中包含用户名和加密密码。 我阅读了有关gae会话的内容,但在启动应用安全性方面需要帮助。 如何跟踪经过身份验证的用户会话?设置cookie? 初学者。 问题答案: 您可以使用cookie来做到这一点……其实并不难。您可以使用C

  • 我在spring MVC项目中实现了一个自定义身份验证提供程序。在我自己的重载authenticate()方法中,我实现了自己的身份验证,其中我构造了自己的UserPasswordAuthenticationToken()并返回对象。 现在,上述对象“UserPasswordAuthentictionToken”中的用户ID被匿名化,密码为null,权限设置为授予该用户的权限。 问题: 这是否会导

  • Postman上有没有办法在执行请求A之前预先执行请求B? 上下文:我创建了一个Symfony应用程序来管理一组web服务。大多数路由只有在用户完全通过身份验证后才能被调用(对于熟悉框架的人使用form_login和防火墙) 因此,我必须先打电话: 邮政 /login 用户名 密码 在能够呼叫之前 获取/某些_安全_路线 (返回 JSON 响应) 当我在Postman构建器中连续手动调用路由时,这

  • 我正在使用fire base制作一个反应原生应用程序,用于使用电子邮件登录im并通过身份验证。但是,有没有办法使用用户名和密码登录?