如何将用户登录到我的RESTFul Web服务以与javax.ws.rs.core.SecurityContext一起使用

如何将用户登录到我的RESTFul Web服务以与javax.ws.rs.core.SecurityContext一起使用,java,rest,security,java-ee-6,Java,Rest,Security,Java Ee 6,我目前正致力于在我的RESTFul Web服务中实现安全性。 我发现有一个SecurityContext很容易使用,然后又一次陷入了将我的用户信息放入其中的困境 @GET @Path("item/{item_id}") @Produces(MediaType.APPLICATION_JSON) public Item getItem(@Context SecurityContext sc, @PathParam("item_id") Long id) { if(!sc.isSecure

我目前正致力于在我的RESTFul Web服务中实现安全性。 我发现有一个SecurityContext很容易使用,然后又一次陷入了将我的用户信息放入其中的困境

@GET
@Path("item/{item_id}")
@Produces(MediaType.APPLICATION_JSON)
public Item getItem(@Context SecurityContext sc, @PathParam("item_id") Long id)
{

    if(!sc.isSecure())
        throw new SecurityException("You have to use a secure connection!");
    if(!sc.isUserInRole("admin"))
    {
        throw new SecurityException("You have to be an admin to access this information");
    }
    return itemFacade.find(id);
}
所以我的问题是我需要为我的Web服务写一个登录名,但我不知道如何做(所以我可以将它与SecurityContext对象一起使用)。如果没有可能使用SecurityContext对象,如果您能给我一些链接,我将不胜感激,这样我就可以通过它们工作。 它还必须是最新的技术,这意味着如果不需要修改web.xml文件,只需要使用注释来管理它,这可能是最好的方法


我正在使用NETBeaS 7.3,JavaEE6,使用GalasFISH作为应用服务器。

用于身份验证和授权,您应该考虑使用JAAS。JAASAPI由一组用于用户身份验证和授权的Java包组成。它实现了标准可插拔身份验证模块(PAM)框架的Java版本,并兼容地扩展了Java 2平台的访问控制体系结构,以支持基于用户的授权。JAAS最初是作为JDK1.3的扩展包发布的,并与JDK1.4+捆绑在一起。由于JBossSX框架仅使用JAAS的身份验证功能来实现声明性的基于角色的J2EE安全模型,因此本简介仅关注该主题

JAAS身份验证是以可插拔的方式执行的。这允许Java应用程序保持独立于底层身份验证技术,并允许JBossSX安全管理器在不同的安全基础架构中工作。无需更改JBossSX安全管理器实现,即可实现与安全基础架构的集成。需要更改的只是JAAS使用的身份验证堆栈的配置

以下是教程,供您进一步帮助:


你通读了吗?是的。这也是我问题的一部分。因为在那个教程中,他们在项目中使用web.xml文件来“保护”服务的部分,但我想避免这种情况——如果可能的话。我不知道哪种是保护REST服务的“最新”方法,因为Java中的东西变化非常快,然后你可以在互联网上找到任何东西——新的和旧的解决方案。这就是为什么我问是否有更好的方法来实现这一点,因为我认为不清楚是否将所有内容都放在web.xml文件中!安全既不琐碎,也不容易。您可以使用
@WebFilter
注释类和一些自定义编码来实现一个无需配置的解决方案,但这不会减少工作量。我知道这从来都不容易。我知道java中的很多事情都是通过注释和类继承来完成的,所以我想知道是否有可能从安全类继承并对其进行注释,以便容器使用它进行身份验证或类似的事情。但我似乎不得不用web.xml的方式来做,因为它似乎是迄今为止最简单的解决方案。谢谢你的回答!如何利用JavaServlet会话,在调用登录方法时将用户id存储为会话变量,并实现自己的身份和权限检查基础设施?一个干净的方法可以通过创建拦截器和注释需要检查的方法来执行检查。感谢您的快速回答!我仍然不确定是否有更简单的方法,因为当我看教程时,似乎有很多工作要做。我不介意java本身是否已经有一个现成的实现或一个库来处理它。@Kafioin另一个更简单的方法是使用ServletFilter。编写一个筛选器以拦截对您的服务的所有请求。然后在那里进行身份验证,如果良好,则将请求转发到servlet/服务,否则返回400个错误请求或类似错误。这就是为什么我看到许多实现是通过令牌完成的。我可以确保与SecurityContext对象有一个安全的连接,但我认为这可能会造成太多的开销,并且不是安全RestService的最佳方法。不过,再次感谢您的回答:)