|  | @@ -16,42 +16,11 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  package org.springframework.security.core;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.util.Collection;
 | 
	
		
			
				|  |  | -import java.util.Set;
 | 
	
		
			
				|  |  | -import java.util.function.Consumer;
 | 
	
		
			
				|  |  | -import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import org.jspecify.annotations.Nullable;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import org.springframework.security.authentication.AuthenticationManager;
 | 
	
		
			
				|  |  | -import org.springframework.security.core.context.SecurityContextHolder;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * Represents the token for an authentication request or for an authenticated principal
 | 
	
		
			
				|  |  | - * once the request has been processed by the
 | 
	
		
			
				|  |  | - * {@link AuthenticationManager#authenticate(Authentication)} method.
 | 
	
		
			
				|  |  | - * <p>
 | 
	
		
			
				|  |  | - * Once the request has been authenticated, the <tt>Authentication</tt> will usually be
 | 
	
		
			
				|  |  | - * stored in a thread-local <tt>SecurityContext</tt> managed by the
 | 
	
		
			
				|  |  | - * {@link SecurityContextHolder} by the authentication mechanism which is being used. An
 | 
	
		
			
				|  |  | - * explicit authentication can be achieved, without using one of Spring Security's
 | 
	
		
			
				|  |  | - * authentication mechanisms, by creating an <tt>Authentication</tt> instance and using
 | 
	
		
			
				|  |  | - * the code:
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * <pre>
 | 
	
		
			
				|  |  | - * SecurityContext context = SecurityContextHolder.createEmptyContext();
 | 
	
		
			
				|  |  | - * context.setAuthentication(anAuthentication);
 | 
	
		
			
				|  |  | - * SecurityContextHolder.setContext(context);
 | 
	
		
			
				|  |  | - * </pre>
 | 
	
		
			
				|  |  | + * An {@link Authentication} that is also buildable.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  | - * Note that unless the <tt>Authentication</tt> has the <tt>authenticated</tt> property
 | 
	
		
			
				|  |  | - * set to <tt>true</tt>, it will still be authenticated by any security interceptor (for
 | 
	
		
			
				|  |  | - * method or web invocations) which encounters it.
 | 
	
		
			
				|  |  | - * <p>
 | 
	
		
			
				|  |  | - * In most cases, the framework transparently takes care of managing the security context
 | 
	
		
			
				|  |  | - * and authentication objects for you.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @author Ben Alex
 | 
	
		
			
				|  |  | + * @author Josh Cummings
 | 
	
		
			
				|  |  | + * @since 7.0
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  public interface BuildableAuthentication extends Authentication {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -69,118 +38,9 @@ public interface BuildableAuthentication extends Authentication {
 | 
	
		
			
				|  |  |  	 * {@link Authentication} interface and that custom information is often contained in
 | 
	
		
			
				|  |  |  	 * the {@link Authentication#getPrincipal} value.
 | 
	
		
			
				|  |  |  	 * </p>
 | 
	
		
			
				|  |  | -	 * @return an {@link Builder} for building a new {@link BuildableAuthentication} based
 | 
	
		
			
				|  |  | -	 * on this instance
 | 
	
		
			
				|  |  | -	 * @since 7.0
 | 
	
		
			
				|  |  | +	 * @return an {@link Builder} for building a new {@link Authentication} based on this
 | 
	
		
			
				|  |  | +	 * instance
 | 
	
		
			
				|  |  |  	 */
 | 
	
		
			
				|  |  |  	Builder<?> toBuilder();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	/**
 | 
	
		
			
				|  |  | -	 * A builder based on a given {@link BuildableAuthentication} instance
 | 
	
		
			
				|  |  | -	 *
 | 
	
		
			
				|  |  | -	 * @author Josh Cummings
 | 
	
		
			
				|  |  | -	 * @since 7.0
 | 
	
		
			
				|  |  | -	 */
 | 
	
		
			
				|  |  | -	interface Builder<B extends Builder<B>> {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Apply this authentication instance
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * By default, merges the authorities in the provided {@code authentication} with
 | 
	
		
			
				|  |  | -		 * the authentication being built. Only those authorities that haven't already
 | 
	
		
			
				|  |  | -		 * been specified to the builder will be added.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * @param authentication the {@link Authentication} to appluy
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see BuildableAuthentication#getAuthorities
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		default B authentication(Authentication authentication) {
 | 
	
		
			
				|  |  | -			return authorities((a) -> {
 | 
	
		
			
				|  |  | -				Set<String> newAuthorities = a.stream()
 | 
	
		
			
				|  |  | -					.map(GrantedAuthority::getAuthority)
 | 
	
		
			
				|  |  | -					.collect(Collectors.toUnmodifiableSet());
 | 
	
		
			
				|  |  | -				for (GrantedAuthority currentAuthority : authentication.getAuthorities()) {
 | 
	
		
			
				|  |  | -					if (!newAuthorities.contains(currentAuthority.getAuthority())) {
 | 
	
		
			
				|  |  | -						a.add(currentAuthority);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			});
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Mutate the authorities with this {@link Consumer}.
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * Note that since a non-empty set of authorities implies an
 | 
	
		
			
				|  |  | -		 * {@link Authentication} is authenticated, this method also marks the
 | 
	
		
			
				|  |  | -		 * authentication as {@link #authenticated} by default.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * @param authorities a consumer that receives the full set of authorities
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see Authentication#getAuthorities
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		B authorities(Consumer<Collection<GrantedAuthority>> authorities);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Use this credential.
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * Note that since some credentials are insecure to store, this method is
 | 
	
		
			
				|  |  | -		 * implemented as unsupported by default. Only implement or use this method if you
 | 
	
		
			
				|  |  | -		 * support secure storage of the credential or if your implementation also
 | 
	
		
			
				|  |  | -		 * implements {@link CredentialsContainer} and the credentials are thereby erased.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * @param credentials the credentials to use
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see Authentication#getCredentials
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		default B credentials(@Nullable Object credentials) {
 | 
	
		
			
				|  |  | -			throw new UnsupportedOperationException(
 | 
	
		
			
				|  |  | -					String.format("%s does not store credentials", this.getClass().getSimpleName()));
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Use this details object.
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * Implementations may choose to use these {@code details} in combination with any
 | 
	
		
			
				|  |  | -		 * principal from the pre-existing {@link Authentication} instance.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * @param details the details to use
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see Authentication#getDetails
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		B details(@Nullable Object details);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Use this principal.
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * Note that in many cases, the principal is strongly-typed. Implementations may
 | 
	
		
			
				|  |  | -		 * choose to do a type check and are not necessarily expected to allow any object
 | 
	
		
			
				|  |  | -		 * as a principal.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * <p>
 | 
	
		
			
				|  |  | -		 * Implementations may choose to use this {@code principal} in combination with
 | 
	
		
			
				|  |  | -		 * any principal from the pre-existing {@link Authentication} instance.
 | 
	
		
			
				|  |  | -		 * </p>
 | 
	
		
			
				|  |  | -		 * @param principal the principal to use
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see Authentication#getPrincipal
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		B principal(@Nullable Object principal);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Mark this authentication as authenticated or not
 | 
	
		
			
				|  |  | -		 * @param authenticated whether this is an authenticated {@link Authentication}
 | 
	
		
			
				|  |  | -		 * instance
 | 
	
		
			
				|  |  | -		 * @return the {@link Builder} for additional configuration
 | 
	
		
			
				|  |  | -		 * @see Authentication#isAuthenticated
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		B authenticated(boolean authenticated);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		/**
 | 
	
		
			
				|  |  | -		 * Build an {@link Authentication} instance
 | 
	
		
			
				|  |  | -		 * @return the {@link Authentication} instance
 | 
	
		
			
				|  |  | -		 */
 | 
	
		
			
				|  |  | -		Authentication build();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }
 |