sql >> Database >  >> RDS >> PostgreSQL

Van rol wisselen na verbinding met database

--create a user that you want to use the database as:

create role neil;

--create the user for the web server to connect as:

create role webgui noinherit login password 's3cr3t';

--let webgui set role to neil:

grant neil to webgui; --this looks backwards but is correct.

webgui bevindt zich nu in de neil groep, dus webgui kan set role neil . aanroepen . Echter, webgui heeft neil niet geërfd toestemmingen.

Later, log in als webgui:

psql -d some_database -U webgui
(enter s3cr3t as password)

set role neil;

webgui heeft geen superuser nodig toestemming hiervoor.

U wilt set role aan het begin van een databasesessie en reset deze aan het einde van de sessie. In een web-app komt dit overeen met respectievelijk het verkrijgen van een verbinding uit uw databaseverbindingspool en het vrijgeven ervan. Hier is een voorbeeld van het gebruik van Tomcat's verbindingspool en Spring Security:

public class SetRoleJdbcInterceptor extends JdbcInterceptor {

    @Override
    public void reset(ConnectionPool connectionPool, PooledConnection pooledConnection) {

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if(authentication != null) {
            try {

                /* 
                  use OWASP's ESAPI to encode the username to avoid SQL Injection. Can't use parameters with SET ROLE. Need to write PG codec.

                  Or use a whitelist-map approach
                */
                String username = ESAPI.encoder().encodeForSQL(MY_CODEC, authentication.getName());

                Statement statement = pooledConnection.getConnection().createStatement();
                statement.execute("set role \"" + username + "\"");
                statement.close();
            } catch(SQLException exp){
                throw new RuntimeException(exp);
            }
        }
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if("close".equals(method.getName())){
            Statement statement = ((Connection)proxy).createStatement();
            statement.execute("reset role");
            statement.close();
        }

        return super.invoke(proxy, method, args);
    }
}


  1. Hoe kan een LEFT OUTER JOIN meer records retourneren dan er in de linkertabel staan?

  2. PostgreSQL:export van resulterende gegevens van SQL-query naar Excel/CSV

  3. Hoe e-mail verzenden vanuit SQL Server?

  4. SQL Server-databases verplaatsen naar de cloud