2013-12-10 4 views
2

Я пытаюсь настроить cxf soap webservice с авторизацией и аутентификацией, которые будут развернуты на Servicemix.cxf-rs-ws авторизация под karaf

Я настроил модуль аутентификации LDAP следующим образом:

<!-- Bean to allow the $[karaf.base] property to be correctly resolved --> 
<ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/> 

<jaas:config name="myRealm"> 
    <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule" flags="required"> 
     connection.url = ldap://srv-ldap:389 
     user.base.dn = ou=people,dc=intranet,dc=company,dc=com 
     user.filter = (uid=%u) 
     user.search.subtree = false 
     role.base.dn = ou=groups,dc=intranet,dc=company,dc=com 
     role.filter = (member:=uid=%u,ou=people,dc=intranet,dc=company,dc=com) 
     role.name.attribute = cn 
     role.search.subtree = true 
     authentication = simple 
    </jaas:module> 
</jaas:config> 

<service interface="org.apache.karaf.jaas.modules.BackingEngineFactory"> 
    <bean class="org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory"/> 
</service> 

А вот файл beans.xml

<jaxws:endpoint id="myService" 
     implementor="com.myorg.services.impl.MyServiceWSImpl" 
     address="/myService"> 
     <jaxws:inInterceptors> 
      <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> 
       <constructor-arg> 
        <map> 
         <entry key="action" value="UsernameToken" /> 
         <entry key="passwordType" value="PasswordText" /> 
        </map> 
       </constructor-arg> 
      </bean> 
      <ref bean="authenticationInterceptor" /> 
      <ref bean="authorizationInterceptor" /> 
     </jaxws:inInterceptors> 
     <jaxws:properties> 
      <entry key="ws-security.validate.token" value="false" /> 
     </jaxws:properties> 
    </jaxws:endpoint> 

    <bean id="authenticationInterceptor" 
     class="org.apache.cxf.interceptor.security.JAASLoginInterceptor"> 
     <property name="contextName" value="myRealm" /> 
    </bean> 

    <bean id="authorizationInterceptor" 
     class="org.apache.cxf.interceptor.security.SecureAnnotationsInterceptor"> 
     <property name="securedObject" ref="securedBean"/> 
    </bean> 

Наконец, в моей реализации WebService я аннотированный метод с @RolesAllowed.

@RolesAllowed("Role1") 
    public Department get(String name) throws IdMException { 
     return service.get(name); 
    } 

Аутентификационный перехватчик получает пользователя, аутентифицирует его и извлекает группы в качестве экземпляров RolePrincipal. Затем, в авторизационном перехватчике (SecureAnnotationsInterceptor), конфигурация метода считывается, ожидаемые Roles являются «Role1», но метод SimpleAuthorizingInterceptor.isUserInRole возвращает false.

Я не нашел ни одного примера, пытается сделать более или менее то же самое, и некоторую информацию я нашел из странице документации CXF http://cxf.apache.org/docs/security.html#Security-Authorization

я должен быть что-то важное не хватает, надеюсь, кто-то может мне помочь. Спасибо заранее и с уважением.

ответ

1

Ваша проблема в том, что RolePricipal от Karaf не реализует группу, как ожидалось CXF. Вместо этого он реализует Pricipal, поэтому CXF считает, что первое имя роли - это имя пользователя. Вот почему метод SimpleAuthorizingInterceptor.isUserInRole возвращает false ".

Решение должно содержать фиксированные версии CXF (2.7.11 и 3.0.0). Если невозможно обновить до более новой версии, то нечетное и временное решение (просто обходное решение) заключается в том, чтобы добавить несколько пользователей роли в LDAP и в метод.

Вы можете узнать больше о том, что ошибка здесь: CXF-5603

+0

Спасибо вам большое! –

+0

Нет проблем. Обратите внимание, что есть коммерческий клон ServiceMix с полной поддержкой. На данный момент такая же проблема возникает в JBoss Fuse, но она скоро будет решена в JBoss Fuse. Ссылка на вопрос: https://issues.jboss.org/browse/ENTESB-1672 –