PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przełącz rolę po połączeniu z bazą danych

--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 jest teraz w neil grupy, więc webgui może wywołać set role neil . Jednak webgui nie odziedziczył neil uprawnienia.

Później zaloguj się jako webgui:

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

set role neil;

webgui nie wymaga superuser pozwolenie na to.

Chcesz set role na początku sesji bazy danych i zresetuj ją pod koniec sesji. W aplikacji internetowej odpowiada to odpowiednio uzyskaniu połączenia z puli połączeń bazy danych i zwolnieniu go. Oto przykład wykorzystania puli połączeń Tomcat i 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Humanizowane lub naturalne sortowanie mieszanych ciągów słów i liczb

  2. Jak włączyć pracę php z postgresql?

  3. rake db:create baza wyrzutów nie istnieje błąd z postgresql

  4. Porównaj tablice pod kątem równości, ignorując kolejność elementów

  5. psycopg2.OperationalError:FATAL:nieobsługiwany protokół frontendu 1234.5679:serwer obsługuje 2.0 do 3.0