2015-04-17 8 views
0

Я разработал веб-службу на основе Ejb на сервере приложений jboss eap 6.1. Без аутентификации эта служба работает как ожидалось. Теперь я добавил основной механизм autentication этой веб-службы, выполнив действия, выполняемые я:Jboss AS 7, ошибка в веб-сервисе basic http autentication

Я аннотированный мой EJB-компонента (которым реализует WS) следующим образом:

import javax.annotation.security.PermitAll; 
import javax.annotation.security.RolesAllowed; 
import javax.ejb.Stateless; 
import javax.jws.WebService; 

import org.jboss.ejb3.annotation.SecurityDomain; 
import org.jboss.ws.api.annotation.WebContext; 

@Stateless 
@WebService(name = "HelloWorldWS", targetNamespace="http://my-company/ws/") 
@WebContext(authMethod = "BASIC", contextRoot = "helloWS", urlPattern ="/*") 
@SecurityDomain("helloworld-webservice-login") 


public class HelloWorldWebService implements HelloWorldWebServiceRemote { 

@RolesAllowed({"mioruolo"}) 
public String sayHello() { 
    return "Hello World"; 
} 
} 

и, в соответствии с этим, я добавил домен безопасности HelloWorld-вебсервис-входа в моем файле standalone.xml следующим образом:

<security-domain name="helloworld-webservice-login"> 
         <authentication> 
           <login-module code="Database" flag="required"> 
             <module-option name="dsJndiName"  value="java:jboss/datasources/ExampleDS"/> 
             <module-option  name="principalsQuery" value="select password from s_principals where principal_id=?"/> 
            <module-option name="rolesQuery" value="select role, 'Roles' from s_roles where principal_id=?"/>          
          </login-module> 
        </authentication> 
      </security-domain> 

Итак, я хотел бы, что только пользователи с ролью имени «mioruolo» может получить доступ к веб-сервису. Я добавил таблицы s_roles и s_principals в мою базу данных оракула 10g, и я выполнил два запроса, которые находятся в файле xml в окне Toad, и оба они работают как ожидалось.

Я использую JAX-WS, сгенерированные клиента для вызова этой веб-службы, и я передавать учетные данные в заголовке HTTP следующим образом, на стороне клиента:

bindingProvider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "federico"); 
    bindingProvider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "passwd"); 

Ответ я всегда 403-запрещенный код статуса. Я проверил JBoss лог-файл, и я сеял следующие строки:

14:50:40,693 DEBUG [org.apache.catalina.authenticator]   (http-/127.0.0.1:8080-1) Security checking request POST /helloWS 
14:50:40,694 DEBUG [org.apache.catalina.realm] (http-/127.0.0.1:8080-1) Checking constraint 'SecurityConstraint[HelloWorldWebService]' against POST/--> true 
14:50:40,709 DEBUG [org.apache.catalina.realm] (http-/127.0.0.1:8080-1) Checking constraint 'SecurityConstraint[HelloWorldWebService]' against POST/--> true 
14:50:40,709 DEBUG [org.apache.catalina.authenticator] (http-/127.0.0.1:8080-1) Calling hasUserDataPermission() 
14:50:40,709 DEBUG [org.apache.catalina.realm] (http-/127.0.0.1:8080-1) User data constraint has no restrictions 
14:50:40,710 DEBUG [org.apache.catalina.authenticator] (http-/127.0.0.1:8080-1) Calling authenticate() 
14:50:41,287 DEBUG [org.apache.catalina.authenticator] (http-/127.0.0.1:8080-1) Authenticated 'federico' with type 'BASIC' 
14:50:41,288 DEBUG [org.apache.catalina.authenticator] (http-/127.0.0.1:8080-1) Calling accessControl() 
14:50:41,288 DEBUG [org.apache.catalina.realm] (http-/127.0.0.1:8080-1) Checking roles GenericPrincipal[federico(mioruolo,)] 
14:50:41,321 DEBUG [org.apache.catalina.authenticator] (http-/127.0.0.1:8080-1) Failed accessControl() test 

Итак, autentication идет нормально, но разрешение (я думаю, что проверить, если «Federico» пользователь имеет «mioruolo» роль), терпит неудачу, и Я не могу понять причину, так как запрос, выполненный в клиенте Toad, выполняется без проблем.

Есть идеи по поводу этой ошибки? Любая помощь будет очень оценена.

Большое спасибо

С уважением

+0

'выберите роль, 'Роли' из s_roles где principal_id ='. Этот запрос не должен работать из-за запятой – kolossus

ответ

0

вы должны объявить роль в вашем HelloWorldWebService:

import javax.annotation.security.PermitAll; 
import javax.annotation.security.RolesAllowed; 
import javax.ejb.Stateless; 
import javax.jws.WebService; 

import org.jboss.ejb3.annotation.SecurityDomain; 
import org.jboss.ws.api.annotation.WebContext; 

@Stateless 
@WebService(name = "HelloWorldWS", targetNamespace="http://my-company/ws/") 
@WebContext(authMethod = "BASIC", contextRoot = "helloWS", urlPattern ="/*") 
@SecurityDomain("helloworld-webservice-login") 

@javax.annotation.security.DeclareRoles.DeclareRoles({"mioruolo"}) 

public class HelloWorldWebService implements HelloWorldWebServiceRemote { 

@RolesAllowed({"mioruolo"}) 
public String sayHello() { 
    return "Hello World"; 
} 
}