You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by sn...@apache.org on 2002/09/06 08:14:11 UTC

cvs commit: xml-soap/java/src/org/apache/soap/server/http MessageRouterServlet.java RPCRouterServlet.java ServerHTTPUtils.java

snichol     2002/09/05 23:14:11

  Modified:    java/docs changes.html
               java/src/org/apache/soap/server/http
                        MessageRouterServlet.java RPCRouterServlet.java
                        ServerHTTPUtils.java
  Log:
  Add per-service authorization based on roles.  Authorized roles
  are specified in the deployment descriptor.  The container must be
  configured for authentication through its configuration and/or the Apache
  SOAP web.xml deployment descriptor.
  
  There is no sample for demonstration/test at this time.
  
  Revision  Changes    Path
  1.45      +4 -0      xml-soap/java/docs/changes.html
  
  Index: changes.html
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/docs/changes.html,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- changes.html	5 Sep 2002 16:50:51 -0000	1.44
  +++ changes.html	6 Sep 2002 06:14:10 -0000	1.45
  @@ -76,6 +76,10 @@
         interop hack).</li>
         <li>Support gzip encoding for HTTP.  This is enabled through SOAPContext
         for clients and the deployment descriptor for services.</li>
  +      <li>Add per-service authorization based on roles.  Authorized roles
  +      are specified in the deployment descriptor.  The container must be
  +      configured for authentication through its configuration and/or the Apache
  +      SOAP web.xml deployment descriptor.</li>
       </ul>
     </li>
   </ul>
  
  
  
  1.37      +5 -1      xml-soap/java/src/org/apache/soap/server/http/MessageRouterServlet.java
  
  Index: MessageRouterServlet.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/http/MessageRouterServlet.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- MessageRouterServlet.java	5 Sep 2002 16:50:52 -0000	1.36
  +++ MessageRouterServlet.java	6 Sep 2002 06:14:10 -0000	1.37
  @@ -292,7 +292,11 @@
           // is this a valid message?
           dd = serviceManager.query (targetID);
           reqCtx.setProperty( Constants.BAG_DEPLOYMENTDESCRIPTOR, dd );
  -  
  +
  +        // is user authorized to use this service?
  +        if (!ServerHTTPUtils.isUserAuthorized(dd, req, res))
  +          return;
  +
           // Get the session, but only create a new session if the scope
           // is session or there is no deployment descriptor option
           // SessionRequired with a value of false (i.e. the desire to
  
  
  
  1.41      +4 -0      xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet.java
  
  Index: RPCRouterServlet.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- RPCRouterServlet.java	5 Sep 2002 16:50:52 -0000	1.40
  +++ RPCRouterServlet.java	6 Sep 2002 06:14:10 -0000	1.41
  @@ -338,6 +338,10 @@
           dd = serviceManager.query (targetID);
           reqCtx.setProperty( Constants.BAG_DEPLOYMENTDESCRIPTOR, dd );
   
  +        // is user authorized to use this service?
  +        if (!ServerHTTPUtils.isUserAuthorized(dd, req, res))
  +          return;
  +
           // Get the session, but only create a new session if the scope
           // is session or there is no deployment descriptor option
           // SessionRequired with a value of false (i.e. the desire to
  
  
  
  1.26      +40 -0     xml-soap/java/src/org/apache/soap/server/http/ServerHTTPUtils.java
  
  Index: ServerHTTPUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/http/ServerHTTPUtils.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- ServerHTTPUtils.java	5 Sep 2002 16:50:52 -0000	1.25
  +++ ServerHTTPUtils.java	6 Sep 2002 06:14:10 -0000	1.26
  @@ -465,6 +465,46 @@
     }
   
     /**
  +   * Checks authorization to use service.
  +   *
  +   * @return Whether the user is authorized, true if the user is, false if
  +   *         the user is not due to not being authenticated.
  +   * @exception IOException If an error occurs writing a response.
  +   * @exception SOAPException If the user is authenticated but not authorized.
  +   */
  +  public static boolean isUserAuthorized(DeploymentDescriptor dd,
  +                                         HttpServletRequest req,
  +                                         HttpServletResponse res
  +                                        ) throws IOException, SOAPException {
  +    // Get roles required for this service
  +    Hashtable props = dd.getProps();
  +    String roles = props != null ? (String) props.get("roles") : null;
  +
  +    // If there are no roles, no authorization is required
  +    if (roles == null)
  +      return true;
  +
  +    // If user is in any roles, he is authorized
  +    StringTokenizer st = new StringTokenizer(roles, ",");
  +    while (st.hasMoreTokens()) {
  +      if (req.isUserInRole(st.nextToken()))
  +        return true;
  +    }
  +
  +    // If user is not authenticated, let him know he needs to be
  +    if (req.getRemoteUser() == null && req.getUserPrincipal() == null) {
  +      res.setHeader("WWW-Authenticate", "Basic realm=\"Apache SOAP\"");
  +      res.setContentType("text/html");
  +      res.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
  +      return false;
  +    }
  +
  +    // Authenticated but not authorized
  +    throw new SOAPException(Constants.FAULT_CODE_SERVER,
  +                            "Not authorized for this SOAP service.");
  +  }
  +     
  +  /**
      * Gets the HTTP headers for a request.
      */
     public static Hashtable getHeaders(HttpServletRequest req) {
  
  
  

--
To unsubscribe, e-mail:   <ma...@xml.apache.org>
For additional commands, e-mail: <ma...@xml.apache.org>