user can select all structure from pg_catalog.*, but can't make a dump -s
DUMP pg_catalog

Here's simple script to dump objects' structures in pg_catalog. 

pg_dump -p 5432 -U postgres -d postgres -s --table=pg_catalog.* &gt; catalog.sql  

And the result looks like that:

CREATE TABLE pg_authid (
    rolname name NOT NULL,
    rolsuper boolean NOT NULL,
    rolinherit boolean NOT NULL,
    rolcreaterole boolean NOT NULL,
    rolcreatedb boolean NOT NULL,
    rolcanlogin boolean NOT NULL,
    rolreplication boolean NOT NULL,
    rolbypassrls boolean NOT NULL,
    rolconnlimit integer NOT NULL,
    rolpassword text,
    rolvaliduntil timestamp with time zone
);
ALTER TABLE ONLY pg_authid REPLICA IDENTITY NOTHING;
ALTER TABLE pg_authid OWNER TO postgres;


UPDATE from Vao Tsun:

From pg_dump doc: 


  pg_dump internally executes SELECT statements. If you have problems
  running pg_dump, make sure you are able to select information from the
  database using, for example, psql


From psql doc  


  By default, only user-created objects are shown; supply a pattern or
  the S modifier to include system objects. 
  
  Note: If \d is used without a pattern argument, it is equivalent to
  \dtvsE which will show a list of all visible tables, views, sequences
  and foreign tables


In terms of your case  "user without permissions". I guess the so15 table belongs to public schema. That's why so15 user can see table structure (\d+ so15). 

For example: if you login admin user and create new table on new schema, then login so15 user to test ( remember to set search_path = new_schema before doing \d+). You cannot see this new table because of permission.

Besides, you cannot dump so15 table due to pg_dump will execute SELECT and it needs permission on this table.

Solution: to dump so15 table you should grant privilege to so15 user.