当前位置: 首页 > 知识库问答 >
问题:

Shiro with SAML2 in Karaf with JAX-RS(泽西岛)

竺辉
2023-03-14

我正在创建一个在Karaf中作为OSGi容器运行的应用程序,并使用OSGi HTTP服务和Jersey来公开REST APIs。我需要添加SAML2身份验证和基于权限的授权。为此,我想在Shiro中使用基于注释的方法,因为html" target="_blank">spring似乎正在远离OSGi。我的问题:

  1. 带有SAML罐子的Shiro是否适合OSGi环境?
  2. 我想使用WSO2作为身份提供者。Shiro和WSO2一起工作有任何警告吗?
  3. 对于使用注释,Shiro文档指出我需要放置AsheJ/Spring/Guice jar-这在OSGi环境中仍然有效吗?我更喜欢Guice来满足我所有的DI需求。

如果能从Shiro用户那里获得一些见解,那就太好了。

更新

我正在使用这个项目:osgi jax rs连接器。因此,我使用Guice Peaberry向带有@Path或@Provider注释的接口注册OSGi服务,该工具负责将它们转换为REST资源。(类似于pax白板?)。我计划类似地将我的过滤器公开为OSGi服务,然后将它们与资源一起动态添加。

在之前的一个项目中,我对OSGi中的AspectJ感到头痛,我不得不从Karaf切换到vanilla Equinox,因为Equinos编织钩子不符合Karaf(在其他项目中,可以看到来自白羊座的堆栈轨迹)。那幺,像shiro jersey这样做会更好吗?

共有2个答案

赫连明诚
2023-03-14

为了读者的利益,我分享了在对现有工具进行一些研究后得出的解决方案。首先,简单的部分:在OSGi环境中使用Shiro注释。我最终写了下面的类,因为开发人员共享的大多数Shiro-Jersey适配器都基于Jersey 1.x。


    @Provider
    public class ShiroAnnotationResourceFilter implements ContainerRequestFilter {

        private static final Map, AuthorizingAnnotationHandler> ANNOTATION_MAP = new HashMap, AuthorizingAnnotationHandler>();

        @Context
        private ResourceInfo resourceInfo;

        public ShiroAnnotationResourceFilter() {
            ANNOTATION_MAP.put(RequiresPermissions.class,
                    new PermissionAnnotationHandler());
            ANNOTATION_MAP.put(RequiresRoles.class, new RoleAnnotationHandler());
            ANNOTATION_MAP.put(RequiresUser.class, new UserAnnotationHandler());
            ANNOTATION_MAP.put(RequiresGuest.class, new GuestAnnotationHandler());
            ANNOTATION_MAP.put(RequiresAuthentication.class,
                    new AuthenticatedAnnotationHandler());
        }

        public void filter(ContainerRequestContext context) throws IOException {

            Class resourceClass = resourceInfo.getResourceClass();
            if (resourceClass != null) {
                Annotation annotation = fetchAnnotation(resourceClass
                        .getAnnotations());
                if (annotation != null) {
                    ANNOTATION_MAP.get(annotation.annotationType())
                            .assertAuthorized(annotation);
                }
            }

            Method method = resourceInfo.getResourceMethod();
            if (method != null) {
                Annotation annotation = fetchAnnotation(method.getAnnotations());
                if (annotation != null) {
                    ANNOTATION_MAP.get(annotation.annotationType())
                            .assertAuthorized(annotation);
                }
            }
        }

        private static Annotation fetchAnnotation(Annotation[] annotations) {
            for (Annotation annotation : annotations) {
                if (ANNOTATION_MAP.keySet().contains(annotation.annotationType())) {
                    return annotation;
                }
            }
            return null;
        }
    }

完整的项目在这里。上面解决了我问题的第3部分。

对于带有SAML的Shiro,我使用的是Servicemix包装的openSAML jar,到目前为止它似乎运行良好。然而,我确实不得不编写一些代码来使Shiro与SAML2一起工作。它几乎与shro-cas在同一行上,但与其他IdP一起使用更通用一些。代码有点大,所以共享项目链接而不是将类复制到SO。它可以在这里找到。

现在我在代码和IdP之间有了一些抽象,WSO2集成看起来更简单了。

P、 感谢阿希姆的评论和建议。

葛宪
2023-03-14

我确信这是可行的,尽管我已经看到一些限制/问题弹出。对于1)还没有尝试过,虽然你需要确保你告诉pax-web和jetty关于它,但它需要将其添加到码头.xml它甚至可能需要添加一个片段包到pax-web-jetty,以便可以加载所需的类。这很可能是您的第一个类发现问题。
2)不知道WSO2,所以不知道
3)如果你想使用注释,要小心。对于Guice,你最有可能需要使用Peaberry,因为afaik Guice还没有“OSGi-fied”。由于类装入器的限制,在OSGi环境中使用AspectJ并不是一个好主意。如果你有一个编译时编织,它应该很好,但运行时编织将是一个挑战。

更新:完全忘记了它,但有一个Pax Shiro项目可用,也许这可以是一个很好的起点,让您的设置在一个正确的阵容。

 类似资料:
  • 我正在进行一个示例项目,使用: JAX-RS(泽西2) JSR-303 Bean validaiton 泽西测试测试 Grizzly Http容器 杰克逊2.7.3 在添加@JsonIgnore和@JsonProperty之前,一切都按预期进行,在对对象属性执行bean验证时,我能够毫无问题地运行测试。通常情况下,“password”字段不应用于反序列化,所以我用@JsonIgnore标记了它的g

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我试图能够定义以下代码: 我知道我需要使用: 要正确设置对象映射器,以便能够在rest资源上接受单个值作为数组。我成功地安装了那个部件。 我对这种方法的问题是,以下内容是不可区分的: 和 将产生一个大小为1的列表。然后,在方法create(List myObjects)中,我将无法区分List和发送到Rest资源的单个对象。 那么,我的问题是如何做到这一点。我们的想法是只有一个@POST同时接受数

  • 我的网络服务有一些问题,我试图从网络服务接收我的电影列表,但总有这个严重的错误。 这是我的模型: 还有一把刀和一个门面,但它们工作得很好! 以下是我的服务: 方法“onemovie”和“count”运行良好,我将在浏览器中显示xml,但当我调用“XMLForApp”时,服务器抛出异常。 我的客户在这里: 例外情况是:

  • 我真的不明白泽西到底是什么。 我所知道的是,Jax-RS是一个用于构建REST web服务的API,而Jersey?我得到了一些信息,所有的说法都一样:“Jersey是JAX-RS的实现”。但这意味着什么? 如果jax-rs是一个API,为什么我们需要jersey来创建rest web服务?泽西是不是有更多的libs来瞄准jax-rs?如果是,那么jax-rs是一个不完整的API?