The system you're designing now is called a 'multi tenant system', I suggest reading a bit about it.
I would never design such a system with different tables for each of the tenants (apps), just think about all of the tables being dynamicly created and destroyed when you add / remove apps (which should only be a matter of adding a few rows to some tables in the DB).
The way you have it right now is the right way, but most of the multi tenant systems I know dont have different "types" of admins for instance, so I would not design it with an App1Admin role and an App2Admin role if possible.
I'm just guessing there might also be a need for 1 person having roles in multiple apps.
// Roles:
id | name
---- | -------------
1 | Admin
2 | Moderator
3 | Editor
// role_users
app_id | role_id | user_id
--------- | -------- | ----------
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
3 | 2 | 5
1 | 2 | 8
User 1 is an Admin in all 3 Apps, App 1 and 3 have different Moderators.
Then in the roles() method on the User model you can add a check to see in which app you are currently and add the wherePivot() to select only the roles for the current app.