웹 서비스 호출을 위해 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를 호출하면 인증이되지 않습니다.
미리 감사드립니다.
일부 코드는 아마도 오류가 있습니까? – Namphibian
나는 낙타 restlet 구성 요소와 몇 가지 패키지 수준 클래스 및 개인 메서드를 재정 의하여 내 고유 한 secureRestlet을 만들었습니다. 나는 secureRestlet에 LDAPVerifier를 삽입했다. "secureRestlet :"과 같은 엔드 포인트를 사용하는 경우 지금은 LDAP 인증을 트리거합니다. "restlet :"과 같은 엔드 포인트를 사용하면 ldap auth가 발생하지 않습니다. –
죄송합니다. 코드 및 오류를 추가 한 사실을 놓쳤습니다. 답변을 아래에 게시하지 마십시오. – Namphibian