নতুন ব্যবহারকারীর টেবিল তৈরি করার অনুমতি কেন?


41

আমি ভাবছি যে একজন নতুন তৈরি হওয়া ব্যবহারকারীকে একটি ডাটাবেসে সংযোগ করার পরে একটি টেবিল তৈরি করার অনুমতি দেওয়া হচ্ছে কেন? আমার একটি ডাটাবেস রয়েছে project2_core:

postgres=# \l
                                          List of databases
     Name      |    Owner     | Encoding  |   Collate   |    Ctype    |       Access privileges       
---------------+--------------+-----------+-------------+-------------+-------------------------------
 postgres      | postgres     | SQL_ASCII | C           | C           | 
 project2_core | atm_project2 | UTF8      | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
 template0     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
               |              |           |             |             | postgres=CTc/postgres
 template1     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
               |              |           |             |             | postgres=CTc/postgres
(5 rows)

এ পর্যন্ত সব ঠিকই. এখন আমি একটি ব্যবহারকারী তৈরি:

postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER

ঠিক আছে. আমি যখন ডাটাবেসের সাথে সংযোগ স্থাপন করার চেষ্টা করি তখন ব্যবহারকারীকে এটি করার অনুমতি দেওয়া হয় না:

$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich: 
psql: FATAL:  permission denied for database "project2_core"
DETAIL:  User does not have CONNECT privilege.

এটাই আমার প্রত্যাশা ছিল। এখন অদ্ভুত জিনিস শুরু। আমি ব্যবহারকারীকে প্রদান করি CONNECT:

postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
GRANT
postgres=# \l
                                          List of databases
     Name      |    Owner     | Encoding  |   Collate   |    Ctype    |       Access privileges       
---------------+--------------+-----------+-------------+-------------+-------------------------------
 postgres      | postgres     | SQL_ASCII | C           | C           | 
 project2_core | atm_project2 | UTF8      | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
               |              |           |             |             | dietrich=c/project2
 template0     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
               |              |           |             |             | postgres=CTc/postgres
 template1     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
               |              |           |             |             | postgres=CTc/postgres
(5 rows)

এবং আরও অনুদান ব্যতীত ব্যবহারকারীকে একটি সারণী তৈরি করার অনুমতি দেওয়া হয়েছে:

$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich: 
psql (9.2.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

project2_core=> create table adsf ();
CREATE TABLE
project2_core=> \d
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | adsf | table | dietrich
(1 row)

আমি প্রত্যাশা করতাম যে আমি স্পষ্টভাবে GRANT USAGEস্কিমা এবং তারপরে GRANT SELECTটেবিলগুলিতে করার আগে ব্যবহারকারীর কিছু করার অনুমতি নেই ।

আমার ভুল কোথায়? আমি কি ভুল করছি? আমি কীভাবে চাই তা অর্জন করতে পারি (যে কোনও নতুন ব্যবহারকারীকে সুস্পষ্টভাবে তার যথাযথ অধিকার দেওয়ার আগে কোনও কিছু করার অনুমতি দেওয়া হয় না)।

আমি হারিয়েছি, এবং আপনার সাহায্যের প্রশংসা করা হয়েছে :)

সম্পাদনা করুন @ ড্যানিয়েল-ভেরাইটের পরামর্শ অনুসরণ করে, আমি এখন ডেটাবেস তৈরি করার সাথে সাথেই সমস্ত প্রত্যাহার করি। ব্যবহারকারীর ডায়েটারিচকে আর কোনও টেবিল তৈরি করার অনুমতি নেই। ভাল. বাট : এখন, ডাটাবেসের মালিক, প্রকল্প 2 , একটি সারণী তৈরি করার অনুমতি নেই। এমনকি দেয়ার পর GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2এবং GRANT ALL PRIVILEGES ON SCHEMA public TO project2, আমি কোনো ত্রুটির সম্মুখীন হয়েছেন ত্রুটি: কোন স্কিমা তৈরি করার জন্য নির্বাচন করা হয়েছে , এবং যখন আমি বিশেষভাবে চেষ্টা CREATE TABLE public.WHATEVER ();, আমি পেতে ত্রুটি: অনুমতি স্কিমা প্রকাশ্য জন্য অস্বীকৃত । আমি কি ভুল করছি?

উত্তর:


38

আপনি যখন একটি নতুন ডাটাবেস তৈরি করেন, কোনও ভূমিকাকে publicস্কিমাতে অবজেক্ট তৈরি করার অনুমতি দেওয়া হয় । এই সম্ভাবনাটি সরাতে আপনি ডাটাবেস তৈরির সাথে সাথেই ইস্যু করতে পারেন:

REVOKE ALL ON schema public FROM public;

সম্পাদনা করুন: উপরের কমান্ডের পরে, কেবলমাত্র একটি সুপারভাইজার publicস্কিমার ভিতরে নতুন অবজেক্ট তৈরি করতে পারে যা ব্যবহারিক নয়। অনুমান করা যায় যে কোনও অ-সুপারইউজারকে foo_userএই সুযোগ দেওয়া উচিত, এটি করা উচিত:

GRANT ALL ON schema public TO foo_user;

ALLস্কিমাটির অর্থ কী তা জানতে, আমাদের অবশ্যই ডকটিতে গ্রান্টকে উল্লেখ করতে হবে , (পিজি 9.2 তে গ্রান্টের স্টেটমেন্টের 14 টিরও কম ফর্ম নেই যা বিভিন্ন বিষয়ে প্রয়োগ হয় ...) এটি প্রদর্শিত হয় যে স্কিমার জন্য এটির অর্থ CREATEএবং USAGE

অন্যদিকে, GRANT ALL PRIVILEGES ON DATABASE...মঞ্জুরি দেয় CONNECTএবং CREATEএবং TEMPতবে CREATEএই প্রসঙ্গে স্কিমার সাথে সম্পর্কিত, স্থায়ী সারণী নয়।

এই ত্রুটিটি সম্পর্কে ERROR: no schema has been selected to create in:, স্কিমার যোগ্যতা ছাড়াই কোনও বস্তু তৈরি করার চেষ্টা করার সময় এটি ঘটে (যেমন হিসাবে create table foo(...)) এটি কোনও স্কিমায় এটি তৈরি করার অনুমতি অভাবের সময় search_path


কাজ করে :) তবে আমি এখনও বুঝতে পারি না: আমি ইতিমধ্যে চেষ্টা করেছি REVOKE ALL ON DATABASE project2_core FROM PUBLIC;। এর কোনও প্রভাব পড়ল না কেন?
andreas-h

mhh। এখন ডাটাবেসের মালিকের আর অনুমতি নেই CREATE TABLE। উপরে আমার সম্পাদনা দেখুন।
andreas-h

@ অ্যান্ড্রেস-এইচ: আরও বিশদ সহ উত্তরটি সম্পাদনা করেছেন
ড্যানিয়েল ভ্যারিট

ত্রুটি সংক্রান্ত, এটি সহজে অনুক্রমে :) প্রশ্নটি থেকে কমান্ড এবং আপনার প্রত্যাহার জারি করে পুনরুত্পাদন করা যাবে
dezso

@ ড্যানিয়েলভিটিé আমি আপনার পরিপূরক সম্পর্কিত একটি নতুন উত্তরে এর পিছনে ধারণাগুলি বিস্তারিতভাবে বর্ণনা করেছি। একটি স্যানিটি চেক মূল্যবান হবে।
ক্রেগ রিঞ্জার

19

এখানে বোঝার জন্য গুরুত্বপূর্ণ বিষয়টি হ'ল বিশেষাধিকারগুলি উত্তরাধিকারসূত্রে নয় এবং বস্তুগুলি ধারণ করে উত্তরাধিকার সূত্রে প্রাপ্ত হয় নাALLএর অর্থ এই অবজেক্টের জন্য সমস্ত সুযোগসুবিধা হ'ল এই অবজেক্টের জন্য সমস্ত সুযোগ-সুবিধা নয় এবং সমস্ত উপাদান রয়েছে

আপনি যখন ALLএকটি ডাটাবেসে মঞ্জুরি দেয়, আপনি মঞ্জুরি দিচ্ছেন CREATE, CONNECT, TEMP। এটি ডাটাবেসের ক্রিয়া যা তার স্বকে আপত্তি করে:

  • CONNECT: ডিবিতে সংযোগ দিন
  • CREATE: একটি তৈরি করুন স্কিমা ( না একটি টেবিল)
  • TEMP: অস্থায়ী বস্তুগুলি তৈরি করুন, এতে টেম্প টেবিলগুলি সহ সীমাবদ্ধ নয়

এখন, প্রতিটি PostgreSQL ডাটাবেস ডিফল্টরূপে একটি publicস্কিমা থাকে যা ডাটাবেস তৈরি হওয়ার সময় তৈরি হয়। এই স্কিমাটির ভূমিকার সমস্ত অধিকার রয়েছে public, যার মধ্যে প্রত্যেকেই প্রত্যক্ষভাবে সদস্য। স্কিমার জন্য, এর ALLঅর্থ CREATE, USAGE:

  • CREATE: এই স্কিমাটির মধ্যে অবজেক্ট (টেবিল সহ) তৈরি করুন
  • USAGE: স্কিমা অবজেক্টগুলিকে তালিকাবদ্ধ করুন এবং যদি তাদের অনুমতি অনুমতি দেয় তবে তাদের অ্যাক্সেস করুন

আপনি যদি টেবিলের মতো কোনও বস্তু তৈরি করতে স্কিমাটি নির্দিষ্ট না করেন তবে ডাটাবেস ইঞ্জিনটি ব্যবহার করে search_pathএবং ডিফল্টরূপে publicস্কিমাটি প্রথমে search_pathতাই টেবিলটি সেখানে তৈরি হয়। প্রত্যেকেরই publicডিফল্টরূপে অধিকার থাকে , তাই তৈরির অনুমতি রয়েছে। ডাটাবেসে ব্যবহারকারীর অধিকারগুলি এই মুহূর্তে অপ্রাসঙ্গিক, কারণ ব্যবহারকারী ডাটাবেসটিতে কিছু করার চেষ্টা করছে না এটি তার নিজস্ব, কেবল এটির মধ্যে একটি স্কিমা object

এটি কোনও বিষয় নয় যে আপনি ব্যবহারকারীকে CONNECTডেটাবেজে প্রদত্ত হওয়া ছাড়া অন্য কোনও অধিকার মঞ্জুর করেননি , কারণ publicস্কিমা সমস্ত ব্যবহারকারীকে ডিফল্টরূপে এতে সারণী তৈরি করার অনুমতি দেয়। ড্যানিয়েল ইতিমধ্যে ব্যাখ্যা করেছেন কীভাবে যদি এই অধিকারটি প্রত্যাহার করতে হয়।

আপনি যদি প্রতিটি অধিকার স্পষ্টভাবে পেশ করতে চান তবে সর্বসাধারণের কাছ থেকে প্রত্যাহার করুন বা সরকারীভাবে স্কিমাকে বাদ দিন। আপনি চাইলে এই পরিবর্তনটি প্রয়োগ করে একটি নতুন টেম্পলেট ডাটাবেস তৈরি করতে পারেন। পর্যায়ক্রমে আপনি এটি প্রয়োগ করতে পারেন template1, তবে এটি সম্ভবত প্রচুর 3 য় পক্ষের কোডটি ভঙ্গ করবে যা অনুমান করে যে এটি publicবিদ্যমান এবং লিখিতযোগ্য।


আপনি যদি কোনও ফাইল সিস্টেমের সাদৃশ্যটি দেখেন তবে এটি আরও অর্থবহ হতে পারে।

যদি আমার কাছে ডিরেক্টরি কাঠামো থাকে (কেবলমাত্র বর্তমান ব্যবহারকারীর জন্য প্রযোজ্য মোডটি দেখানোর জন্য মোড সরলীকৃত):

/dir1           mode=r-x
/dir1/dir2      mode=rwx

তবে আমি এর মধ্যে কিছু তৈরি করতে /dir1পারি না, কারণ আমার লেখার অনুমতি নেই। সুতরাং আমি যদি touch /dir1/somefileঅনুমতি পাই তবে ত্রুটি অস্বীকার করা হবে।

যাইহোক, আমি কি করতে ভিতরে চেহারা করার অনুমতি নেই /dir1এবং অ্যাক্সেস করতে অন্তর্ভুক্ত ফাইল ও ডিরেক্টরিগুলি সহ /dir1/dir2। আমার লেখার অনুমতি আছে dir2। সুতরাং সফলtouch /dir1/dir2/somefile হবে , যদিও আমার কাছে লেখার অনুমতি নেই ।dir1

ডাটাবেস এবং স্কিমার সাথে একই জিনিস।


7

আপনি যদি কেবল নতুন ব্যবহারকারীদের টেবিল তৈরি করা থেকে বিরত রাখতে চান তবে আপনাকে নিম্নলিখিত কমান্ডটি চালনা করতে হবে:

REVOKE CREATE ON SCHEMA public FROM public;

যদি আপনি REVOKE ALL(অন্যান্য উত্তর হিসাবে পরামর্শ দেয়), আপনি ব্যবহারকারীদের USAGEঅনুমতি থেকে আটকাতে হবে । USAGEএর অর্থ হ'ল ব্যবহারকারীরা তাদেরকে নির্ধারিত অনুমতিগুলি ব্যবহার করতে পারেন, তাই আপনি যদি এটি সরিয়ে থাকেন তবে আপনার ব্যবহারকারীরা যে অ্যাক্সেস রয়েছে সেগুলি সারণী তালিকা বা অ্যাক্সেস করতে পারবেন না।

বিকল্পভাবে, আপনি REVOKE CREATEএকটি নির্দিষ্ট ব্যবহারকারীর জন্যও করতে পারেন :

REVOKE CREATE ON schema public FROM myuser;

আরও দেখুন: পোস্টগ্র্রেএসকিউএল সহ কেবল একটি পঠন ব্যবহারকারী কীভাবে তৈরি করবেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.