rest资源

对于我们集成keycloak来说,你可能会遇到它没有实现的功能,这时需要对kc进行扩展,资源的扩展是其中一个方面,它需要实现RealmResourceProviderRealmResourceProviderFactory两个接口,然后在KC启动之后,它可以被注册到IOC容器里,方便以后我们直接使用。

KC里的扩展是开闭原则OCP的完美体现,扩展在kc里叫SPI,它通过SPI的方式实现对功能的扩展,类似于面向接口的编程,通过META-INF/services里的文件进行注册,这类似于spring里的META-INF/spring.factories的功能。

例子

  • 定义一个资源工厂
public class WeixinUserResourceProviderFactory implements RealmResourceProviderFactory {
private static final Logger logger = Logger.getLogger(WeixinUserResourceProviderFactory.class); public WeixinUserResourceProviderFactory() {
System.err.println("WeixinUserResourceProviderFactory.init");
} /**
* 资源提供者名称会在url上体现.
*
* @return
*/
@Override
public String getId() {
return "weixin-api";
} @Override
public RealmResourceProvider create(KeycloakSession session) {
return new WeixinUserResourceProvider(session);
} @Override
public void init(Scope config) {
} @Override
public void postInit(KeycloakSessionFactory factory) {
} @Override
public void close() {
} }
  • 定义一个资源的具体实现
public class WeixinUserResourceProvider implements RealmResourceProvider {

    private final KeycloakSession session;

    WeixinUserResourceProvider(KeycloakSession session) {
this.session = session;
} @Override
public Object getResource() {
return new WeixinUserResource(session);
} @Override
public void close() {
}
}
  • 具体资源里公开的rest接口
public class WeixinUserResource {

    private final KeycloakSession session;
private final EntityManager em;
private final RealmModel realm; public WeixinUserResource(KeycloakSession session) {
this.session = session;
realm = session.getContext().getRealm();
this.em = session.getProvider(JpaConnectionProvider.class).getEntityManager();
} @GET
@NoCache
@Produces(APPLICATION_JSON)
@Path("user-detail")
public UserDetail userDetail(@HeaderParam("Authorization") String authorization, @QueryParam("userId") String userId) {
//....
}

对于上面的资源,我们可以通过{kc-host}/auth/realms/{realm-name}/weixin-api/user-detail地址去访问它,其中,weixin-api表示当前spi factory的ID。

如果希望你的rest接口通过token授权才能访问,需要让WeixinUserResource继承这个抽象类AbstractSecuredLocalService

  • 向kc注册spi

    添加文件resources/META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory,内容如下
keycloak.services.social.weixin.rest.WeixinUserResourceProviderFactory
  • 文件结构如下

最新文章

  1. nodejs创建http服务器
  2. 【转】C#中如何实现左截取和右截取字符串
  3. AX2012 referencegroup
  4. SQL学习记录
  5. POJ3461 Oulipo KMP算法
  6. MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明
  7. poj2686 Traveling by Stagecoach
  8. clang: error: invalid deployment target for -stdlib=libc++ (requires iOS 5.0 or later)
  9. IIS 发布之后 您要找的资源已被删除、已更名或暂时不可用。 404.0 解决方法
  10. 使用Hibernate Tools从数据库逆向生成Hibernate实体类
  11. Android初级教程使用服务注册广播接收者监听手机解锁屏变化
  12. JS学习笔记:(一)浏览器页面渲染机制
  13. ansible的plugins
  14. 关于@autoreleasepool
  15. EF Code First学习笔记 初识Code First(转)
  16. update 操作用法
  17. 4 个用于构建优秀的命令行用户界面的 Python 库
  18. A NB群友 【记忆化搜索】(2019年华南理工大学程序设计竞赛(春季赛))
  19. LeetCode——Delete Node in a Linked List
  20. Servlet的线程是不是共享同一个requset对象及servlet多线程

热门文章

  1. .jnlp 文件打开方式
  2. kvm总结复习
  3. 8.10-11 mount、umount
  4. unity 使用OnDrag实现物体旋转
  5. xshell中登录服务器图形化界面
  6. 西门子 S7200 以太网模块连接力控组态方法
  7. Web前端自动化测试Cypress实践总结
  8. Go语言网络通信---tcp群发消息
  9. Go timer 是如何被调度的?
  10. 降维-基于RDD的API