2009-11-05 83 views
2

我试图找到一种简单灵活的方法将JaaS身份验证添加到REST。我发现了一个post,我认为它带领我走向正确的方向(请参阅StevenC的回答)。听起来像servlet容器负责安全性,而不是Jersey代码本身。我喜欢这个想法,但需要一些实施指导。在泽西灰熊上使用JaaS

Grizzly是我的servlet容器,我想将其配置为使用JaaS进行身份验证。现在,一个简单的用户名/密码组合就可以,并且直接在代码中直接对用户名/密码对进行硬编码是没有问题的。只要它使用JaaS,我们可以稍后改进这些细节。至于通过HTTP发送的内容,我认为存储cookie是实现这一切的最简单方法。无论如何都要将身份验证垃圾从我的Jersey代码中删除。

下面的代码到目前为止开始灰熊:


final String baseUri = "http://localhost:9998/"; 
final Map initParams = new HashMap(); 

initParams.put("com.sun.jersey.config.property.packages", 
    "my.jersey.Service"); 

System.out.println("Starting grizzly..."); 
SelectorThread threadSelector = GrizzlyWebContainerFactory.create(baseUri, initParams); 
System.out.println(String.format(
     "Jersey app started with WADL available at %sapplication.wadl\n" 
    + "Try out %shelloworld\nHit enter to stop it...", baseUri, baseUri));     
System.in.read(); 
threadSelector.stopEndpoint(); 
System.exit(0); 

如果这整个过程中的工作,有什么检查权限用户的最佳方法是什么?我可能会希望我的REST代码在某些地方实际验证权限。我是否在正确的轨道上?有更容易的方法吗?链接到教程将是一个很好的答案。即使像“我做到了这一点,它的工作原理”这样的答案,也会给我一个温暖的模糊,我正朝着正确的方向前进。

感谢您的任何帮助。

编辑:一些澄清的StevenC的评论:

  • 你仍想使用Servlet过滤器来保护您的资源?我将使用任何可以从Jersey代码中分离出认证细节的东西。它不一定是servlet过滤器。
  • “配置为使用JaaS”是什么意思?最初的计划是使用JaaS来保护当前的API。下一阶段将使整个API在线提供。围绕API调用使用Jersey包装器似乎很有意义,但保持由Grizzly处理的认证。在我相信的时候,灰熊将不得不与JaaS互动。
  • 您是否认为应该有一些简单的配置才能保护您的资源?我正在考虑对用户进行身份验证以及基于角色授权用户访问资源的两个步骤。这个想法是让Grizzly处理认证(使用JaaS)和Jersey处理授权。
  • “我不认为需要使用带有RESTful资源的Cookie。”删除cookies的使用会很棒,但是如何完成?系统需要知道用户是否被认证。我宁愿不要求他们通过每个电话的用户名/密码/等。甚至在每次调用时将会话标记作为参数传递都显得很“丑陋”。

此外,请注意,我是REST的新手。我一直在做SOAP几年,所以我可能会有一种“SOAP偏见”,可能会让我不知道每个人都使用的简单明了的解决方案。如果有更简单的方法,请随时分享。我只是尽量学习。

+0

我也许应该张贴我的答案之前评论,但是这个问题需要一点澄清: - 你仍然想使用Servlet过滤器来保护您的资源? - “配置为使用JaaS”意味着什么?你是否认为应该有一些简单的配置让灰熊保护你的资源? - JaaS本身只是一个框架,你必须插入一些认证“领域”或来源(用LoginModule实现)。 - 我没有看到使用RESTful资源的cookie的必要性(假设这是你想使用球衣的)。 – StevenC 2009-11-09 01:10:06

+0

@ User1,你有没有经历过这个项目?我一整天都在撕掉我的头发,以获得HTTP身份验证工作。 (刚刚发布了一个[类似问题](http://stackoverflow.com/questions/14608162/basic-http-authentication-with-jersey-grizzly)今天早些时候。) – aioobe 2013-01-30 19:55:04

+0

我不认为我得到它的工作。抱歉。我一直在用骆驼做Jetty。这是一个完全不同的范例,但对我的情况更好。作为提示,我避免了HTTP身份验证,并使用会话。用户必须以某种形式登录,然后将该会话授予适当的页面。此设计适用于执行会话的任何HTTP服务器。 – User1 2013-01-30 21:25:50

回答

1

不知道你是否在问如何保护每个资源,但我发现javapassion上的演示文稿听起来像你在找什么。他说使用@Context SecurityContext作为参数。

@Path("basket") 
    // Sub-resource locator could return a different resource if a user 
    // is a preferred customer: 
    public ShoppingBasketResource get(@Context SecurityContext sc) { 
    if (sc.isUserInRole("PreferredCustomer") { 
     return new PreferredCustomerShoppingBaskestResource(); 
    } else { 
     return new ShoppingBasketResource(); 
    } 
} 
+0

如果认证是由容器(例如Tomcat)执行的,甚至在JAX-RS过滤/调度之前进行认证 – yegor256 2010-12-12 14:12:52

3

我不完全清楚“配置它使用JaaS进行身份验证”是什么意思。如果有一个简单的配置让grizzly执行HTTP身份验证保护URL,我不知道它。

我假设从其他问题和答复你引用,你想使用一个servlet过滤器。通常这是在servlet项目的web.xml文件中配置的。当然,Grizzly通常用于从代码启动服务器,而不是应用程序配置。当我以这种方式使用grizzly时,我注意到GrizzlyWebContainerFactory没有提供允许您指定servlet过滤器的任何版本的create()。不过,我确实注意到ServletAdapter [1]在提供该功能的同一个项目中。

至于过滤器本身,我不知道预构建的servlet过滤器只是简单地将JaaS配置的登录模块插入到您的应用程序中,因此您可能必须在其中写入一些代码。不过,只需选择基于HTTP的身份验证方法(例如,HTTP BASIC,DIGEST等),相应地从请求中提取证书,然后使用JaaS框架进行登录。我没有看到RESTful资源特别需要cookie。 REST风格的建筑风格在保持会话时会皱眉。否则,有很多关于JaaS的教程,所以在这里我不会详细说明。

一旦JaaS主题处于活动状态(使用者成功登录),您可以简单地获取当前主题并使用Subject.getSubject方法检查活动主体和凭证。

无论如何,这个答案是专门给出更多关于使用servlet过滤器进行身份验证的细节,正如您在其他(链接)问题中所要求的。这不一定是在泽西网络应用程序中进行身份验证的唯一方式,但这是一种相当直接的方式。我喜欢它,因为它阻止我在需要它的每个资源中注入重复的授权代码。

[1] https://grizzly.dev.java.net/nonav/apidocs/com/sun/grizzly/http/servlet/ServletAdapter.html