/* * Copyright 2015 Petr Bouda * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied * See the License for the specific language governing permissions and * limitations under the License. */ package org.joyrest.oauth2.configurer.client; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.client.BaseClientDetails; import static java.util.Collections.addAll; public abstract class AbstractClientDetailsServiceConfigurer { private List<ClientBuilder> clientBuilders = new ArrayList<>(); public ClientBuilder withClient(String clientId) { ClientBuilder clientBuilder = new ClientBuilder(clientId); this.clientBuilders.add(clientBuilder); return clientBuilder; } public ClientDetailsService build() throws Exception { clientBuilders.forEach(builder -> addClient(builder.build())); return performBuild(); } abstract protected void addClient(ClientDetails build); abstract protected ClientDetailsService performBuild(); public final class ClientBuilder { private final String clientId; private Collection<String> authorizedGrantTypes = new LinkedHashSet<>(); private Collection<String> authorities = new LinkedHashSet<>(); private Integer accessTokenValiditySeconds; private Integer refreshTokenValiditySeconds; private Collection<String> scopes = new LinkedHashSet<>(); private Collection<String> autoApproveScopes = new HashSet<>(); private String secret; private Set<String> registeredRedirectUris = new HashSet<>(); private Set<String> resourceIds = new HashSet<>(); private boolean autoApprove = true; private Map<String, Object> additionalInformation = new LinkedHashMap<>(); private ClientBuilder(String clientId) { this.clientId = clientId; } private ClientDetails build() { BaseClientDetails result = new BaseClientDetails(); result.setClientId(clientId); result.setAuthorizedGrantTypes(authorizedGrantTypes); result.setAccessTokenValiditySeconds(accessTokenValiditySeconds); result.setRefreshTokenValiditySeconds(refreshTokenValiditySeconds); result.setRegisteredRedirectUri(registeredRedirectUris); result.setClientSecret(secret); result.setScope(scopes); result.setAuthorities(AuthorityUtils.createAuthorityList(authorities.toArray(new String[authorities.size()]))); result.setResourceIds(resourceIds); result.setAdditionalInformation(additionalInformation); if (autoApprove) { result.setAutoApproveScopes(scopes); } else { result.setAutoApproveScopes(autoApproveScopes); } return result; } public ClientBuilder resourceIds(String... resourceIds) { addAll(this.resourceIds, resourceIds); return this; } public ClientBuilder redirectUris(String... registeredRedirectUris) { addAll(this.registeredRedirectUris, registeredRedirectUris); return this; } public ClientBuilder authorizedGrantTypes(String... authorizedGrantTypes) { addAll(this.authorizedGrantTypes, authorizedGrantTypes); return this; } public ClientBuilder accessTokenValiditySeconds(int accessTokenValiditySeconds) { this.accessTokenValiditySeconds = accessTokenValiditySeconds; return this; } public ClientBuilder refreshTokenValiditySeconds(int refreshTokenValiditySeconds) { this.refreshTokenValiditySeconds = refreshTokenValiditySeconds; return this; } public ClientBuilder secret(String secret) { this.secret = secret; return this; } public ClientBuilder scopes(String... scopes) { addAll(this.scopes, scopes); return this; } public ClientBuilder authorities(String... authorities) { addAll(this.authorities, authorities); return this; } public ClientBuilder autoApprove(boolean autoApprove) { this.autoApprove = autoApprove; return this; } public ClientBuilder autoApprove(String... scopes) { addAll(this.autoApproveScopes, scopes); return this; } public ClientBuilder additionalInformation(Map<String, ?> map) { this.additionalInformation.putAll(map); return this; } public ClientBuilder additionalInformation(String... pairs) { for (String pair : pairs) { String separator = ":"; if (!pair.contains(separator) && pair.contains("=")) { separator = "="; } int index = pair.indexOf(separator); String key = pair.substring(0, index > 0 ? index : pair.length()); String value = index > 0 ? pair.substring(index + 1) : null; this.additionalInformation.put(key, value); } return this; } public AbstractClientDetailsServiceConfigurer and() { return AbstractClientDetailsServiceConfigurer.this; } } }