Context

UsernamePasswordAuthenticationToken has two constructors.

one creates a UsernamePasswordAuthenticationToken in the unauthenticated state, and the other creates a UsernamePasswordAuthenticationToken in the authenticated state.

constructors in Java cannot have names, so you have to look at the detailed implementation or refer to javadoc etc to get this information.

i think this part can be improved by adding a static factory method with names.

let us know what you think about this proposal. and have a nice day.


Current codes

public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {

       ...

    /**
     * This constructor can be safely used by any code that wishes to create a
     * <code>UsernamePasswordAuthenticationToken</code>, as the {@link #isAuthenticated()}
     * will return <code>false</code>.
     *
     */
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
        super(null);
        this.principal = principal;
        this.credentials = credentials;
        setAuthenticated(false);
    }

    /**
     * This constructor should only be used by <code>AuthenticationManager</code> or
     * <code>AuthenticationProvider</code> implementations that are satisfied with
     * producing a trusted (i.e. {@link #isAuthenticated()} = <code>true</code>)
     * authentication token.
     * @param principal
     * @param credentials
     * @param authorities
     */
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
            Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        this.credentials = credentials;
        super.setAuthenticated(true); // must use super, as we override
    }

        ...
}

Improvement codes

public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {

       ...

    /**
     * This constructor can be safely used by any code that wishes to create a
     * <code>UsernamePasswordAuthenticationToken</code>, as the {@link #isAuthenticated()}
     * will return <code>false</code>.
     *
     */
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
        super(null);
        this.principal = principal;
        this.credentials = credentials;
        setAuthenticated(false);
    }

        public UsernamePasswordAuthenticationToken unauthenticated(Object principal, Object credentials){
        return new UsernamePasswordAuthenticationToken(principal, credentials);
    }

    /**
     * This constructor should only be used by <code>AuthenticationManager</code> or
     * <code>AuthenticationProvider</code> implementations that are satisfied with
     * producing a trusted (i.e. {@link #isAuthenticated()} = <code>true</code>)
     * authentication token.
     * @param principal
     * @param credentials
     * @param authorities
     */
    public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
            Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        this.credentials = credentials;
        super.setAuthenticated(true); // must use super, as we override
    }

        public UsernamePasswordAuthenticationToken authenticated(Object principal, Object credentials,
            Collection<? extends GrantedAuthority> authorities){
        return new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
    }

        ...
}

Comment From: nor-ek

@jzheaux If you want I can take it.

Comment From: jzheaux

It's yours, @nor-ek!

Comment From: nor-ek

Pull request https://github.com/spring-projects/spring-security/pull/10901