Просмотр исходного кода

fix(authn): Add support for query by is_superuser to the mensia backend

firest 3 лет назад
Родитель
Сommit
2e3033c539

+ 8 - 0
apps/emqx_authn/i18n/emqx_authn_api_i18n.conf

@@ -225,4 +225,12 @@ emqx_authn_api {
       zh: """模糊用户名"""
     }
   }
+
+  is_superuser {
+    desc {
+      en: """Is superuser"""
+      zh: """是否是超级用户"""
+    }
+  }
+
 }

+ 13 - 1
apps/emqx_authn/src/emqx_authn_api.erl

@@ -440,6 +440,12 @@ schema("/authentication/:id/users") ->
                         in => query,
                         desc => ?DESC(like_clientid),
                         required => false
+                    })},
+                {is_superuser,
+                    mk(boolean(), #{
+                        in => query,
+                        desc => ?DESC(is_superuser),
+                        required => false
                     })}
             ],
             responses => #{
@@ -478,7 +484,13 @@ schema("/listeners/:listener_id/authentication/:id/users") ->
                 param_listener_id(),
                 param_auth_id(),
                 ref(emqx_dashboard_swagger, page),
-                ref(emqx_dashboard_swagger, limit)
+                ref(emqx_dashboard_swagger, limit),
+                {is_superuser,
+                    mk(boolean(), #{
+                        in => query,
+                        desc => ?DESC(is_superuser),
+                        required => false
+                    })}
             ],
             responses => #{
                 200 => emqx_dashboard_swagger:schema_with_example(

+ 23 - 17
apps/emqx_authn/src/simple_authn/emqx_authn_mnesia.erl

@@ -74,7 +74,8 @@
 -define(AUTHN_QSCHEMA, [
     {<<"like_username">>, binary},
     {<<"like_clientid">>, binary},
-    {<<"user_group">>, binary}
+    {<<"user_group">>, binary},
+    {<<"is_superuser">>, atom}
 ]).
 -define(QUERY_FUN, {?MODULE, query}).
 
@@ -469,21 +470,26 @@ format_user_info(#user_info{user_id = {_, UserID}, is_superuser = IsSuperuser})
     #{user_id => UserID, is_superuser => IsSuperuser}.
 
 ms_from_qstring(QString) ->
-    [Ms] = lists:foldl(
-        fun
-            ({user_group, '=:=', UserGroup}, AccIn) ->
-                [group_match_spec(UserGroup) | AccIn];
-            (_, AccIn) ->
-                AccIn
-        end,
-        [],
-        QString
-    ),
-    Ms.
+    case lists:keytake(user_group, 1, QString) of
+        {value, {user_group, '=:=', UserGroup}, QString2} ->
+            group_match_spec(UserGroup, QString2);
+        _ ->
+            []
+    end.
 
 group_match_spec(UserGroup) ->
-    ets:fun2ms(
-        fun(#user_info{user_id = {Group, _}} = User) when Group =:= UserGroup ->
-            User
-        end
-    ).
+    group_match_spec(UserGroup, []).
+
+group_match_spec(UserGroup, QString) ->
+    case lists:keyfind(is_superuser, 1, QString) of
+        false ->
+            ets:fun2ms(fun(#user_info{user_id = {Group, _}} = User) when Group =:= UserGroup ->
+                User
+            end);
+        {is_superuser, '=:=', Value} ->
+            ets:fun2ms(fun(#user_info{user_id = {Group, _}, is_superuser = IsSuper} = User) when
+                Group =:= UserGroup, IsSuper =:= Value
+            ->
+                User
+            end)
+    end.