Catchable Fatal Error: Argument 4 passed to UsernamePasswordToken::__construct() must be an array, null given

authentication, php, symfony

Solution

Basically, what the error message says is:

The 4th argument for `UsernamePasswordToken::__construct()` should be an array, but it's `null`. It was called in `UserAuthenticationProvider` at line 96.

If you take a look at that code, you'll see that the 4th argument for `UsernamePasswordToken::__construct()` is `$roles`. So that should be an array, but it's getting `null` instead.

I'm guessing that you have written your own User entity, and that the `getRoles()` method of your user entity is returning `null` instead of an array of roles. So just change that method to something like this:

/**
 * Returns the roles granted to the user.
 * 
 * @return Role[] The user roles
 */
public function getRoles()
{
    return array('ROLE_USER');
}

Of course, the actual code may differ (you might want to store the user roles in the database), as long as `getRoles()` returns an array of strings or Role objects.

Problem

I am getting the following error when logging in into my Symfony application (with correct username and password): ContextErrorException: Catchable Fatal Error: Argument 4 passed to Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() must be an array, null given, called in D:\xampp\htdocs\essweb\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider.php on line 96 and defined in D:\xampp\htdocs\essweb\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken.php line 36 Security.yml ``` firewalls: admin_area: pattern: ^/ anonymous: ~ form_login: login_path: / check_path: /login_check default_target_path: /user failure_path: / #username_parameter: username #password_parameter: password remember_me: true remember_me: key: "%secret%" lifetime: 31536000 path: / domain: ~ always_remember_me: true logout: path: /logout target: / ``` Updated: Login form: ``` <form class="form-signin form-group" action="{{ path('login_check') }}" method="post"> Username: <input type="text" class="form-control" name="_username" placeholder="Username" value="{{ last_username }}" required="required"> Password: <input type="text" class="form-control" name="_password" placeholder="" value="{{ last_username }}" required="required"> <button class="btn btn-sm btn-primary btn-block" type="submit">Sign in</button> ```

Original source