/* * Copyright 2002-2013 the original author or authors. * * 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.springframework.security.oauth2.config.annotation.authentication.configurers; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.oauth2.provider.BaseClientDetails; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.InMemoryClientDetailsService; import org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService; /** * @author Rob Winch * */ public class InMemoryClientDetailsServiceConfigurer extends SecurityConfigurerAdapter<AuthenticationManager,AuthenticationManagerBuilder>{ private List<ClientBuilder> clientBuilders = new ArrayList<ClientBuilder>(); public ClientBuilder withClient(String clientId) { ClientBuilder clientBuilder = new ClientBuilder(clientId); this.clientBuilders.add(clientBuilder); return clientBuilder; } @Override public void init(AuthenticationManagerBuilder builder) throws Exception { Map<String,ClientDetails> clientDetails = new HashMap<String,ClientDetails>(clientBuilders.size()); for(ClientBuilder clientDetailsBldr : clientBuilders) { clientDetails.put(clientDetailsBldr.clientId, clientDetailsBldr.build()); } InMemoryClientDetailsService clientDetailsService = new InMemoryClientDetailsService(); clientDetailsService.setClientDetailsStore(clientDetails); ClientDetailsUserDetailsService userDetailsService = new ClientDetailsUserDetailsService(clientDetailsService); builder.userDetailsService(userDetailsService); builder.setSharedObject(ClientDetailsService.class, clientDetailsService); } @Override public void configure(AuthenticationManagerBuilder builder) throws Exception { } public final class ClientBuilder { private final String clientId; private Collection<String> authorizedGrantTypes = new ArrayList<String>(); private Collection<String> authorities = new ArrayList<String>(); private Integer accessTokenValiditySeconds; private Integer refreshTokenValiditySeconds; private Collection<String> scopes = new ArrayList<String>(); private String secret; private Set<String> registeredRedirectUris = new HashSet<String>(); private Set<String> resourceIds = new HashSet<String>(); 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); return result; } public ClientBuilder resourceIds(String... resourceIds) { for(String resourceId : resourceIds) { this.resourceIds.add(resourceId); } return this; } public ClientBuilder redirectUris(String... registeredRedirectUris) { for(String redirectUri : registeredRedirectUris) { this.registeredRedirectUris.add(redirectUri); } return this; } public ClientBuilder authorizedGrantTypes(String... authorizedGrantTypes) { for(String grant : authorizedGrantTypes) { this.authorizedGrantTypes.add(grant); } 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) { for(String scope : scopes) { this.scopes.add(scope); } return this; } public ClientBuilder authorities(String... authorities) { for(String authority : authorities) { this.authorities.add(authority); } return this; } public InMemoryClientDetailsServiceConfigurer and() { return InMemoryClientDetailsServiceConfigurer.this; } private ClientBuilder(String clientId) { this.clientId = clientId; } } }