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

feat(authn): authn users page query

JimMoen 4 лет назад
Родитель
Сommit
0bd5cd9336

+ 6 - 7
apps/emqx/src/emqx_authentication.erl

@@ -59,7 +59,7 @@
         , delete_user/3
         , delete_user/3
         , update_user/4
         , update_user/4
         , lookup_user/3
         , lookup_user/3
-        , list_users/2
+        , list_users/3
         ]).
         ]).
 
 
 %% gen_server callbacks
 %% gen_server callbacks
@@ -378,10 +378,9 @@ update_user(ChainName, AuthenticatorID, UserID, NewUserInfo) ->
 lookup_user(ChainName, AuthenticatorID, UserID) ->
 lookup_user(ChainName, AuthenticatorID, UserID) ->
     call({lookup_user, ChainName, AuthenticatorID, UserID}).
     call({lookup_user, ChainName, AuthenticatorID, UserID}).
 
 
-%% TODO: Support pagination
--spec list_users(chain_name(), authenticator_id()) -> {ok, [user_info()]} | {error, term()}.
-list_users(ChainName, AuthenticatorID) ->
-    call({list_users, ChainName, AuthenticatorID}).
+-spec list_users(chain_name(), authenticator_id(), map()) -> {ok, [user_info()]} | {error, term()}.
+list_users(ChainName, AuthenticatorID, Params) ->
+    call({list_users, ChainName, AuthenticatorID, Params}).
 
 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 %% gen_server callbacks
 %% gen_server callbacks
@@ -540,8 +539,8 @@ handle_call({lookup_user, ChainName, AuthenticatorID, UserID}, _From, State) ->
     Reply = call_authenticator(ChainName, AuthenticatorID, lookup_user, [UserID]),
     Reply = call_authenticator(ChainName, AuthenticatorID, lookup_user, [UserID]),
     reply(Reply, State);
     reply(Reply, State);
 
 
-handle_call({list_users, ChainName, AuthenticatorID}, _From, State) ->
-    Reply = call_authenticator(ChainName, AuthenticatorID, list_users, []),
+handle_call({list_users, ChainName, AuthenticatorID, PageParams}, _From, State) ->
+    Reply = call_authenticator(ChainName, AuthenticatorID, list_users, [PageParams]),
     reply(Reply, State);
     reply(Reply, State);
 
 
 handle_call(Req, _From, State) ->
 handle_call(Req, _From, State) ->

+ 25 - 6
apps/emqx_authn/src/emqx_authn_api.erl

@@ -836,6 +836,24 @@ list_users_api_spec() ->
                     type => string
                     type => string
                 },
                 },
                 required => true
                 required => true
+            },
+            #{
+                name => page,
+                in => query,
+                description => <<"Page Index">>,
+                schema => #{
+                    type => integer
+                },
+                required => false
+            },
+            #{
+                name => limit,
+                in => query,
+                description => <<"Page limit">>,
+                schema => #{
+                    type => integer
+                },
+                required => false
             }
             }
         ],
         ],
         responses => #{
         responses => #{
@@ -1796,8 +1814,8 @@ import_users2(post, #{bindings := #{listener_id := _, id := _}, body := _}) ->
 
 
 users(post, #{bindings := #{id := AuthenticatorID}, body := UserInfo}) ->
 users(post, #{bindings := #{id := AuthenticatorID}, body := UserInfo}) ->
     add_user(?GLOBAL, AuthenticatorID, UserInfo);
     add_user(?GLOBAL, AuthenticatorID, UserInfo);
-users(get, #{bindings := #{id := AuthenticatorID}}) ->
-    list_users(?GLOBAL, AuthenticatorID).
+users(get, #{bindings := #{id := AuthenticatorID}, query_string := PageParams}) ->
+    list_users(?GLOBAL, AuthenticatorID, PageParams).
 
 
 users2(put, #{bindings := #{id := AuthenticatorID,
 users2(put, #{bindings := #{id := AuthenticatorID,
                             user_id := UserID}, body := UserInfo}) ->
                             user_id := UserID}, body := UserInfo}) ->
@@ -1811,8 +1829,9 @@ users3(post, #{bindings := #{listener_id := ListenerID,
                              id := AuthenticatorID}, body := UserInfo}) ->
                              id := AuthenticatorID}, body := UserInfo}) ->
     add_user(ListenerID, AuthenticatorID, UserInfo);
     add_user(ListenerID, AuthenticatorID, UserInfo);
 users3(get, #{bindings := #{listener_id := ListenerID,
 users3(get, #{bindings := #{listener_id := ListenerID,
-                            id := AuthenticatorID}}) ->
-    list_users(ListenerID, AuthenticatorID).
+                            id := AuthenticatorID},
+              query_string := PageParams}) ->
+    list_users(ListenerID, AuthenticatorID, PageParams).
 
 
 users4(put, #{bindings := #{listener_id := ListenerID,
 users4(put, #{bindings := #{listener_id := ListenerID,
                             id := AuthenticatorID,
                             id := AuthenticatorID,
@@ -1946,9 +1965,9 @@ delete_user(ChainName0, AuthenticatorID, UserID) ->
             serialize_error(Reason)
             serialize_error(Reason)
     end.
     end.
 
 
-list_users(ChainName0, AuthenticatorID) ->
+list_users(ChainName0, AuthenticatorID, PageParams) ->
     ChainName = to_atom(ChainName0),
     ChainName = to_atom(ChainName0),
-    case ?AUTHN:list_users(ChainName, AuthenticatorID) of
+    case ?AUTHN:list_users(ChainName, AuthenticatorID, PageParams) of
         {ok, Users} ->
         {ok, Users} ->
             {200, Users};
             {200, Users};
         {error, Reason} ->
         {error, Reason} ->

+ 6 - 6
apps/emqx_authn/src/simple_authn/emqx_authn_mnesia.erl

@@ -39,7 +39,7 @@
         , delete_user/2
         , delete_user/2
         , update_user/3
         , update_user/3
         , lookup_user/2
         , lookup_user/2
-        , list_users/1
+        , list_users/2
         ]).
         ]).
 
 
 -type user_id_type() :: clientid | username.
 -type user_id_type() :: clientid | username.
@@ -237,14 +237,14 @@ update_user(UserID, UserInfo,
 lookup_user(UserID, #{user_group := UserGroup}) ->
 lookup_user(UserID, #{user_group := UserGroup}) ->
     case mnesia:dirty_read(?TAB, {UserGroup, UserID}) of
     case mnesia:dirty_read(?TAB, {UserGroup, UserID}) of
         [UserInfo] ->
         [UserInfo] ->
-            {ok, serialize_user_info(UserInfo)};
+            {ok, format_user_info(UserInfo)};
         [] ->
         [] ->
             {error, not_found}
             {error, not_found}
     end.
     end.
 
 
-list_users(#{user_group := UserGroup}) ->
-    Users = [serialize_user_info(UserInfo) || #user_info{user_id = {UserGroup0, _}} = UserInfo <- ets:tab2list(?TAB), UserGroup0 =:= UserGroup],
-    {ok, Users}.
+list_users(PageParams, #{user_group := UserGroup}) ->
+    MatchSpec = [{{user_info, {UserGroup, '_'}, '_', '_', '_'}, [], ['$_']}],
+    {ok, emqx_mgmt_api:paginate(?TAB, MatchSpec, PageParams, fun format_user_info/1)}.
 
 
 %%------------------------------------------------------------------------------
 %%------------------------------------------------------------------------------
 %% Internal functions
 %% Internal functions
@@ -396,5 +396,5 @@ to_binary(B) when is_binary(B) ->
 to_binary(L) when is_list(L) ->
 to_binary(L) when is_list(L) ->
     iolist_to_binary(L).
     iolist_to_binary(L).
 
 
-serialize_user_info(#user_info{user_id = {_, UserID}, is_superuser = IsSuperuser}) ->
+format_user_info(#user_info{user_id = {_, UserID}, is_superuser = IsSuperuser}) ->
     #{user_id => UserID, is_superuser => IsSuperuser}.
     #{user_id => UserID, is_superuser => IsSuperuser}.