上一篇文章把Red Hat Single Sign-On的基本流程走通了,但是遗留4个问题:
1:用户应该是来自我们应用系统的数据库,而不是在hm sso(Red Hat Single Sign-On,下面简称hm sso)里创建。
2:用户的鉴权也就是权限校验用的应该是应用系统的权限结构,而不是在hm sso里创建。
3:通常项目都是springboot项目,除非是大厂规范用jboss,所以要把war加jboos容器的模式改为spirngboot,其实我倒是觉得如果是springboot,那还不如直接用Spring Authorization Server。
4:登录页面用的应该是应用系统的登录页面而不是rh sso的默认登录页面。
下面针对上面提出的第一个问题做扩展,后面再解决其他的问题:
hm sso连接外部用户数据库要用到是用户存储接口 User Storage SPI:
你需要写一个UserProvider实现对应的接口:第 7 章 User Storage SPI Red Hat Single Sign-On 7.6 | Red Hat Customer Portal
这里针对几个重要的接口注意点说明:
org.keycloak.storage.user.UserLookupProvider,如果要能够使用此外部存储的用户登录,则需要这个接口。大多数(全部)需要实现此接口,可以说它是基础接口。
org.keycloak.storage.user.UserQueryProvider,定义用于查找一个或多个用户的复杂查询。如果要从hm sso管理控制台查看和管理用户,则需要实现它。下面是其中个方法实现。
org.keycloak.storage.user.UserRegistrationProvider,如果您的UserProvider支持添加和删除用户,则实现此接口。
org.keycloak.storage.user.UserBulkUpdateProvider,如果您的UserProvider支持一组用户的批量更新,则实现它。
org.keycloak.credential.CredentialInputValidator,如果您的UserProvider可以验证一个或多个不同的凭证类型(例如,如果您的供应商可以验证密码),需要实现此接口。下面是其中个方法实现。
org.keycloak.credential.CredentialInputUpdater,如果您的UserProvider支持更新一个或多个不同的凭证类型,则实现此接口。下面是其中个方法实现。
我们应用系统的用户要映射成hm sso的用户,就需要一个UserAdper,它继承 AbstractUserAdapterFederatedStorage后重写对应的get和set完成两边user的适配
还有就是UserStorageProviderFactory,工厂模式提供UserProvider的实列,getId()就是我们的UserProvider实例的名称了:
下面简单说说工程的搭建:
官方的列子是jpa 依照jdbc的实现,这个对很多人来说可能不习惯,比如我自己
比起mybatis-plus还是差点意思,但是mybatis-plus我也不想用了,正好前段时间都在炒mybatis-flex,借这次机会就了解一波,对于这种持久层的框架要学就要抛开spirng单独使用,这也正好 符合这个场景,一是就通过官网找到源码浏览了起来,Mybatis-Flex-Samples: Mybatis-Flex 的示例代码仓库 (gitee.com)
怎么样,太方便了,直接把native考出来使用就好,使用方式也是一目了然,至于代码生成什么的都一个样。
过程中还是要注意hm sso maven依赖仓库的配置以及用到的包,这个用它官方例子里的地址就好,
最重要的是jar的要求,这点要确认好,打完包后可以反编译看下
META-INF.service下面要有它
build插件可以可以参考:
<build> <finalName>mybatis-flex-native</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
最后把jar包放到hm sso的部署目录下,启动hm sso
到控制台可以看到UserProvider已经装上了
直接save即可
到users下面点view all users 可以看到我们从数据库加载出来的user,当然如果不是实现UserQueryProvider的话这里是不会出来的。到此通过User Storage SPI加载外部user就完了。下面是项目地址:repo/mybatis-flex-native at master · stevensu1/repo (github.com)