keycloak~自定义directgrant直接认证

本文介绍了如何在Keycloak中自定义Direct Grant认证,允许使用email或phoneNumber进行密码认证。首先,需要创建provider和providerFactory,继承Keycloak的ValidatePassword类。接着,将自定义的认证工厂注册到AuthenticatorFactory,并在Keycloak管理平台配置新的验证方式。完成这些步骤后,即可通过Postman等工具直接获取access_token,实现非浏览器环境的认证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

direct grant我们把它理解为通过rest接口直接认证,这是oauth2里的密码认证方式,即grant_type=password,它不需要走授权码这种复杂的流程,相当于传统的表单认证;keycloak事实上为我们准备了一个direct grant,只不过它只能使用username和password进行认证,如果你希望使用email,phoneNumber来进行密码认证,则需要另外去开发,下面就是开发的步骤:

  • 添加provider和providerFactory
    你的SelfDirectGrantAuthenticator需要继承ValidatePassword ,当然继承AbstractDirectGrantAuthenticator也是可以的,ValidatePassword是AbstractDirectGrantAuthenticator的一个子类,都是在直接授权时使用的,它的作用是校验用户的密码,KC的这种设计有利于程序的解耦,例如除了ValidatePassword还有ValidateUsername等。
/**
 * 直接继承了验证密码功能的direct grant流.
 */
public class TestDirectGrantAuthenticator extends ValidatePassword {
  KeycloakSession session;

  public V6DirectGrantAuthenticator(KeycloakSession session) {
    this.session = session;
  }

  @Override
  public void authenticate(AuthenticationFlowContext context) {
    String username = Optional.ofNullable(context.getHttpRequest().getDecodedFormParameters().getFirst("username"))
        .orElse(context.getHttpRequest().getDecodedFormParameters().getFirst("username"));
    String password = Optional.ofNullable(context.getHttpRequest().getDecodedFormParameters().getFirst("password"))
        .orElse(context.getHttpRequest().getDecodedFormParameters().getFirst("password"));
    MultivaluedMap<String, String> inputData = new MultivaluedMapImpl<>();
    inputData.add(KeycloakUtil.FIELD_EMAIL_PHONE, username);
    inputData.add(KeycloakUtil.PASSWORD, password);
    if (KeycloakUtil.passwordLogin(this, context, session.getProvider(JpaConnectionProvider.class).getEntityManager(), session, inputData)) {
      super.authenticate(context); //验证密码
    }
  }

  • 注册到org.keycloak.authentication.AuthenticatorFactory
    [图片上传失败...(image-3e3189-1651029292671)]

  • keycloak管理平台,添加验证,可以从默认的direct grant上复制
    [图片上传失败...(image-473794-1651029292671)]

  • 将直接认证流程改成刚刚建立的
    [图片上传失败...(image-b2cc99-1651029292671)]

  • 现在就可以在postman里,脱离浏览器,进行认证了,并直接返回access_token
    [图片上传失败...(image-41961f-1651029292671)]

最近整理了一系列的Java面试题,包含了Java基础、进阶、多线程、并发编程、数据库(MySQL、Redis、MongoDB、Memcachedd等等)、Spring全家桶、MyBatis、ZooKeeper、Dubbo、Elasticsearch、RabbitMQ、Kafka、Linux、Netty、Tomcat以及阿里、腾讯、字节、百度等大厂的面试真题,另外可以微信搜索539413949获取我为大家准备的资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值