|
|
@@ -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();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
}
|