中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

keycloak~自定義rest接口

rest資源

對于我們集成keycloak來說,你可能會遇到它沒有實現的功能,這時需要對kc進行擴展,資源的擴展是其中一個方面,它需要實現RealmResourceProviderRealmResourceProviderFactory兩個接口,然后在KC啟動之后,它可以(yi)被注冊(ce)到(dao)IOC容器里,方便以(yi)后我們直接使(shi)用。

KC里(li)的(de)擴展(zhan)是開閉原則(ze)OCP的(de)完美(mei)體現,擴展(zhan)在kc里(li)叫SPI,它通(tong)過SPI的(de)方式實現對功能的(de)擴展(zhan),類(lei)似于面向接(jie)口的(de)編程,通(tong)過META-INF/services里(li)的(de)文件(jian)進(jin)行注冊,這類(lei)似于spring里(li)的(de)META-INF/spring.factories的(de)功能。

例子

  • 定義一個資源工廠
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地址去訪(fang)問它,其中,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 @ 2021-05-12 10:23  張占嶺  閱讀(1513)  評論(0)    收藏  舉報