keycloak~自定义rest接口

摘要:
该示例定义了资源工厂publicclassWeixinUserResourceProviderFactoryinmplementsRealmResourceProviderFactory{privatestaticfinalLoggerlogger=Logger.getLogger(WeixinUserResource ProviderFactor.class);
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

免责声明:文章转载自《keycloak~自定义rest接口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 创建PPTpytest 基本用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#设计模式总结(转)

一、引言   经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来帮助大家收藏。   PS: 其实,很早之前我就看过所有的设计模式了,但是...

thinkphp中的session()方法

系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成。 用法 session($name, $value='') 参数 name(必须):如果传入数组 则表示进行session初始化,如果传入null表示清空当前session,如果是字符串则表示session赋值、获取或者操作。 Value(可选):要设置的ses...

Java基础面试题(1)

个人总结,仅自己学习用。愿与大家一起分享!如有错误请指正。 一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。 2、String不可变是...

sqlplus 汉字乱码问题的解决

从数据库中导一个数据的时候出现了一个很奇怪的问题,中文乱码。首先可以确认的一点,数据在数据库中是以中文存在的,还有就是用Toad进行连接查询的时候也是中文。但是在服务器端直接用sqlplus 连接查询之后,所有中文都显示为乱码。第一反应是字符集的问题,也尝试用修改字符集来解决问题,最终问题还是出在系统的环境变量上。 关于数据库字符集的问题,参考我的bl...

Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战

准备 一台已经刷好Pandorabox(Openwrt)的路由器、两条宽带 实战环境 固件:PandoraBox R8.1.12 By Lean 硬件:K2P A1版 过程 配置VLAN 为了将一个LAN口映射为WAN口,选择网络-交换机,添加一个VLAN3,比如我希望将LAN1口配置为WAN口,在VLAN1中把LAN1配置为关,VLAN3中除LAN1...

flask设置cookie,设置session,模拟用户认证、模拟管理后台admin、模拟用户logout --

设置cookie HTTP协议是无状态的,在一次请求响应结束后,服务器不会留下关于客户端状态的信息。但是对于某些web程序来说,客户端的信息有必要被记住,比如用户的登录状态,这样就可以根据用户的状态来返回不同的响应。为了解决这个问题就有cookie技术 。cookie技术通过在请求和响应报文中添加cookie数据来保存客户端的状态信息。 cookie值we...