keycloak~自定義rest接口
rest資源
對(duì)于我們集成keycloak來(lái)說(shuō),你可能會(huì)遇到它沒(méi)有實(shí)現(xiàn)的功能,這時(shí)需要對(duì)kc進(jìn)行擴(kuò)展,資源的擴(kuò)展是其中一個(gè)方面,它需要實(shí)現(xiàn)RealmResourceProvider和RealmResourceProviderFactory兩個(gè)接口,然后在KC啟動(dòng)之后,它可以被注冊(cè)到IOC容器里,方便以后我們直接使用。
KC里的擴(kuò)展是開(kāi)閉原則OCP的完美體現(xiàn),擴(kuò)展在kc里叫SPI,它通過(guò)SPI的方式實(shí)現(xiàn)對(duì)功能的擴(kuò)展,類(lèi)似于面向接口的編程,通過(guò)META-INF/services里的文件進(jìn)行注冊(cè),這類(lèi)似于spring里的META-INF/spring.factories的功能。
例子
- 定義一個(gè)資源工廠
public class WeixinUserResourceProviderFactory implements RealmResourceProviderFactory {
private static final Logger logger = Logger.getLogger(WeixinUserResourceProviderFactory.class);
public WeixinUserResourceProviderFactory() {
System.err.println("WeixinUserResourceProviderFactory.init");
}
/**
* 資源提供者名稱會(huì)在url上體現(xiàn).
*
* @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() {
}
}
- 定義一個(gè)資源的具體實(shí)現(xiàn)
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() {
}
}
- 具體資源里公開(kāi)的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) {
//....
}
對(duì)于上面的資源,我們可以通過(guò){kc-host}/auth/realms/{realm-name}/weixin-api/user-detail地址去訪問(wèn)它,其中,weixin-api表示當(dāng)前spi factory的ID。
如果希望你的rest接口通過(guò)token授權(quán)才能訪問(wèn),需要讓
WeixinUserResource繼承這個(gè)抽象類(lèi)AbstractSecuredLocalService
- 向kc注冊(cè)spi
添加文件resources/META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory,內(nèi)容如下
keycloak.services.social.weixin.rest.WeixinUserResourceProviderFactory
- 文件結(jié)構(gòu)如下

浙公網(wǎng)安備 33010602011771號(hào)