In my experience, the business logic of access control changes with the addition of new features, so it pays for the flexibility and portability of the design in your access control system. Thus, I would develop Authentication and RBAC as separate features, and then incorporate these features into the controller space as needed.
As already mentioned, it looks like the authentication tag is best included in your front controller: you know that all dependent controllers require authentication, so enable this check at the beginning of the life cycle to free socket requests. If your requirements ever change to require some controllers that can be disabled, you can translate the trait to specific controllers or to the base class of the controller.
As for RBAC, which can be applied globally to all controllers, as well as locally to some controllers. For example, your FrontController may request RBAC to build a routing table, while dependent controllers will use RBAC for their specific needs.
One thing to keep in mind though: you may also have some RBAC model needs. That is, some roles may have limited access to some fields in some models: role A can access the entire model X, but only fields 1, 2 and 3 of model X can read role B. (Believe me, I saw very, very complex rules around roles that can see and act in which fields.)
RBAC engineering as a feature of the controller can make it difficult to transfer the simulation to model space. Thus, you might be better off designing RBAC as a service delegate and introducing it on demand. With a well-prepared IoC container, a service delegate is as simple as compiling time.
Finally, I will add that you want both of them to be under severe ordeal (in the end, they are important). So, whatever you choose, engineer so that they can be tested. In my opinion, both features and delegates are easily tested in isolation, and this will be a good choice for implementing the necessary logic.