keycloak~自定义rest接口
rest资源
对于我们集成keycloak来说,你可能会遇到它没有实现的功能,这时需要对kc进行扩展,资源的扩展是其中一个方面,它需要实现RealmResourceProvider
和RealmResourceProviderFactory
两个接口,然后在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
- 文件结构如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.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