@@ -200,4 +200,130 @@ sub test_conn
200200
201201test_conn($node , ' user=md5_role' , ' password from pgpass' , 0);
202202
203+ unlink ($pgpassfile );
204+ delete $ENV {" PGPASSFILE" };
205+
206+ note " Authentication tests with specific HBA policies on roles" ;
207+
208+ # Create database and roles for membership tests
209+ reset_pg_hba($node , ' all' , ' all' , ' trust' );
210+ # Database and root role names match for "samerole" and "samegroup".
211+ $node -> safe_psql(' postgres' , " CREATE DATABASE regress_regression_group;" );
212+ $node -> safe_psql(
213+ ' postgres' ,
214+ qq{ CREATE ROLE regress_regression_group LOGIN PASSWORD 'pass';
215+ CREATE ROLE regress_member LOGIN SUPERUSER IN ROLE regress_regression_group PASSWORD 'pass';
216+ CREATE ROLE regress_not_member LOGIN SUPERUSER PASSWORD 'pass';} );
217+
218+ # Test role with exact matching, no members allowed.
219+ $ENV {" PGPASSWORD" } = ' pass' ;
220+ reset_pg_hba($node , ' all' , ' regress_regression_group' , ' scram-sha-256' );
221+ test_conn(
222+ $node ,
223+ ' user=regress_regression_group' ,
224+ ' scram-sha-256' ,
225+ 0,
226+ log_like => [
227+ qr / connection authenticated: identity="regress_regression_group" method=scram-sha-256/
228+ ]);
229+ test_conn(
230+ $node ,
231+ ' user=regress_member' ,
232+ ' scram-sha-256' ,
233+ 2,
234+ log_unlike => [
235+ qr / connection authenticated: identity="regress_member" method=scram-sha-256/
236+ ]);
237+ test_conn(
238+ $node ,
239+ ' user=regress_not_member' ,
240+ ' scram-sha-256' ,
241+ 2,
242+ log_unlike => [
243+ qr / connection authenticated: identity="regress_not_member" method=scram-sha-256/
244+ ]);
245+
246+ # Test role membership with '+', where all the members are allowed
247+ # to connect.
248+ reset_pg_hba($node , ' all' , ' +regress_regression_group' , ' scram-sha-256' );
249+ test_conn(
250+ $node ,
251+ ' user=regress_regression_group' ,
252+ ' scram-sha-256' ,
253+ 0,
254+ log_like => [
255+ qr / connection authenticated: identity="regress_regression_group" method=scram-sha-256/
256+ ]);
257+ test_conn(
258+ $node ,
259+ ' user=regress_member' ,
260+ ' scram-sha-256' ,
261+ 0,
262+ log_like => [
263+ qr / connection authenticated: identity="regress_member" method=scram-sha-256/
264+ ]);
265+ test_conn(
266+ $node ,
267+ ' user=regress_not_member' ,
268+ ' scram-sha-256' ,
269+ 2,
270+ log_unlike => [
271+ qr / connection authenticated: identity="regress_not_member" method=scram-sha-256/
272+ ]);
273+
274+ # Test role membership is respected for samerole
275+ $ENV {" PGDATABASE" } = ' regress_regression_group' ;
276+ reset_pg_hba($node , ' samerole' , ' all' , ' scram-sha-256' );
277+ test_conn(
278+ $node ,
279+ ' user=regress_regression_group' ,
280+ ' scram-sha-256' ,
281+ 0,
282+ log_like => [
283+ qr / connection authenticated: identity="regress_regression_group" method=scram-sha-256/
284+ ]);
285+ test_conn(
286+ $node ,
287+ ' user=regress_member' ,
288+ ' scram-sha-256' ,
289+ 0,
290+ log_like => [
291+ qr / connection authenticated: identity="regress_member" method=scram-sha-256/
292+ ]);
293+ test_conn(
294+ $node ,
295+ ' user=regress_not_member' ,
296+ ' scram-sha-256' ,
297+ 2,
298+ log_unlike => [
299+ qr / connection authenticated: identity="regress_not_member" method=scram-sha-256/
300+ ]);
301+
302+ # Test role membership is respected for samegroup
303+ reset_pg_hba($node , ' samegroup' , ' all' , ' scram-sha-256' );
304+ test_conn(
305+ $node ,
306+ ' user=regress_regression_group' ,
307+ ' scram-sha-256' ,
308+ 0,
309+ log_like => [
310+ qr / connection authenticated: identity="regress_regression_group" method=scram-sha-256/
311+ ]);
312+ test_conn(
313+ $node ,
314+ ' user=regress_member' ,
315+ ' scram-sha-256' ,
316+ 0,
317+ log_like => [
318+ qr / connection authenticated: identity="regress_member" method=scram-sha-256/
319+ ]);
320+ test_conn(
321+ $node ,
322+ ' user=regress_not_member' ,
323+ ' scram-sha-256' ,
324+ 2,
325+ log_unlike => [
326+ qr / connection authenticated: identity="regress_not_member" method=scram-sha-256/
327+ ]);
328+
203329done_testing();
0 commit comments