Security Access

Tạo nhóm bảo mật và chỉ định nhóm bảo mật cho người dùng

Quyền truy cập bảo mật trong Odoo được cấu hình thông qua các nhóm bảo mật: quyền được cấp cho các nhóm sau đó các nhóm sẽ được gán cho người dùng. Mỗi chức năng đều có các nhóm bảo mật cơ sở được cung cấp bởi ứng dụng trung tâm. Khi một module bổ trợ mở rộng chức năng mới của ứng dụng hiện có chúng ta phải thêm quyền vào các nhóm bảo mật tương ứng. Thông thường chúng ta nên có ít nhất nhóm vai trò người dùng và người quản lý.

Lấy ví dụ về modul viin_education đã giới thiệu ở Creating Odoo Add-On Modules, chúng ta thêm các nhóm bảo mật cho module.

Các bước thực hiện

Để thêm các nhóm bảo mật mới vào một module, hãy thực hiện các bước sau:

Bước 1. Thêm một tệp XML mới cho các bản ghi dữ liệu vào mục ‘security/edutcation_security.xml’, bắt đầu bằng cấu trúc trống:

<odoo>
   <!-- Add step 2 goes here -->
</odoo>

Bước 2. Sử dụng thẻ <record> tạo dữ liệu cho category và 2 nhóm quyền mới bên trong tệp XML:

<record id="module_education_category" model="ir.module.category">
   <field name="name">Education</field>
   <field name="sequence">10</field>
</record>

<record id="module_education_category_user" model="ir.module.category">
   <field name="name">Education</field>
   <field name="parent_id" ref="module_education_category" />
   <field name="description">Helps you handle education application</field>
   <field name="sequence">10</field>
</record>

<record id="viin_education_group_user" model="res.groups">
   <field name="name">User</field>
   <field name="implied_ids" eval="[(4, ref('base.group_user'))]" />
   <field name="category_id" ref="module_education_category_user" />
   <field name="comment">Users belong to this group can use this application</field>
</record>

<record id="viin_education_group_admin" model="res.groups">
   <field name="name">Administrator</field>
   <field name="implied_ids" eval="[(4, ref('viin_education_group_user'))]" />
   <field name="category_id" ref="module_education_category_user" />
   <field name="users" eval="[(4, ref('base.user_root')),(4, ref('base.user_admin'))]" />
   <field name="comment">Users belong to this group can control this application</field>
</record>

Bước 3. Đảm bảo rằng security/edutcation_security.xml được tham chiếu bởi khoá data trong tệp __manifest__.py:

'data': [
   'security/edutcation_security.xml',
],

Nếu chúng ta nâng cấp module, 2 bản ghi nhóm bảo mật sẽ được tạo ra. Để thấy nhóm mới được tạo ra trên giao diện, bạn cần kích hoạt chế độ nhà phát triển. Sau đó thực hiện ấn vào Thiết lập > Người dùng & Công ty > Nhóm:

Viindoo

10.1 Các nhóm bảo mật mới được thêm vào

Viindoo

10.2 Giao diện cài đặt người dùng

Note

Nếu bạn thêm 1 model mới, người dùng quản trị viên sẽ không có quyền truy cập model đó. Điều này có nghĩa là các menu và view đã được thêm vào model đó sẽ không hiển thị với người dùng quản trị. Để hiển thị nó, bạn cần thêm quy tắc truy cập cho model đó.

Cơ chế hoạt động

Trong ví dụ trên, chúng ta tạo các nhóm bằng thẻ <record>, thẻ này sẽ tạo bản ghi của model res.groups. Các cột quan trọng nhất của model res.groups như sau:

  • name: Tên hiển thị của nhóm.

  • category_id: Tham chiếu đến danh mục ứng dụng và được sử dụng để tổ chức các nhóm biểu mẫu của người dùng.

  • implied_ids: Các nhóm khác để kế thừa quyền.

  • users: Danh sách người dùng thuộc nhóm này. Chúng ta muốn người dùng quản trị thuộc nhóm người quản lý của ứng dụng.

Nhóm bảo mật đầu tiên kế thừa lại quyền của nhóm base.group_user. Đây được hiểu như nhóm người dùng nhân viên và là nhóm bảo mật cơ bản nhất mà những người dùng có quyền với ứng dụng sẽ được chia sẻ.

Nhóm bảo mật thứ hai kế thừa lại quyền của nhóm đầu tiên và chia sẻ quyền cho người dụng quản trị viên có XML ID là base.user_admin Người dùng thuộc nhóm bảo mật này sẽ tự động thuộc các nhóm bảo mật mà nhóm này kế thừa quyền. Ví dụ: Nếu bạn chỉ định nhóm Administrator cho người dùng nào thì người dùng đó cũng được đưa vào nhóm User. Điều này là do nhóm Administrator có nhóm User trong cột implied_ids. Ngoài ra, người dùng có quyền nếu bất kỳ nhóm nào mà họ thuộc về (trực tiếp hoặc gián tiếp) cấp quyền đó.

Ngoài ra

Nhóm bảo mật đặc biệt base.group_no_one có tên là Quyền Bổ sung/Tính năng kỹ thuật (Extra Rights/Technical Features) cũng rất đáng chú ý. Trong các phiên bản Odoo trước, nó được sử dụng cho các tính năng nâng cao bị ẩn đi theo mặc định và chỉ hiện thị khi Tính năng kỹ thuật được kích hoạt. Từ phiên bản 9.0, điều này đã thay đổi và các tính năng sẽ hiển thị nếu chúng ta kích hoạt chế độ Nhà phát triển.

Thêm quyền truy cập bảo mật vào model

Để xem được các view và menu của model, bạn cần thêm danh sách kiểm soát truy cập bảo mật (ACLs).

Bạn cũng có thể truy cập các model mới được thêm vào thông qua một siêu người dùng vì điều này bỏ qua tất cả các quy tắc bảo mật. Để tìm hiểu thêm về điều này, vui lòng tham khảo cách truy cập Odoo dưới dạng siêu người dùng trong Creating Odoo Add-On Modules. Tính năng superuser chỉ có sẵn cho người dùng quản trị viên. Vì vậy, để người dùng không phải quản trị viên có thể sử dụng các model mới, chúng ta cần xác định danh sách kiểm soát truy cập của họ để Odoo biết cách thức truy cập vào chúng, cũng như những thao tác mà mỗi nhóm người dùng được phép thực hiện.

Các bước thực hiện

Chúng ta sẽ tiếp tục sử dụng module viin_education ở ví dụ trước và thêm các ACLs bị thiếu vào đó.

Module viin_education chứa tệp python education_school.py tạo model education.school. Bây giờ chúng ta sẽ thêm tệp dữ liệu mô tả kiểm soát truy cập bảo mật của model này bằng cách thực hiện các bước sau:

Bước 1. Chỉnh sửa tệp __manifest__.py để khai báo dữ liệu mới:

'data': [
  # ...Security Groups
  'security/ir.model.access.csv',
  # ...Other data files
],

Bước 2. Thêm tệp bảo mật mới security/ir.model.access.csv vào module với những dòng sau:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_education_school_user,education.school user,model_education_school,viin_education_group_user,1,0,0,0
access_education_school_admin,education.school admin,model_education_school,viin_education_group_admin,1,1,1,1

Bước 3. Nâng cấp module để các bản ghi ACLs được thêm vào cơ sở dữ liệu.

Cơ chế hoạt động

Bảo mật ACLs được lưu trữ trong model ir.model.access. Chúng ta chỉ cần thêm các bản ghi mô tả các quyền truy cập dự kiến cho mỗi nhóm người dùng.

Chúng ta có thể dùng loại tệp nào cũng được nhưng phổ biến được dùng trong Odoo là tệp CSV. Tệp có thể được đặt bất kỳ đâu bên trong thư mục module, nhưng theo quy ước chúng ta sẽ đặt tất cả các tệp liên quan đến bảo mật trong thư mục security.

Nếu module có tệp tạo các nhóm bảo mật mới, thì tệp dữ liệu đó phải được khai báo trước tệp dữ liệu ACLs trong manifest.py vì bạn có thể muốn sử dụng chúng cho ACLs.

Các cột trong tệp dữ liệu CSV có ý nghĩa như sau:

  • id: Định danh nội bộ XML ID cho quy tắc này. Quy ước sử dụng access_<model>_<group>.

  • name: Tiêu đề cho quy tắc truy cập. Quy ước sử dụng <model>.<group>.

  • model_id: Model có quyền truy cập điều khiển ALCs. Với định dạng model_<name>, sử dụng _name của model với dấu gạch dưới thay vì dấu chấm.

  • group_id: Các nhóm bảo mật được cấp quyền truy cập. Nếu để trống nó sẽ áp dụng cho tất cả người dùng.

  • perm_create: Các thành viên thuộc nhóm có thể thêm mới bản ghi vào model. Nó chấp nhận giá trị 0 hoặc 1. Sử dụng 0 để hạn chế quyền truy cập tạo dữ liệu trên model và 1 để cung cấp quyền truy cập tạo.

  • perm_read: Các thành viên thuộc nhóm có thể đọc các bản ghi của model. Nó chấp nhận giá trị 0 hoặc 1. Sử dụng 0 để hạn chế quyền truy cập đọc dữ liệu của model và 1 để cung cấp quyền truy cập đọc.

  • perm_write: Các thành viên thuộc nhóm có thể sửa các bản ghi của model. Nó chấp nhận giá trị 0 hoặc 1. Sử dụng 0 để hạn chế quyền truy cập sửa dữ liệu của model và 1 để cung cấp quyền truy cập sửa.

  • perm_unlink: Các thành viên thuộc nhóm có thể xoá các bản ghi của model. Nó chấp nhận giá trị 0 hoặc 1. Sử dụng 0 để hạn chế quyền truy cập xoá dữ liệu trên model và 1 để cung cấp quyền truy cập xoá.

Giới hạn quyền truy cập bảo mật vào các trường trong model

Trong một số trường hợp, chúng ta cần kiểm soát quyền truy cập chi tiết hơn và có thể cần giới hạn quyền truy cập vào các trường cụ thể trong một model.

Sử dụng đối số groups của trường để cung cấp danh sách các nhóm có quyền truy cập. Nếu người dùng hiện tại không thuộc một trong những nhóm được liệt kê người dùng đó sẽ không có quyền truy cập vào trường:

  • Các trường bị hạn chế và sẽ bị xoá khỏi giao diện được yêu cầu.

  • Các trường bị hạn chế sẽ bị xoá khỏi phản hồi của fields_get().

  • Nếu cố gắng đọc hoặc ghi vào các trường bị hạn chế sẽ dẫn đến lỗi truy cập.

Các bước thực hiện

Để thêm trường chỉ định quyền giới hạn truy cập cho các nhóm bảo mật củ thể, hãy thực hiện các bước sau:

Bước 1. Lấy ví dụ trên model education.school, thực hiện thêm trường cho model:

is_private = fields.Boolean(string='Is Private', groups='viin_education.viin_education_group_admin')

Bước 2. Thêm trường vào giao diện

<field name="is_private" />

Bây giờ, hãy nâng cấp module để cập nhật những thay đổi. Nếu truy cập bản ghi của model education.school không phải người dùng thuộc nhóm quyền Quản trị viên thì trường is_private sẽ không hiển thị.

Giới hạn quyền truy cập bản ghi bằng cách sử dụng các quy tắc bản ghi

Quy tắc bản ghi là một biểu thức bộ lọc miền được xác định trên model, sau đó sẽ được thêm vào mọi truy vấn dữ liệu được thực hiện bởi những người dùng bị ảnh hưởng. Quy tắc bản ghi được đánh giá trên từng bản ghi, tuân theo các quyền truy cập.

Ví dụ: Chúng ta sẽ thêm quy tắc bản ghi vào model education.school để người dùng nhóm User chỉ có quyền truy cập vào bản ghi không đánh dấu riêng tư is_private = False.

Các bước thực hiện

Chúng ta sẽ lấy ví dụ cho module viin_education trước đó.

Bước 1. Đảm bảo rằng security/edutcation_security.xml được ttham chiếu bởi khoá data trong __manifest__.py:

'data': [
  'security/edutcation_security.xml',
],

Bước 2. Sử dụng thẻ <record> để thêm quy tắc bản ghi trong tệp edutcation_security.xml:

<record id="education_school_rule_user" model="ir.rule">
  <field name="name">School: Only see the school is not private</field>
  <field name="model_id" ref="model_education_school" />
  <field name="groups" eval="[(4, ref('viin_education.viin_education_group_user'))]" />
  <field name="domain_force">[('is_private', '=', False)]</field>
</record>

<record id="education_school_rule_admin" model="ir.rule">
  <field name="name">School: See all schools</field>
  <field name="model_id" ref="model_education_school" />
  <field name="groups" eval="[(4, ref('viin_education.viin_education_group_admin'))]" />
  <field name="domain_force">[(1, '=', 1)]</field>
</record>

Bây giờ, hãy nâng cấp module để các quy tắc bản ghi được cập nhật. Nếu bạn sử dụng dữ liệu demo, bạn có thể kiểm tra nó thông qua người dùng demo mặc định để cấp quyền người dùng module viin_education cho người dùng demo. Nếu không sử dụng dữ liệu demo bạn có thể tạo người dùng mới và cấp quyền cho họ.

Cơ chế hoạt động

Quy tắc bản ghi là các bản ghi dữ liệu trong model ir.rule. Có thể thêm tệp XML để thêm quy tắc bản ghi ở bất cứ đâu trong module nhưng quy ước là để nó nằm trong thư mục bảo mật security. Thông thường các nhóm bảo mật và quy tắc bản ghi sẽ được viết chung 1 tệp XML.

Để xem được các quy tắc bản ghi trong hệ thống, hãy kích hoạt chế độ nhà phát triển rồi thực hiện vào Thiết lập > Kỹ thuật > Quy tắc bản ghi:

Viindoo

10.3 Quy tắc bản ghi cho trường học ví dụ ở trên

Những trường quan trọng của quy tắc bản ghi được sử dụng trong ví dụ này:

  • Tên (name): Mô tả cho quy tắc bản ghi.

  • Model (model_id): Model mà quy tắc được áp dụng.

  • Nhóm (groups): Các nhóm bảo mật mà quy tắc được áp dụng. Nếu không có nhóm bảo mật nào được chỉ định, quy tắc được coi là toàn cầu và được áp dụng theo một các khác (cùng tìm hiểu nhiều hơn ở dưới).

  • Domain (domain): Một biểu thức domain được sử dụng để lọc các bản ghi. Quy tắc chỉ áp dụng cho bản ghi được lọc này.

Quy tắc bản ghi đầu tiên chúng ta tạo ra là dành cho nhóm người dùng giáo dục. Nó sự dụng biểu thức domain [(‘is_private’, ‘=’, False)] để chọn những trường học không có đánh dấu là riêng tư. Do đó, những người dùng thuộc nhóm này chỉ nhìn thấy những trường học không đánh dấu riêng tư.

Quy tắc bản ghi thứ 2 giúp cho người dùng thuộc nhóm quản trị giáo dục nhìn được tất cả bản ghi dữ liệu của trường học. Vì nhóm bảo mật quản trị kế thừa nhóm người dùng giáo dục nếu chúng ta không làm điều này thì người dùng thuộc nhóm quản trị chỉ nhìn được những bản ghi trường học không đánh dấu riêng tư.

Note

Các quy tắc bản ghi sẽ được bỏ qua nếu bạn kích hoạt chế độ Người dùng siêu cấp (SUPERUSER). Khi kiểm tra quy tắc bản ghi của bạn, hãy đảm bảo rằng bạn đang sử dụng một người dùng khác.

Ngoài ra

Khi quy tắc bản ghi không được gán cho bất kỳ nhóm bảo mật nào, nó sẽ được đánh dấu là toàn cầu và được xử lý khác với các quy tắc khác.

Quy tắc bản ghi toàn cầu có hiệu lực mạnh mẽ hơn so với quy tắc bản ghi cấp nhóm. Nếu hai quy tắc toàn cầu được áp dụng thì cả hai đều phải được đáp ứng để quyền truy cập được cấp, điều này có nghĩa là việc thêm các quy tắc bản ghi toàn cầu luôn hạn chế quyền truy cập hơn nữa. Về mặt kỹ thuật, chúng được tham gia với toán tử AND. Trong các module tiêu chuẩn, chúng được sử dụng để thực hiện truy cập bảo mật đa công ty để người dùng chỉ có thể xem dữ liệu công ty của họ.

Tóm lại, các quy tắc bản ghi phi toàn cầu được tham gia với một toán tử OR, chúng được thêm vào cùng nhau và một bản ghi có thể được truy cập nếu bất kỳ quy tắc nào cấp quyền truy cập đó. Quy tắc bản ghi toàn cầu sau đó thêm các hạn chế vào quyền truy cập được đưa ra bởi các quy tắc bản ghi thông thường bằng toán tử AND. Các hạn chế đã được thêm vào bởi quy tắc bản ghi toàn cầu không thể bị ghi đè bởi các quy tắc bản ghi thông thường.

Sử dụng các nhóm bảo mật để kích hoạt các tính năng

Các nhóm bảo mật cũng có thể được sử dụng để bật hoặc tắt các tính năng cho một số hoặc tất cả người dùng trong một hệ thống Odoo. Phương pháp này thêm tùy chọn vào cài đặt cấu hình bạn có thể sử dụng để bật các tính năng bổ sung: Làm cho chúng hiển thị bằng cách sử dụng các nhóm bảo mật.

Chúng ta sẽ lấy ví dụ cho module viin_education trước đó. Tạo ra một nhóm bảo mật mới chỉ cho phép quản lý Lớp Học và kích hoạt tính năng trong thiết lập người dùng, trước đó hãy đảm bảo rằng bạn đã có model Lớp học - education.class và giao diện tính năng để quản lý chúng. Cùng theo dõi cách thực hiện bên dưới đây.

Các bước thực hiện

Bước 1. Để thêm nhóm bảo mật mới hãy chỉnh sửa tệp security.xml và thêm bản ghi nhóm bảo mật mới vào đó:

<record id="viin_education_group_allow_manager_class" model="res.groups">
<field name="name">Allow class management</field>
</record>

Bước 2. Chỉnh sửa tệp ir.model.access.csv thêm ALCs cấp quyền truy cập vào model education.class cho nhóm quyền trên.

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_education_class_allow_manager,education.class allow_manager,model_education_class,viin_education_group_allow_manager_class,1,1,1,1

Bước 3: Thêm menu quản lý lớp học trong tệp views/education_class_views.xml và sử dụng thuộc tính groups để hạn chế nhóm bảo mật.

<menuitem id="education_class_allow_manager_menu"
       action="education_class_action"
       parent="education_management_menu_root"
       groups="viin_education.viin_education_group_allow_manager_class"
       sequence="100"/>

Bây giờ, hãy nâng cấp module để cập nhật các bản ghi bảo mật vào giao diện. Với người dùng bình thường họ sẽ không thể nhìn thấy menu quản lý lớp học chúng ta có thể sự dụng nhóm bảo mật vừa tạo ở trên để kích hoạt tính năng cho phép hiển thị menu quản lý lớp học và cấp quyền truy cập cho người dùng đó.

Để thực hiện kích hoạt tính năng trên giao diện, thực hiện vào Thiết lập > Người dùng & Công ty > Người dùng sau đó kích hoạt tính năng cho người dùng bạn muốn:

Viindoo

10.4 Kích hoạt tính năng cho người dùng

Viindoo

10.5 Giao diện người dùng được kích hoạt tính năng quản lý lớp học

Truy cập tập bản ghi với tư cách siêu người dùng

Trong các phần trước, chúng ta đã được giới thiệu về các kỹ thuật bảo mật như quy tắc truy cập, các nhóm bảo mật và quy tắc bản ghi. Với những kỹ thuật này, bạn có thể tránh khỏi truy cập trái phép. Tuy nhiên, đôi khi bạn có các trường hợp đặc biệt mà bạn muốn truy cập hoặc sửa đổi các bản ghi, ngay cả khi người dùng bình thường không có quyền truy cập vào các bản ghi dữ liệu đó. Ví dụ: người dùng không có quyền truy cập vào bản ghi học viên, nhưng bằng cách đăng ký khoá học người dùng có thể đồng thời tạo ra bản ghi dữ liệu của học viên.

Sử dụng sudo() khi muốn thực hiện truy cập bản ghi như một người dùng siêu cấp. Bạn cũng cần cẩn thận khi sử dụng sudo() vì nó bỏ qua tất cả các quyền truy cập và dễ gây ra sự cố bảo mật không mong muốn.

Ẩn các phần tử và menu trên giao diện dựa trên các nhóm bảo mật

Trong các ví dụ trước, chúng ta đã học cách ẩn các trường với một số người dùng bằng đối số groups trong định nghĩa của trường Python. Có một cách khác để ẩn các trường trên giao diện người dùng: Bằng cách sử dụng thuộc tính groups vào các thẻ XML trong định nghĩa view. Bạn cũng có thể sử dụng thuộc tính groups với các menu để ẩn chúng khỏi giao diện của người dùng không mong muốn.

Trong phần này, chúng ta sẽ thử một ví dụ đơn giản để ẩn mã học viên trên giao diện Học Viên đối với người dùng không thuộc nhóm người dùng quản trị. Theo dõi cách thực hiện dưới đây.

Các bước thực hiện

Bước 1. Đảm bảo rằng bạn đã có tệp views/education_student_views.xml định nghĩa view cho model education.student.

Bước 2. Sử dụng thuộc tính groups để ẩn mã học viên trên giao diện Học Viên đối với người dùng không thuộc nhóm người dùng quản trị, chỉ hiện thị đối với người dùng quản trị.

<field name="student_code" groups="viin_education.viin_education_group_admin" />

Bây giờ, hãy nâng cấp module để cập nhật thay đổi. Lúc này trên giao diện thông tin Học Viên, người dùng không thuộc nhóm quản trị sẽ không thấy được mã học viên.

Viindoo

10.6 Giao diện thông tin học viên của người dùng không thuộc nhóm quản trị

Viindoo

10.7 Giao diện thông tin học viên của người dùng thuộc nhóm quản trị