Just a suggestion, many times I find it easier to protect the actual method and use the authorized users id.
This is just an example:
public function update(Request $request, Post $post) {
if ($post->author !== auth()->user()->id || auth()->user()->cannot('edit posts'))
abort(404);// or redirect, or whatever action
}
//rest of method if all okay
}
Just it seems like you can fine-tune so much more in a controller verses a route for certain situations.