2014-07-22 3 views
2

웹 서비스 호출을 위해 camel-restlet을 사용하는 Camel 애플리케이션이 있습니다. 이제 restlet 호출에 ldap 인증을 추가하려고합니다. ChallengeAuthenticator를 사용하는 낙타 - 레스 렛 영역, LdapVerifier로 몇 가지 옵션을 시도했습니다. 그것을 작동하게 만들 수 없다! 도움이 필요하다? 감사합니다Camel + restlet 앱에 대한 LDAP 인증

LDAP SecretVerifer를 사용하여 restlet에 LDAP 인증을 추가 할 수 있습니다. 그러나 restlet 호출이 Camel 라우트로 감싸 져 있다면 (org.apache.camel.component.restlet.MethodBasedRoute 사용). SecretVerifer가 실행되지 않았습니다. 여기

일부 코드 및 구성이다 : 의 web.xml :

<servlet> 
    <servlet-name>RestletServlet</servlet-name> 
    <servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class> 
    <init-param> 
    <param-name>org.restlet.component</param-name> 
    <param-value>RestletComponent</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>RestletServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

CamelContext.xml

<bean id="RestletComponent" class="org.restlet.Component"> 
    <property name="defaultHost" ref="defaultHost" /> 
</bean> 

<bean id="challengeAuthenticator" class="org.restlet.security.ChallengeAuthenticator"> 
    <constructor-arg><null /></constructor-arg> 
    <!-- Sets the Challenge scheme parameter to the static class member --> 
    <constructor-arg value="#{ T(org.restlet.data.ChallengeScheme).HTTP_BASIC }" /> 
    <constructor-arg value="restletRealm" /> 
    <property name="verifier" ref="ldapVerifer" /> 
    <property name="next" ref="application" /> 
</bean> 

<bean id="defaultHost" class="org.restlet.ext.spring.SpringHost"> 
    <constructor-arg ref="RestletComponent" /> 
    <property name="defaultAttachment" ref="challengeAuthenticator" /> 
</bean> 

<!-- Restlet application --> 
<bean id="application" class="org.restlet.Application"> 
    <!-- Sets the router for the application --> 
    <property name="inboundRoot" ref="router" /> 
</bean> 


<!-- Used to map routes to Restlet resources --> 
<bean id="router" class="org.restlet.ext.spring.SpringRouter"> 
    <property name="attachments"> 
     <map> 
      <entry key="/user/{name}"> 
       <bean class="org.restlet.ext.spring.SpringFinder"> 
        <lookup-method name="create" bean="userServerResource" /> 
       </bean> 
      </entry> 
     </map> 
    </property> 
</bean> 

<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent"> 
<constructor-arg ref="RestletComponent" /> 
</bean> 

LdapVerifer.java 여기

@Service(value="ldapVerifer") 
public class LdapVerifer extends SecretVerifier { 

@Autowired 
private AuthenticationManager authenticationManager; 

private static final Logger logger = LoggerFactory 
     .getLogger(LdapVerifer.class); 

@Override 
public int verify(String userName, char[] password) 
{ 

    logger.debug("Start authenticating login user : " + userName); 
    long startTime = System.currentTimeMillis(); 

    StringBuffer pd = new StringBuffer(); 

    for(int i = 0; i < password.length; i++){ 
     pd.append(password[i]); 
    } 
    try { 
     Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(userName, pd.toString())); 
     if (authenticate.isAuthenticated()) 
     { 
      SecurityContextHolder.getContext().setAuthentication(authenticate); 
      long endTime = System.currentTimeMillis(); 
      logger.debug ("Authentication for login user " + userName + " succeed. the process time is: " + (endTime - startTime) + " milliseconds"); 
      return RESULT_VALID; 
     } 
    } 
    catch (AuthenticationException e) 
    { 
     logger.error("Failed to authenticate login user: " + userName, e); 
    } 
    return RESULT_VALID; 
} 

된다으로 Restlet 라우팅의 출력 :

Jul 23, 2014 10:05:44 AM org.apache.catalina.core.ApplicationContext log 
INFO: RestletServlet: [Restlet] Attaching restlet:  [email protected] to URI: /medbus 
Jul 23, 2014 10:05:44 AM org.apache.catalina.core.ApplicationContext log 
INFO: RestletServlet: [Restlet] Attaching restlet: [email protected] to URI: /medbus/wf/query/{id}/{includeResult} 
Jul 23, 2014 10:05:44 AM org.apache.catalina.core.ApplicationContext log 
INFO: RestletServlet: [Restlet] Attaching restlet: [email protected] to URI: /medbus/wf/query 
Jul 23, 2014 10:05:44 AM org.apache.catalina.core.ApplicationContext log 
INFO: RestletServlet: [Restlet] Attaching restlet: [email protected] to URI: /medbus/wf/reprocess/{id} 

낙타 경로가 아닌 URI에 액세스하면 Ldap 인증이 시작되지만 낙타 경로의 URI에 액세스하면됩니다. LDAP 인증이 전혀 트리거되지 않았습니다. 예를 들어,/medbus/user/name을 호출하면 제대로 작동하지만/medbus/wf/query를 호출하면 인증이되지 않습니다.

미리 감사드립니다.

+0

일부 코드는 아마도 오류가 있습니까? – Namphibian

+0

나는 낙타 restlet 구성 요소와 몇 가지 패키지 수준 클래스 및 개인 메서드를 재정 의하여 내 고유 한 secureRestlet을 만들었습니다. 나는 secureRestlet에 LDAPVerifier를 삽입했다. "secureRestlet :"과 같은 엔드 포인트를 사용하는 경우 지금은 LDAP 인증을 트리거합니다. "restlet :"과 같은 엔드 포인트를 사용하면 ldap auth가 발생하지 않습니다. –

+0

죄송합니다. 코드 및 오류를 추가 한 사실을 놓쳤습니다. 답변을 아래에 게시하지 마십시오. – Namphibian

답변

0

필자는 camel restlet 구성 요소와 몇 가지 패키지 수준 클래스 및 개인 메서드를 재정 의하여 내 고유 secureRestlet을 만들었습니다. 나는 secureRestlet에 LDAPVerifier를 삽입했다. "secureRestlet :"과 같은 엔드 포인트를 사용하는 경우 지금은 LDAP 인증을 트리거합니다. "restlet :"과 같은 엔드 포인트를 사용하면 ldap auth가 발생하지 않습니다.