PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chuyển đổi vai trò sau khi kết nối với cơ sở dữ liệu

--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 hiện có trong neil nhóm, vì vậy webgui có thể gọi set role neil . Tuy nhiên, webgui không kế thừa neil quyền của.

Sau đó, đăng nhập bằng webgui:

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

set role neil;

webgui không cần superuser cho phép điều này.

Bạn muốn set role vào đầu phiên cơ sở dữ liệu và đặt lại nó vào cuối phiên. Trong một ứng dụng web, điều này tương ứng với việc nhận được kết nối từ nhóm kết nối cơ sở dữ liệu của bạn và giải phóng nó, tương ứng. Đây là một ví dụ sử dụng nhóm kết nối của Tomcat và 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. lưu đối tượng python trong bảng postgres với dưa chua

  2. Trả về các hàng SETOF từ hàm PostgreSQL

  3. Cách cài đặt PostgreSQL 12 trên Ubuntu 20.04 / 18.04 / 16.04

  4. Biên dịch phần mở rộng pg_repack trên định dạng nhị phân của cài đặt PostgreSQL

  5. Cơ sở dữ liệu mặc định có tên là postgres trên máy chủ Postgresql