PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Beralih peran setelah terhubung ke 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 sekarang di neil grup, jadi webgui dapat memanggil set role neil . Namun, webgui tidak mewarisi neil izin.

Kemudian, login sebagai webgui:

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

set role neil;

webgui tidak perlu superuser izin untuk ini.

Anda ingin set role di awal sesi database dan reset di akhir sesi. Di aplikasi web, ini terkait dengan mendapatkan koneksi dari kumpulan koneksi database Anda dan melepaskannya, masing-masing. Berikut ini contoh penggunaan kumpulan koneksi Tomcat dan Keamanan Pegas:

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. Mengapa kueri tidak dapat disimpan dalam file csv saat tampaknya normal di konsol postgresql

  2. Masukkan jika tidak ada, jika tidak kembalikan id di postgresql

  3. Apakah pesanan dalam subquery dijamin untuk dipertahankan?

  4. Biaya publisitas PostgreSQL gratis

  5. Memutakhirkan ke PostgreSQL 11 dengan Replikasi Logis