views:

20

answers:

1

Hi,

I have problem with LDAP Spring Security, I'm trying to authorise against the LDAP server. I have the spring configuration xml file (security-config.xml) like this:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"&gt;

 <bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
  <constructor-arg value="ldap://111.111.111.111"/>
  <property name="userDn" value="cn=auth-user,ou=System,dc=foo,dc=com"/>
  <property name="password" value="fooPwd"/>
 </bean>

 <bean id="ldapAuthProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
  <constructor-arg>
   <bean class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
    <constructor-arg ref="contextSource"/>
    <property name="userSearch">
     <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
       <constructor-arg index="0" value="ou=people"/>
       <constructor-arg index="1" value="(uid={0})"/>
       <constructor-arg index="2" ref="contextSource" />
     </bean>
    </property>
   </bean>
  </constructor-arg>
  <constructor-arg>
   <bean class="com.company.name.services.UserAuthoritiesPopulator" />
  </constructor-arg>
 </bean>
</beans>

In the login controller (LoginController.java) I'm authorising like this:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginPPost(String username, String password, Model model, HttpServletRequest req, HttpServletResponse res) throws SQLException {

 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
 Authentication authentication = authenticationManager.authenticate(authRequest);
 SecurityContextHolder.getContext().setAuthentication(authentication);
 ...
}

The method "authenticationManager.authenticate(authRequest)" throws this exception:

org.springframework.security.providers.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.providers.UsernamePasswordAuthenticationToken
    at org.springframework.security.providers.ProviderManager.doAuthentication(ProviderManager.java:214)
    at org.springframework.security.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:46)

Does anybody know how to solve this problem? Should I use different method for authorisation? Or is my configuration bad?

Thanks for any help,

Mateo

+1  A: 

You must add the tag 'sec:custom-authentication-provider' in your authentication provider bean:

<bean id="ldapAuthProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
    <sec:custom-authentication-provider/>
    ...
</bean>

You can find an example that use Crowd instead of LDAP on my blog: http://aloiscochard.blogspot.com/2009/12/integrating-spring-security-with-ntlm_19.html

Alois Cochard
Thanks a lot! It helped. I'm just wondering that I wasn't able to find it anywhere in the Spring Secuirty doc:-/
mateo