@Test public void defaultSearchFilter() throws Exception { // given final String defaultSearchFilter = "(&(objectClass=user)(userPrincipalName={0}))"; DirContext ctx = mock(DirContext.class); when(ctx.getNameInNamespace()).thenReturn(""); DirContextAdapter dca = new DirContextAdapter(); SearchResult sr = new SearchResult("CN=Joe Jannsen,CN=Users", dca, dca.getAttributes()); when( ctx.search(any(Name.class), eq(defaultSearchFilter), any(Object[].class), any(SearchControls.class))).thenReturn( new MockNamingEnumeration(sr)); ActiveDirectoryLdapAuthenticationProvider customProvider = new ActiveDirectoryLdapAuthenticationProvider( "mydomain.eu", "ldap://192.168.1.200/"); customProvider.contextFactory = createContextFactoryReturning(ctx); // when Authentication result = customProvider.authenticate(joe); // then assertThat(result.isAuthenticated()).isTrue(); verify(ctx).search(any(DistinguishedName.class), eq(defaultSearchFilter), any(Object[].class), any(SearchControls.class)); }
@Test public void bindPrincipalAndUsernameUsed() throws Exception { // given final String defaultSearchFilter = "(&(objectClass=user)(userPrincipalName={0}))"; ArgumentCaptor<Object[]> captor = ArgumentCaptor.forClass(Object[].class); DirContext ctx = mock(DirContext.class); when(ctx.getNameInNamespace()).thenReturn(""); DirContextAdapter dca = new DirContextAdapter(); SearchResult sr = new SearchResult("CN=Joe Jannsen,CN=Users", dca, dca.getAttributes()); when( ctx.search(any(Name.class), eq(defaultSearchFilter), captor.capture(), any(SearchControls.class))).thenReturn( new MockNamingEnumeration(sr)); ActiveDirectoryLdapAuthenticationProvider customProvider = new ActiveDirectoryLdapAuthenticationProvider( "mydomain.eu", "ldap://192.168.1.200/"); customProvider.contextFactory = createContextFactoryReturning(ctx); // when Authentication result = customProvider.authenticate(joe); // then assertThat(captor.getValue()).containsExactly("joe@mydomain.eu", "joe"); assertThat(result.isAuthenticated()).isTrue(); }
private void checkAuthentication(String rootDn, ActiveDirectoryLdapAuthenticationProvider provider) throws NamingException { DirContext ctx = mock(DirContext.class); when(ctx.getNameInNamespace()).thenReturn(""); DirContextAdapter dca = new DirContextAdapter(); SearchResult sr = new SearchResult("CN=Joe Jannsen,CN=Users", dca, dca.getAttributes()); @SuppressWarnings("deprecation") DistinguishedName searchBaseDn = new DistinguishedName(rootDn); when( ctx.search(eq(searchBaseDn), any(String.class), any(Object[].class), any(SearchControls.class))).thenReturn( new MockNamingEnumeration(sr)).thenReturn(new MockNamingEnumeration(sr)); provider.contextFactory = createContextFactoryReturning(ctx); Authentication result = provider.authenticate(joe); assertThat(result.getAuthorities()).isEmpty(); dca.addAttributeValue("memberOf", "CN=Admin,CN=Users,DC=mydomain,DC=eu"); result = provider.authenticate(joe); assertThat(result.getAuthorities()).hasSize(1); }
@Test public void customSearchFilterIsUsedForSuccessfulAuthentication() throws Exception { // given String customSearchFilter = "(&(objectClass=user)(sAMAccountName={0}))"; DirContext ctx = mock(DirContext.class); when(ctx.getNameInNamespace()).thenReturn(""); DirContextAdapter dca = new DirContextAdapter(); SearchResult sr = new SearchResult("CN=Joe Jannsen,CN=Users", dca, dca.getAttributes()); when( ctx.search(any(Name.class), eq(customSearchFilter), any(Object[].class), any(SearchControls.class))).thenReturn( new MockNamingEnumeration(sr)); ActiveDirectoryLdapAuthenticationProvider customProvider = new ActiveDirectoryLdapAuthenticationProvider( "mydomain.eu", "ldap://192.168.1.200/"); customProvider.contextFactory = createContextFactoryReturning(ctx); // when customProvider.setSearchFilter(customSearchFilter); Authentication result = customProvider.authenticate(joe); // then assertThat(result.isAuthenticated()).isTrue(); }
@Test public void nullDomainIsSupportedIfAuthenticatingWithFullUserPrincipal() throws Exception { provider = new ActiveDirectoryLdapAuthenticationProvider(null, "ldap://192.168.1.200/"); DirContext ctx = mock(DirContext.class); when(ctx.getNameInNamespace()).thenReturn(""); DirContextAdapter dca = new DirContextAdapter(); SearchResult sr = new SearchResult("CN=Joe Jannsen,CN=Users", dca, dca.getAttributes()); when( ctx.search(eq(new DistinguishedName("DC=mydomain,DC=eu")), any(String.class), any(Object[].class), any(SearchControls.class))) .thenReturn(new MockNamingEnumeration(sr)); provider.contextFactory = createContextFactoryReturning(ctx); try { provider.authenticate(joe); fail("Expected BadCredentialsException for user with no domain information"); } catch (BadCredentialsException expected) { } provider.authenticate(new UsernamePasswordAuthenticationToken("joe@mydomain.eu", "password")); }
/** * Returns a jndi search result that represents the supplied search entry. * * @param entry search entry * * @return jndi search result */ public SearchResult fromSearchEntry(final SearchEntry entry) { return new SearchResult(entry.getDn(), null, fromLdapAttributes(entry.getAttributes())); }
/** * Returns a jndi search result that represents the supplied search entry. * * @param entry search entry * * @return jndi search result */ public SearchResult fromSearchEntry(final SearchEntry entry) { return new SearchResult(entry.getDn(), null, fromLdapAttributes(entry.getAttributes())); }
/** * Returns a jndi search result that represents the supplied search entry. * * @param entry search entry * * @return jndi search result */ public SearchResult fromSearchEntry(final SearchEntry entry) { return new SearchResult(entry.getDn(), null, fromLdapAttributes(entry.getAttributes())); }
@SuppressWarnings ( "unchecked" ) public static Enumeration<?> makeLazySearchEnumeration ( String codebase, String clazz ) throws Exception { DirContext ctx = makeContinuationContext(codebase, clazz); NamingEnumeration<?> inner = Reflections.createWithoutConstructor(LazySearchEnumerationImpl.class); Reflections.setFieldValue(inner, "nextMatch", new SearchResult("foo", ctx, null)); return new LazySearchEnumerationImpl((NamingEnumeration<Binding>) inner, null, null); }
/** * @see javax.naming.NamingEnumeration#next() */ public SearchResult next() throws NamingException { ServerSearchResult rec = result.next(); SearchResult searchResult = new SearchResult( rec.getDn().getName(), rec.getObject(), toBasicAttributes( rec.getServerEntry() ), rec.isRelative() ); return searchResult; }
@Test public void testDoSearch() throws Exception { expectGetReadOnlyContext(); SearchResult searchResult = new SearchResult(null, null, null); when(searchExecutorMock.executeSearch(dirContextMock)).thenReturn(namingEnumerationMock); when(namingEnumerationMock.hasMore()).thenReturn(true, false); when(namingEnumerationMock.next()).thenReturn(searchResult); tested.search(searchExecutorMock, handlerMock); verify(handlerMock).handleNameClassPair(searchResult); verify(namingEnumerationMock).close(); verify(dirContextMock).close(); }
/** * @see javax.naming.NamingEnumeration#next() */ public SearchResult next() throws NamingException { ServerSearchResult rec = result.next(); SearchResult searchResult = new SearchResult( rec.getDn().getName(), rec.getObject(), toBasicAttributes( rec.getServerEntry() ), rec.isRelative() ); return searchResult; }
@Test public void testDoSearch_DirContextProcessor() throws Exception { expectGetReadOnlyContext(); SearchResult searchResult = new SearchResult(null, null, null); when(searchExecutorMock.executeSearch(dirContextMock)).thenReturn(namingEnumerationMock); when(namingEnumerationMock.hasMore()).thenReturn(true, false); when(namingEnumerationMock.next()).thenReturn(searchResult); tested.search(searchExecutorMock, handlerMock, dirContextProcessorMock); verify(dirContextProcessorMock).preProcess(dirContextMock); verify(dirContextProcessorMock).postProcess(dirContextMock); verify(handlerMock).handleNameClassPair(searchResult); verify(namingEnumerationMock).close(); verify(dirContextMock).close(); }
@Test public void testSearchForObject() throws Exception { expectGetReadOnlyContext(); Object expectedObject = new Object(); SearchResult searchResult = new SearchResult("", expectedObject, new BasicAttributes()); singleSearchResult(searchControlsRecursive(), searchResult); Object expectedResult = expectedObject; when(contextMapperMock.mapFromContext(expectedObject)).thenReturn(expectedResult); Object result = tested.searchForObject(nameMock, "(ou=somevalue)", contextMapperMock); verify(dirContextMock).close(); assertThat(result).isNotNull(); assertThat(result).isSameAs(expectedResult); }
@Test public void testSearch_CallbackHandler() throws Exception { expectGetReadOnlyContext(); SearchResult searchResult = new SearchResult("", new Object(), new BasicAttributes()); singleSearchResult(searchControlsOneLevel(), searchResult); tested.search(nameMock, "(ou=somevalue)", 1, true, handlerMock); verify(handlerMock).handleNameClassPair(searchResult); verify(dirContextMock).close(); }
@Test public void testSearch_StringBase_CallbackHandler() throws Exception { expectGetReadOnlyContext(); SearchControls controls = searchControlsOneLevel(); SearchResult searchResult = new SearchResult("", new Object(), new BasicAttributes()); singleSearchResultWithStringBase(controls, searchResult); tested.search(DEFAULT_BASE_STRING, "(ou=somevalue)", 1, true, handlerMock); verify(handlerMock).handleNameClassPair(searchResult); verify(dirContextMock).close(); }
@Test public void testHandleSearchResult() throws Exception { SearchResult dummy = new SearchResult(null, null, null); tested.handleNameClassPair(dummy); tested.handleNameClassPair(dummy); tested.handleNameClassPair(dummy); assertThat(tested.getNoOfRows()).isEqualTo(3); }
@Test public void testSearch_CallbackHandler_Defaults() throws Exception { expectGetReadOnlyContext(); SearchControls controls = searchControlsRecursive(); controls.setReturningObjFlag(false); SearchResult searchResult = new SearchResult("", new Object(), new BasicAttributes()); singleSearchResult(controls, searchResult); tested.search(nameMock, "(ou=somevalue)", handlerMock); verify(handlerMock).handleNameClassPair(searchResult); verify(dirContextMock).close(); }
@Test public void testSearch_String_CallbackHandler_Defaults() throws Exception { expectGetReadOnlyContext(); SearchControls controls = searchControlsRecursive(); controls.setReturningObjFlag(false); SearchResult searchResult = new SearchResult("", new Object(), new BasicAttributes()); singleSearchResultWithStringBase(controls, searchResult); tested.search(DEFAULT_BASE_STRING, "(ou=somevalue)", handlerMock); verify(handlerMock).handleNameClassPair(searchResult); verify(dirContextMock).close(); }
@Test public void testAuthenticateWithFailedAuthenticationShouldFail() throws Exception { when(contextSourceMock.getReadOnlyContext()).thenReturn(dirContextMock); Object expectedObject = new DirContextAdapter(new BasicAttributes(), LdapUtils.newLdapName("cn=john doe"), LdapUtils.newLdapName("dc=jayway, dc=se")); SearchResult searchResult = new SearchResult("", expectedObject, new BasicAttributes()); singleSearchResult(searchControlsRecursive(), searchResult); when(contextSourceMock.getContext("cn=john doe,dc=jayway,dc=se", "password")) .thenThrow(new UncategorizedLdapException("Authentication failed")); boolean result = tested.authenticate(nameMock, "(ou=somevalue)", "password", entryContextCallbackMock); verify(dirContextMock).close(); assertThat(result).isFalse(); }