keycloak~自定义directgrant直接认证
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
-
keycloak管理平台,添加验证,可以从默认的direct grant上复制
-
将直接认证流程改成刚刚建立的
-
现在就可以在postman里,脱离浏览器,进行认证了,并直接返回access_token
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2021-01-13 keycloak集成微信登陆~解决国内微信集成的问题
2014-01-13 Thrift架构~thrift中间语言的认识(只有它什么都不是,它才有可能什么都是)