keycloak~自定义rest接口

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
posted @   张占岭  阅读(1447)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2017-05-12 算法和数据结构~各位排序算法的介绍与实现(C#)
2017-05-12 Redis学习笔记~Twenproxy所起到的作用
2016-05-12 爱上MVC~ajax调用分部视图session超时页面跳转问题
2015-05-12 WebApi系列~基于单请求封装多请求的设计
2014-05-12 EF架构~二级域名中共享Session
点击右上角即可分享
微信分享提示