Is there a way to prevent "reset role" in PostgreSQL
1
RESET ROLE would just "return" you back to the role you used to login. here
also SET ROLE rolename 


  must be a role that the current session user is a member of


so " gaining permission he may not have" is not the case.

2
pgbouncer indeed will require such mapping.

3 to "reuse connections but have different authorization for different user upon connection." you can use set authorization which is very similar to SET ROLE. 

There is no session pooler that would do it for you I believe...