Remove duplicated code

Parent method already implemented the same behavior
Use abstract class to avoid duplicated code
Covert commit c3890fa9 with unit tests

One user must be able to have several roles for a single context