đặt phiên - biến tùy chỉnh để lưu trữ id người dùng


10

Tôi muốn lưu trữ id người dùng trong biến phiên tùy chỉnh và sử dụng nó (đọc) trong quy trình kích hoạt để ủy quyền cho hành động của người dùng. Tôi tìm thấy một cái gì đó như thế này:

set session "myapp.user" = '12345';
...
SELECT current_setting('myapp.user');

và nó dường như hoạt động - Tôi nghĩ rằng "myapp.user" nên được khai báo trong tệp .conf nhưng dường như tôi có thể tạo các biến phiên một cách nhanh chóng (tôi hoàn toàn không thay đổi tệp .conf).

Có bất kỳ bất lợi khi làm như thế này?


2
Tôi nghĩ rằng hạn chế myapp.userphải khai báo postgresql.confđã bị xóa trong 9.2 hoặc 9.1
a_horse_with_no_name

5
Đó là một cách hợp lý để thực hiện mọi việc miễn là người dùng không được phép chạy SQL tùy ý (trong trường hợp đó họ chỉ có thể đặt ID người dùng khác). Đó là một chút giải pháp khắc phục cho việc thiếu các biến phiên thực sự của PostgreSQL nhưng tôi không nhận thấy bất kỳ vấn đề quan trọng nào với nó. BTW, vui lòng liên kết với bất kỳ câu hỏi / câu trả lời trước có liên quan mà bạn đã sử dụng làm tài liệu tham khảo .
Craig Ringer

Câu trả lời:


8

Trước phiên bản 9.2, bạn cần thêm biến lớp tùy chỉnh của mình vào custom_variable_classestham sốpostgresql.conf , như:

custom_variable_classes = 'myapp'

Trong 9.2, yêu cầu này đã được gỡ bỏ :

Xóa tham số custom_variable_groupes (Tom Lane)

Việc kiểm tra được cung cấp bởi cài đặt này là không rõ ràng. Bây giờ bất kỳ cài đặt có thể được tiền tố bởi bất kỳ tên lớp.

Vì vậy, kể từ 9.2, bạn chỉ có thể đặt biến lớp tùy chỉnh như hiện tại, không cần phải lo lắng về việc thay đổi postgresql.conf.



0

Đối với những trường hợp như thế này, tôi thích tạo một hàm plperl như thế này:

CREATE OR REPLACE FUNCTION session_store(key text,val text DEFAULT NULL)
  RETURNS text AS
$BODY$
my ($k,$v)=@_;
die "key cannot be NULL\n" unless defined $k;
if (defined $v) {
    $_SHARED{session_store}{$k}=$v;
    return undef;
}
return exists $_SHARED{session_store}{$k}?$_SHARED{session_store}{$k}:undef;
$BODY$
LANGUAGE plperl VOLATILE;

Ưu điểm của việc này là nó cũng hoạt động trong các câu lệnh sql, ví dụ:

select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.