Olá Victor, tudo bem?
A ideia de ter essas três tabelas "roles_permissions", "user_permissions" e "user_roles" é para proporcionar uma maior flexibilidade na hora de definir as permissões dos usuários.
Vamos usar um exemplo prático para esclarecer isso. Imagine que temos um sistema com muitos usuários e muitos cargos diferentes, como "Editor", "Editor Funcional", "Administrador", etc. Cada um desses cargos pode ter permissões diferentes, por exemplo, um "Editor" pode ter permissão para editar e criar novos posts, enquanto um "Editor Funcional" pode apenas editar posts existentes.
A tabela "roles_permissions" serve para definir essas permissões para cada cargo. Assim, quando um novo usuário é criado e é atribuído um cargo a ele, automaticamente ele herda todas as permissões desse cargo.
Agora, imagine que temos um usuário específico que é um "Editor", mas por algum motivo, ele precisa ter a permissão de deletar posts, que normalmente é uma permissão de um "Administrador". Em vez de criar um novo cargo só para esse usuário, podemos simplesmente adicionar essa permissão diretamente a ele na tabela "user_permissions".
Então, a tabela "user_roles" é usada para atribuir um cargo a um usuário, a tabela "roles_permissions" é usada para atribuir permissões a um cargo e a tabela "user_permissions" é usada para atribuir permissões diretamente a um usuário.
Espero que isso esclareça sua dúvida. A ideia é que essa estrutura permita uma maior flexibilidade na hora de definir as permissões, permitindo que você possa ter permissões específicas para cada usuário, se necessário, além das permissões que são herdadas através do seu cargo.
Abraços e bons estudos!