The middleware blocks the actual action, but for a proper user experience there should still be an indication when an action isn't allowed, instead of just blindly redirecting somewhere.
Under normal circumstances, just hiding the buttons, links, URLs etc based on permission works, but that's not 100% fool proof. For example, bookmarks are still a thing and still used by many people, and if somebody has a specific page bookmarked and their permissions are changed later, clicking that bookmark and going to a page they aren't expecting is bad UX.
The same thing goes for hiding/showing buttons based on the users permissions. If when they load the page, their permissions are elevated and an administrator just so happens to change their permissions before they take an action, the button/URL is still visible, but when they click it they are currently blindly redirected. That again is bad UX.
The proper way to handle it would be to create a 403 exception and pass it as a response , as well as display an access denied error/page. I guess I will have to look at how to create custom exceptions and to pass those exceptions when a user fails permissions/roles checks.