如何在java restful Web服务中添加安全性

时间:2014-05-03 03:55:09

标签: java security rest

我是一个宁静的网络服务提供商。我的服务被其他第三方使用,因此我决定为我的服务添加安全性。当我瞪眼时,我发现一些网站正在提供基于角色的访问;即JAAS以外的认证和授权。有替代品吗?

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法之一保护RESTful Web服务,以支持身份验证,授权或加密:

使用web.xml保护RESTful Web服务

使用web.xml部署描述符保护RESTful Web服务,就像使用其他Java EE Web应用程序一样。有关完整的详细信息,请参阅"开发安全Web应用程序"在Oracle WebLogic Server的编程安全性中。

例如,要使用基本身份验证保护RESTful Web服务,请执行以下步骤:

  1. 为您计划保护的每组RESTful资源(URI)定义<security-constraint>

  2. 使用<login-config>元素定义要使用的身份验证类型以及将应用安全性约束的安全领域。

  3. 使用<security-role>标记定义一个或多个安全角色,并将它们映射到步骤1中定义的安全性约束。有关详细信息,请参阅&#34; security-role&#34;在Oracle WebLogic Server的编程安全性中。

  4. 要启用加密,请添加<user-data-constraint>元素并将<transport-guarantee>子元素设置为CONFIDENTIAL。有关更多信息,请参阅&#34; user-data-constraint&#34;在Oracle WebLogic Server的编程安全性中。

  5. 有关详细信息,

    示例5-1使用基本身份验证保护RESTful Web服务

    <web-app>
        <servlet>
            <servlet-name>RestServlet</servlet-name>
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>RestServlet</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
        <security-constraint>
             <web-resource-collection>
                 <web-resource-name>Orders</web-resource-name>
                 <url-pattern>/orders</url-pattern>
                 <http-method>GET</http-method>
                 <http-method>POST</http-method>
             </web-resource-collection>
             <auth-constraint>
                 <role-name>admin</role-name> 
             </auth-constraint>
        </security-constraint>
            <login-config>
                <auth-method>BASIC</auth-method>
                <realm-name>default</realm-name>
            </login-config>
        <security-role>
            <role-name>admin</role-name>
        </security-role>
    </web-app>
    

    使用SecurityContext保护RESTful Web服务

    示例5-2使用SecurityContext保护RESTful Web服务

    package samples.helloworld;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.SecurityContext;
    import javax.ws.rs.core.Context;
    
    ...
    
    @Path("/stateless")
    @Stateless(name = "JaxRSStatelessEJB")
    public class StlsEJBApp {
    ...
            @GET
            @Produces("text/plain;charset=UTF-8")
            @Path("/hello")
            public String sayHello(@Context SecurityContext sc) {
                    if (sc.isUserInRole("admin"))  return "Hello World!";
                    throw new SecurityException("User is unauthorized.");
            }
    

    使用注释保护RESTful Web服务

    示例5-3使用SecurityContext保护RESTful Web服务

    package samples.helloworld;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.annotation.Security.RolesAllowed;
    
    
    @Path("/helloworld")
    @RolesAllowed({"ADMIN", "ORG1"})
    public class helloWorld {
    
       @GET
       @Path("sayHello")  
       @Produces("text/plain")
       @RolesAllows("ADMIN")
       public String sayHello() {
          return "Hello World!";
       }
    }
    

    Source