【问题标题】:Shiro with SAML2 in Karaf with JAX-RS (Jersey)Shiro with SAML2 in Karaf with JAX-RS (Jersey)
【发布时间】:2014-04-20 02:34:38
【问题描述】:

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

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

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

更新

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

在之前的项目中,我对 OSGi 中的 AspectJ 感到头疼,我不得不从 Karaf 切换到 vanilla Equinox,因为 Equinox 编织钩子与 Karaf 不一致(看到了来自 Aries 的堆栈跟踪等)。那么,像shiro-jersey 这样的做法会更好吗?

【问题讨论】:

    标签: jersey shiro saml-2.0 apache-karaf


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚用更多信息更新了这个问题。我以前使用过普通的 Equinox、Equinox Weaving、Gemini Blueprint 类型的堆栈,尽管它最终可以工作,但我对庞大的 Spring 依赖列表并不满意。所以,尽量轻量化。对于初学者,使用 Aries,用于 Peaberry 还不太成熟的领域(例如,ConfigAdmin 和自动类型转换)。
    • 我无法访问 pax shiro 的 URL。 PAX 页面发生了很多事情。某种授权错误。
    • 嗯,我没有登录,但页面对我有用,你能再试一次吗。
    • 呃……我明白发生了什么。我登录到 Atlassian OnDemand,这导致了“不允许”。当我退出时,我可以再次看到该页面!这很奇怪。访客用户可以查看该页面,但会员不能!
    • 我想出了一种不依赖 Guice 或 AspectJ 来实现基于注释的方法。我创建了一个项目here 来演示工作。如果有人审查代码可能会有所帮助。对于 SAML2,我正在按照 shiro-cas here 创建一个项目,但我仍然需要使用实际的 IdP 对其进行测试。同样,如果有人审查代码,那就太好了。
    【解决方案2】:

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

    @Provider 公共类 ShiroAnnotationResourceFilter 实现 ContainerRequestFilter { private static final Map, AuthorizingAnnotationHandler> ANNOTATION_MAP = new HashMap, AuthorizingAnnotationHandler>(); @语境 私有资源信息资源信息; 公共 ShiroAnnotationResourceFilter() { ANNOTATION_MAP.put(RequiresPermissions.class, 新的 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, 新的 AuthenticatedAnnotationHandler()); } 公共无效过滤器(ContainerRequestContext 上下文)抛出 IOException { 类 resourceClass = resourceInfo.getResourceClass(); 如果(资源类!= null){ 注解注解 = fetchAnnotation(resourceClass .getAnnotations()); 如果(注释!= null){ ANNOTATION_MAP.get(annotation.annotationType()) .assertAuthorized(注解); } } 方法method = resourceInfo.getResourceMethod(); 如果(方法!= null){ 注解注解 = fetchAnnotation(method.getAnnotations()); 如果(注释!= null){ ANNOTATION_MAP.get(annotation.annotationType()) .assertAuthorized(注解); } } } 私有静态注释 fetchAnnotation(Annotation[] 注释) { for(注解注解:注解){ if (ANNOTATION_MAP.keySet().contains(annotation.annotationType())) { 返回注释; } } 返回空值; } }

    完整的项目是here。 以上解决了我的问题的第 3 部分。

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

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

    附:感谢 Achim 的 cmets 和建议。

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2016-12-02
      相关资源
      最近更新 更多