use redirect rank permission.

This commit is contained in:
Relintai 2021-11-10 20:08:42 +01:00
parent a9b3fbdece
commit 39f90bae9e
8 changed files with 28 additions and 5 deletions

View File

@ -578,7 +578,8 @@ void RBACController::register_permissions() {
register_permission("Update", RBAC_PERMISSION_UPDATE);
register_permission("Delete", RBAC_PERMISSION_DELETE);
register_rank_permission("Admin Panel", RBAC_PERMISSION_ADMIN_PANEL);
register_rank_permission("Admin Panel", RBAC_RANK_PERMISSION_ADMIN_PANEL);
register_rank_permission("Use Redirect", RBAC_RANK_PERMISSION_USE_REDIRECT);
}
Ref<RBACRank> RBACController::get_rank(int rank_id) {
@ -593,6 +594,10 @@ Ref<RBACRank> RBACController::get_default_rank() {
return _ranks[get_default_rank_id()];
}
String &RBACController::get_redirect_url() {
return _redirect_url;
}
bool RBACController::continue_on_missing_default_rank() {
//todo, add setting
return false;

View File

@ -68,6 +68,8 @@ public:
int get_default_rank_id();
Ref<RBACRank> get_default_rank();
String &get_redirect_url();
bool continue_on_missing_default_rank();
static RBACController *get_singleton();
@ -80,6 +82,7 @@ protected:
int _default_rank_id;
std::map<int, Ref<RBACRank> > _ranks;
String _redirect_url;
struct PermissionEntry {
String name;

View File

@ -12,7 +12,8 @@ enum RBACDefaultPermissions {
};
enum RBACDefaultRankPermissions {
RBAC_PERMISSION_ADMIN_PANEL = 1 << 0,
RBAC_RANK_PERMISSION_ADMIN_PANEL = 1 << 0,
RBAC_RANK_PERMISSION_USE_REDIRECT = 1 << 1,
};
#endif

View File

@ -149,6 +149,11 @@ int RBACModel::get_default_rank() {
return 3;
}
String RBACModel::get_redirect_url() {
//todo, load this, and save it to a table (probably a new settings class)
return String("/user/login");
}
void RBACModel::create_table() {
Ref<TableBuilder> tb = DatabaseManager::get_singleton()->ddb->get_table_builder();
@ -198,7 +203,7 @@ void RBACModel::create_default_entries() {
admin->name = "Admin";
admin->base_permissions = RBAC_PERMISSION_ALL;
admin->rank_permissions = RBAC_PERMISSION_ADMIN_PANEL;
admin->rank_permissions = RBAC_RANK_PERMISSION_ADMIN_PANEL;
save_rank(admin);
@ -216,7 +221,7 @@ void RBACModel::create_default_entries() {
guest->name = "Guest";
guest->base_permissions = RBAC_PERMISSION_READ;
guest->rank_permissions = 0;
guest->rank_permissions = RBAC_RANK_PERMISSION_USE_REDIRECT;
save_rank(guest);
}

View File

@ -20,6 +20,7 @@ public:
virtual void save_rank(const Ref<RBACRank> &rank);
virtual void save_permission(const Ref<RBACPermission> &permission);
virtual int get_default_rank();
virtual String get_redirect_url();
void create_table();
void drop_table();

View File

@ -8,6 +8,10 @@ bool RBACRank::has_permission(Request *request, const int permission) {
return (base_permissions & permission) != 0;
}
bool RBACRank::has_rank_permission(const int permission) {
return (rank_permissions & permission) != 0;
}
void RBACRank::sort_permissions() {
for (int i = 0; i < permissions.size(); ++i) {
for (int j = i + 1; j < permissions.size(); ++j) {

View File

@ -26,6 +26,7 @@ public:
Vector<Ref<RBACPermission> > permissions;
bool has_permission(Request *request, const int permission);
bool has_rank_permission(const int permission);
void sort_permissions();

View File

@ -67,7 +67,10 @@ void RBACUserController::rbac_default_user_session_middleware(Object *instance,
}
if (!rank->has_permission(request, RBAC_PERMISSION_READ)) {
//todo implement redirect perm
if (rank->has_rank_permission(RBAC_RANK_PERMISSION_USE_REDIRECT)) {
request->send_redirect(RBACController::get_singleton()->get_redirect_url());
return;
}
request->send_error(404);
return;