介绍
在Keycloke的源码中,带有Authenticator SPI实现的案例,但是我发现示例里面的README不是很友好,同时我在编译和打包示例代码的时候,并不顺畅。因此,我把它的代码拷贝到了我自己的项目中。
鉴于官方的文档(22.0.4)与example的代码和说明有一些出入,特意重新在自己的环境中编译、打包和运行了一遍。
本文的重点,不是如何实现Secret Question这个Authenticator,而是对官方examples/providers/authenticator这个example的部署和测试进行说明。
与官方example代码不一样的地方
其实我只做了一个地方的修改,就是把secret-question.ftl和secret-question-config.ftl放到了resources/theme-resources/templates目录下,这也是根据官方文档来对代码做的唯一一个改动。
打包和部署
下载代码:
git clone git@github.com:yulshi/keycloak-providers.git
打包
mvn clean package
部署,其实就是把打好包的jar文件拷贝到Keycloak的providers目录下,然后重新启动Keycloak。
cp authenticator-provider/target/authenticator-provider.jar $KEYCLOAK_HOME/providers
测试
- keycloak上的设置
- 在Keycloak的控制台上选择一个realm
- 从左边菜单中选择
Authentication,在右边窗口里面选择Flow name为browser的Flow,然后从左右边的...中选择Duplicate,来克隆一份,命名为secret-question - 在
secret-question中的secret-question forms这个sub flow中的加号那里点击,选择Add step - 从弹出的对话框中选择,
Secret Question的Authenticator并添加 - 设置
Secret Question的Requirement为Required - 然后将这个flow绑定到
Browser flow - 最后,不要忘记,在
Required actions这个tab里面,启用(enable)Secret Question这个required action。
- 登录realm的account,来测试登录的效果
- 在输入用户名/密码后,会导航到一个标题叫做Setup Secret Question的页面,要求你设置问题的答案。这个页面就是
Secret Question这个required action来设置的。 - 在第二次登录的时候,输入用户名/密码,会导航到一个标题为登录名的页面,要求你回答问题,你输入了上一步设置的答案,就能通过验证,否则不能。
- 在输入用户名/密码后,会导航到一个标题叫做Setup Secret Question的页面,要求你设置问题的答案。这个页面就是