I've been doing this for years before laravel existed. I know and realize it comes with out-of-the-box authentication and authorization, however you would not believe how much easier it is just to protect each method the way you see fit.
I do use out of the box Authentication however I protect each method independently verifying a required role for a method matches the logged in user role.
Use Query Scopes to fine-tune who can do what, in other words an admin might be able to see all, but a user can only see their data.
And try not to use the user ID in a query string, instead use the authorized users ID.
Just a few thoughts on this.
So in pseudocode:
public function makeInvoice()
{
if (a required role of bkeep is not true here) { // bkeep = bookkeeper
return redirect('somewhere'); // whereever you redirect to
}
// Rest of method here is accomplished if
// the logged in user has the required role of 'bkeep'.
}
Edit: and yes there are users with multiple roles, but I only care about one role at a time.