Search in sources :

Example 1 with RetainIdentityRequestControl

use of com.unboundid.ldap.sdk.unboundidds.controls.RetainIdentityRequestControl in project ssam by pingidentity.

the class LDAPAuthenticationProvider method authenticate.

/**
 * {@inheritDoc}
 */
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String searchBindFilter = settings.getSearchBindFilter();
    User userDetails = null;
    BindRequest request = null;
    // Get the username and password, making sure they're not empty
    String username = authentication.getName();
    String password = (String) authentication.getCredentials();
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
        throw new BadCredentialsException("Username and password must be provided");
    }
    // If a filter is available, perform 'Search and Bind'
    if (StringUtils.isNotEmpty(searchBindFilter)) {
        Entry entry;
        String filter = searchBindFilter.replace("$0", username);
        try {
            entry = pool.searchForEntry(settings.getBaseDN(), SearchScope.SUB, Filter.create(filter));
            if (entry == null) {
                throw new BadCredentialsException("Invalid credentials for user: " + username);
            }
        } catch (LDAPSearchException e) {
            throw new BadCredentialsException("An exception occurred while searching" + " for user: " + username, e);
        } catch (LDAPException e) {
            throw new BadCredentialsException("The filter string cannot be decoded " + "as a valid search filter for user: " + username, e);
        }
        // Obtain the bind DN and try to bind, retaining the identity of the
        // pooled connection
        request = new SimpleBindRequest(entry.getDN(), password, new RetainIdentityRequestControl());
        userDetails = new LDAPUser(entry.getDN(), username, password, EMPTY_AUTHORITIES);
    } else {
        // Construct a SASL PLAIN Bind Request since no filter is available for
        // 'Search and Bind'
        request = new PLAINBindRequest("u:" + username, password, new GetAuthorizationEntryRequestControl(false, true, "1.1"), new RetainIdentityRequestControl());
    }
    try {
        BindResult result = pool.bind(request);
        // Use a Response Control to obtain a DN for the authentication token
        if (request instanceof PLAINBindRequest) {
            GetAuthorizationEntryResponseControl responseControl = GetAuthorizationEntryResponseControl.get(result);
            if (responseControl == null) {
                // No entry returned, User will be used for the authentication token
                userDetails = new User(username, password, EMPTY_AUTHORITIES);
            } else {
                // Entry returned, LDAPUser will be used for the authentication token
                userDetails = new LDAPUser(responseControl.getAuthZEntry().getDN(), username, password, EMPTY_AUTHORITIES);
            }
        }
    } catch (LDAPException e) {
        throw new BadCredentialsException("Invalid credentials for user:  " + username, e);
    }
    // Construct the authentication token and return it
    return new UsernamePasswordAuthenticationToken(userDetails, password, EMPTY_AUTHORITIES);
}
Also used : User(org.springframework.security.core.userdetails.User) BindRequest(com.unboundid.ldap.sdk.BindRequest) PLAINBindRequest(com.unboundid.ldap.sdk.PLAINBindRequest) SimpleBindRequest(com.unboundid.ldap.sdk.SimpleBindRequest) PLAINBindRequest(com.unboundid.ldap.sdk.PLAINBindRequest) UsernamePasswordAuthenticationToken(org.springframework.security.authentication.UsernamePasswordAuthenticationToken) BadCredentialsException(org.springframework.security.authentication.BadCredentialsException) Entry(com.unboundid.ldap.sdk.Entry) SimpleBindRequest(com.unboundid.ldap.sdk.SimpleBindRequest) GetAuthorizationEntryResponseControl(com.unboundid.ldap.sdk.unboundidds.controls.GetAuthorizationEntryResponseControl) LDAPException(com.unboundid.ldap.sdk.LDAPException) LDAPSearchException(com.unboundid.ldap.sdk.LDAPSearchException) BindResult(com.unboundid.ldap.sdk.BindResult) RetainIdentityRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.RetainIdentityRequestControl) GetAuthorizationEntryRequestControl(com.unboundid.ldap.sdk.unboundidds.controls.GetAuthorizationEntryRequestControl)

Aggregations

BindRequest (com.unboundid.ldap.sdk.BindRequest)1 BindResult (com.unboundid.ldap.sdk.BindResult)1 Entry (com.unboundid.ldap.sdk.Entry)1 LDAPException (com.unboundid.ldap.sdk.LDAPException)1 LDAPSearchException (com.unboundid.ldap.sdk.LDAPSearchException)1 PLAINBindRequest (com.unboundid.ldap.sdk.PLAINBindRequest)1 SimpleBindRequest (com.unboundid.ldap.sdk.SimpleBindRequest)1 GetAuthorizationEntryRequestControl (com.unboundid.ldap.sdk.unboundidds.controls.GetAuthorizationEntryRequestControl)1 GetAuthorizationEntryResponseControl (com.unboundid.ldap.sdk.unboundidds.controls.GetAuthorizationEntryResponseControl)1 RetainIdentityRequestControl (com.unboundid.ldap.sdk.unboundidds.controls.RetainIdentityRequestControl)1 BadCredentialsException (org.springframework.security.authentication.BadCredentialsException)1 UsernamePasswordAuthenticationToken (org.springframework.security.authentication.UsernamePasswordAuthenticationToken)1 User (org.springframework.security.core.userdetails.User)1