From 8b9fe6c963cdb0010fa73a2ac4c47de9c4fc4fac Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Tue, 20 Oct 2026 19:37:26 +0600 Subject: [PATCH 1/6] docs(building-sites/client-proofing): fact-check pass, en/ru sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fact-checked the whole section against MODX Revolution 3.x code and closed 122 audit findings: 13 PHANTOM, 27 STALE, 6 ORPHAN, 56 UNDOCUMENTED, 18 UNVERIFIABLE. The Russian locale mirrors the English one page by page. Themes of the manager: - `manager_theme` holds the name of a directory inside `manager/templates/`, the combo box cannot be typed by hand, and the upgrade script resets the value to `default`. A theme has to carry `images/modx-icon-color.svg`, `images/modx-logo-color.svg`, `images/login/default-background.jpg` and `email/default.tpl` — they are read from the theme with no fallback. The stylesheet of the login page is not themed: `login.tpl` links the one of the `default` theme by a fixed path. Dashboards: - a widget comes in seven sizes and four types, the Inline PHP one included; the paths of the menu, the labels of the buttons and the key of the lexicon in the example are the ones of MODX 3; - added the fields `permission` and `properties`, the setting `hide_trees`, the permission `dashboards`, the personal resize, the seven widgets of the core, the creation and the deletion of a dashboard, the filter by a user group, the events and the permissions. Form Customization: - the eleven pages of `rules/` described the grid of rules of MODX 2.x, which does not exist in 3.x: the rules are derived from the three grids of a set and are rebuilt on every save. All eleven pages were rewritten for 3.x; - added the list of the ten kinds of rules, the order they are applied in, the list of the fields and of the regions, the three actions of a set, the groups of the policy templates and the API of the section; - the name and the value of the rule "Move TV to Tab" were swapped in the documentation, and the two region ids that do not exist were fixed. Security: - the model is list-based, not attribute-based, and the wording now matches the code; - the table of the permissions of the Administrator policy was rebuilt from the core: 183 rows, the four permissions that never existed are gone; - the paths of the menu of MODX 2.x were replaced with the ones of 3.x; - added the twelve policies of the core, the seventh policy template, the seven groups of the templates, the five kinds of ACL, the fifth access area of a group, the permissions needed to manage groups, roles and policies, the flag `sudo` with its permission `set_sudo`, the eight missing fields of a user, the events of the section, the settings of the accounts and what a fresh installation creates; - the passwordless login and the manual reset of a password were corrected for 3.x. Every page of the section carries a `description` in the frontmatter, as the passes over resources, sending-mail and tag-syntax did. The frames of the Russian pages were missing: eighteen images that live only in the English locale were added to `ru/`, the way the other locales of the set keep their images. --- .../client-proofing/custom-manager-themes.md | 58 +++- .../dashboards/creating-a-widget.md | 54 +-- .../client-proofing/dashboards/index.md | 63 ++-- .../client-proofing/dashboards/managing.md | 42 ++- .../client-proofing/dashboards/usergroups.md | 24 +- .../dashboards/widget-types/file.md | 30 +- .../dashboards/widget-types/html.md | 3 +- .../dashboards/widget-types/index.md | 25 +- .../dashboards/widget-types/inline-php.md | 15 +- .../dashboards/widget-types/snippet.md | 1 + .../form-customization/index.md | 44 ++- .../form-customization/profiles.md | 18 +- .../form-customization/rules/field-default.md | 21 +- .../form-customization/rules/field-label.md | 17 +- .../form-customization/rules/field-visible.md | 23 +- .../form-customization/rules/index.md | 48 ++- .../rules/move-tv-to-tab.md | 31 +- .../form-customization/rules/new-tab.md | 43 +-- .../form-customization/rules/tab-title.md | 28 +- .../form-customization/rules/tab-visible.md | 17 +- .../form-customization/rules/tv-default.md | 29 +- .../form-customization/rules/tv-title.md | 17 +- .../form-customization/rules/tv-visible.md | 17 +- .../form-customization/sets.md | 57 +++- .../form-customization/tabs.md | 60 ++-- en/building-sites/client-proofing/index.md | 28 +- .../client-proofing/manager-login.md | 66 +++- .../client-proofing/security/index.md | 85 ++++- .../security/passwordless-login/index.md | 46 ++- .../client-proofing/security/policies/acls.md | 41 ++- .../security/policies/index.md | 82 +++-- .../permissions/administrator-policy.md | 314 ++++++++++++------ .../security/policies/permissions/index.md | 39 +-- .../policies/permissions/resource-policy.md | 51 ++- .../security/policies/policytemplates.md | 45 ++- .../security/resource-groups.md | 3 +- .../client-proofing/security/roles.md | 57 ++-- .../creating-a-second-super-admin-user.md | 48 ++- .../giving-a-user-manager-access.md | 35 +- .../security/security-tutorials/index.md | 1 + .../making-member-only-pages.md | 152 ++++----- .../more-on-the-anonymous-user-group.md | 44 ++- .../restricting-an-element-from-users.md | 59 ++-- .../troubleshooting-security/index.md | 1 + .../resetting-a-user-password-manually.md | 69 ++-- .../client-proofing/security/user-groups.md | 50 +-- .../client-proofing/security/users.md | 151 +++++---- .../client-proofing/custom-manager-themes.md | 56 +++- .../dashboards/creating-a-widget.md | 31 +- .../client-proofing/dashboards/index.md | 66 ++-- .../client-proofing/dashboards/managing.md | 35 +- .../client-proofing/dashboards/usergroups.md | 32 +- .../dashboards/widget-types/file.md | 26 +- .../dashboards/widget-types/html.md | 3 +- .../dashboards/widget-types/index.md | 32 +- .../dashboards/widget-types/inline-php.md | 30 +- .../dashboards/widget-types/snippet.md | 1 + .../form-customization/fc_new_tab.jpg | Bin 0 -> 19054 bytes .../form-customization/index.md | 46 +-- .../form-customization/profiles.md | 20 +- .../form-customization/rules/field-default.md | 23 +- .../form-customization/rules/field-label.md | 19 +- .../form-customization/rules/field-visible.md | 25 +- .../form-customization/rules/index.md | 50 ++- .../rules/move-tv-to-tab.md | 33 +- .../form-customization/rules/new-tab.md | 43 +-- .../form-customization/rules/tab-title.md | 30 +- .../form-customization/rules/tab-visible.md | 19 +- .../form-customization/rules/tv-default.md | 31 +- .../form-customization/rules/tv-title.md | 19 +- .../form-customization/rules/tv-visible.md | 19 +- .../form-customization/sets.md | 63 ++-- .../form-customization/tabs.md | 53 +-- ru/building-sites/client-proofing/index.md | 30 +- .../client-proofing/manager-login.md | 40 ++- .../security/drag-resource-into-group1.png | Bin 0 -> 20409 bytes .../client-proofing/security/index.md | 101 +++++- .../security/passwordless-login/index.md | 30 +- .../security/policies/acl-ecat1.png | Bin 0 -> 10164 bytes .../security/policies/acl-rg1.png | Bin 0 -> 11246 bytes .../client-proofing/security/policies/acls.md | 13 +- .../security/policies/index.md | 36 +- .../permissions/administrator-policy.md | 295 ++++++++++------ .../security/policies/permissions/index.md | 3 +- .../permissions/modx+custom+permission.jpg | Bin 0 -> 25206 bytes .../policies/permissions/resource-policy.md | 2 + .../security/policies/policy1-perm.png | Bin 0 -> 13444 bytes .../security/policies/policy1.png | Bin 0 -> 12447 bytes .../security/policies/policytemplates.md | 19 ++ .../security/resource-groups.md | 3 +- .../security/resource_groups_edit.jpg | Bin 0 -> 26116 bytes .../client-proofing/security/roles-grid.png | Bin 0 -> 6419 bytes .../client-proofing/security/roles.md | 21 +- .../client-proofing/security/sec-ugctx1.png | Bin 0 -> 10801 bytes .../security-tutorials/access+controls.png | Bin 0 -> 15834 bytes .../security-tutorials/context-access.png | Bin 0 -> 56948 bytes .../create-resource-group.png | Bin 0 -> 64583 bytes .../creating-a-second-super-admin-user.md | 9 +- .../giving-a-user-manager-access.md | 1 + .../security/security-tutorials/index.md | 1 + .../making-member-only-pages.md | 70 +--- .../more-on-the-anonymous-user-group.md | 31 +- .../restricting-an-element-from-users.md | 17 +- .../screen+shot+2012-10-19+at+11.43.46+pm.png | Bin 0 -> 55534 bytes .../user+group_+anonymous.png | Bin 0 -> 31097 bytes .../security-tutorials/user-group-perms.jpg | Bin 0 -> 62685 bytes .../troubleshooting-security/index.md | 1 + .../resetting-a-user-password-manually.md | 51 +-- .../client-proofing/security/ug-ctx-grid1.png | Bin 0 -> 6318 bytes .../client-proofing/security/ug-rg-grid1.png | Bin 0 -> 7338 bytes .../security/understanding-revo-acls.jpg | Bin 0 -> 97901 bytes .../client-proofing/security/user-groups.md | 16 +- .../client-proofing/security/users.md | 168 ++++++---- 113 files changed, 2513 insertions(+), 1502 deletions(-) create mode 100644 ru/building-sites/client-proofing/form-customization/fc_new_tab.jpg create mode 100644 ru/building-sites/client-proofing/security/drag-resource-into-group1.png create mode 100644 ru/building-sites/client-proofing/security/policies/acl-ecat1.png create mode 100644 ru/building-sites/client-proofing/security/policies/acl-rg1.png create mode 100644 ru/building-sites/client-proofing/security/policies/permissions/modx+custom+permission.jpg create mode 100644 ru/building-sites/client-proofing/security/policies/policy1-perm.png create mode 100644 ru/building-sites/client-proofing/security/policies/policy1.png create mode 100644 ru/building-sites/client-proofing/security/resource_groups_edit.jpg create mode 100644 ru/building-sites/client-proofing/security/roles-grid.png create mode 100644 ru/building-sites/client-proofing/security/sec-ugctx1.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/access+controls.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/context-access.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/create-resource-group.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/screen+shot+2012-10-19+at+11.43.46+pm.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/user+group_+anonymous.png create mode 100644 ru/building-sites/client-proofing/security/security-tutorials/user-group-perms.jpg create mode 100644 ru/building-sites/client-proofing/security/ug-ctx-grid1.png create mode 100644 ru/building-sites/client-proofing/security/ug-rg-grid1.png create mode 100644 ru/building-sites/client-proofing/security/understanding-revo-acls.jpg diff --git a/en/building-sites/client-proofing/custom-manager-themes.md b/en/building-sites/client-proofing/custom-manager-themes.md index 41b0492c7..9199bd7d2 100644 --- a/en/building-sites/client-proofing/custom-manager-themes.md +++ b/en/building-sites/client-proofing/custom-manager-themes.md @@ -1,21 +1,59 @@ --- title: "Custom Manager Themes" -_old_id: "365" -_old_uri: "2.x/administering-your-site/customizing-the-manager/manager-templates-and-themes" +description: "Override the files of the MODX Manager with a theme of your own: how the theme is chosen, what it has to contain, and how to override a single file or a controller." --- -**Heads up**: when you use custom Manager theme you need to check that everything still works as expected after upgrading MODX. A custom Manager theme can conflict with or be missing important core changes that come in new MODX releases. +**Heads up**: check a custom manager theme after every upgrade of MODX. A theme can conflict with the changes of a new release, and the files that a release adds are never picked up by the theme. -The MODX Manager uses a template similar to regular MODX pages. By default, the Manager template files live inside the `manager/templates/default` directory. By updating the MODX system setting for `manager\_theme` to point to a new directory, you can override any single file by copying its directory structure and adding just the templates you wish to override. You can override as few or as many templates as you desire, as long as you maintain identical directory layouts. The Manager will fall back to the `default` theme templates for any that have not been overridden. +## How a Theme Works -For example, to customize only the Manager Login page, you copy the following file into a new directory: +The manager is built on Smarty templates. The files of the default theme live in `manager/templates/default`. The system setting `manager_theme` holds the name of a directory inside `manager/templates/`. The manager reads the files of that theme first, and falls back to the files of `default` for everything the theme does not have. ->manager/templates/default/security/login.tpl +Only the `default` theme ships with MODX 3. The others come with a build or with an extra, or they are your own. -To create a custom Manager login theme called **my-brand**, copy that file into a new directory: +The theme covers more than the pages of the manager. The templates of the dashboard widgets and of the TVs, and the controllers of the Resources, are resolved from it as well. ->manager/templates/**my-brand**/security/login.tpl +## Overriding a Single File -Then update your system setting for `manager\_theme` to point to the newly created `my-brand` directory. The version of the file from the `my-brand` directory will override the version of the file from the default directory. +To theme only the manager login page, copy the file: -While far less common, you can similarly override the Controllers in the same way, replacing "templates" with "controllers" per above. If you don't know what that means, you don’t need to do so. +`manager/templates/default/security/login.tpl` → `manager/templates/my-brand/security/login.tpl` + +Then set `manager_theme` to `my-brand`. The file from `my-brand` wins over the file from `default`. + +**Create the directory before you pick the theme** +The setting is a combo box that lists the directories of `manager/templates/`, and it cannot be typed by hand. Create `manager/templates/my-brand/` first, then pick it in **Admin → System Settings**. + +## What a Theme Has to Carry + +These files are read from the directory of the theme, with no fallback to `default`: + +| File | What breaks without it | +| --- | --- | +| `images/modx-icon-color.svg` | The icon of the site in the header of the manager. | +| `images/modx-logo-color.svg` | The logo on the login page. | +| `images/login/default-background.jpg` | The background of the login page. | +| `email/default.tpl` | Creating a user: the template of the letter is not found. | + +**The stylesheet of the login page is not themed** +`security/login.tpl` links the stylesheet of the `default` theme by a fixed path. To theme it, put `css/login.css` into the directory of the theme and fix the link in your own copy of `security/login.tpl`. The same holds for the browser of files, whose `browser/index.tpl` links `css/index.css` of the `default` theme. + +The stylesheet of the manager itself is themed. Put `css/index.css` into the directory of the theme, and the header picks it up through the `{$indexCss}` placeholder. + +## Where the Theme Has to Live + +The directory of the theme is resolved inside `manager/templates/`, which is part of the installation and is overwritten by an update. Keep the files of the theme in a repository of your own and restore them after an update. + +**An update resets the theme** +On an update in the Evolve mode, the script `setup/includes/upgrade.install.php` sets `manager_theme` back to `default`. Check the value after every update. + +## Overriding a Controller + +A controller is overridden the same way, with `controllers` in place of `templates`. The file in the theme must have the same name as in `default` (`.class.php`). The class inside it must be named `ManagerController` in the global namespace, for example `SecurityLoginManagerController`. + +## See Also + +1. [Client-proofing the manager](building-sites/client-proofing) +2. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) +3. [Customizing the Login](building-sites/client-proofing/manager-login) +4. [Dashboards](building-sites/client-proofing/dashboards) diff --git a/en/building-sites/client-proofing/dashboards/creating-a-widget.md b/en/building-sites/client-proofing/dashboards/creating-a-widget.md index e1c874481..4a6dc4228 100644 --- a/en/building-sites/client-proofing/dashboards/creating-a-widget.md +++ b/en/building-sites/client-proofing/dashboards/creating-a-widget.md @@ -1,25 +1,26 @@ --- title: "Creating a Dashboard Widget" -_old_id: "69" -_old_uri: "2.x/administering-your-site/dashboards/creating-a-dashboard-widget" +description: "Create a Dashboard Widget in MODX: the fields of a widget, the sizes it takes, and how to put it on a Dashboard." --- -This article describes how to create a custom Dashboard Widget, including a short description of the different Dashboard Widget types and how they work. - ## Creating a Basic Widget -Go to the Dashboards page (Dashboard -> Dashboards in the top menu), and click on the "Widgets" tab. Then, click on "Create New Widget", and this will load the Widget creation screen. You'll see a few new fields: +Go to the Dashboards page (**Admin → Dashboards** in the top menu), and click on the "Widgets" tab. Then click **Create**, and the Widget creation screen loads. It has these fields: -- **Name** - The name of your new widget. Let's call ours "Hello World". -- **Description** - A short description of your widget, used internally. -- **Widget Type** - The type of Widget. We'll get into this more later, but for now, just select "HTML". -- **Size** - Widgets come in 3 sizes - half, full, and double. A half-sized widget takes up half of one row. A full takes up one whole row. A double takes up 2 rows. -- **Namespace** - The Namespace to associate the widget with. Useful for Extras developers; but for us, let's keep it at "core". -- **Lexicon** - Adds an ability to load a lexicon with this widget. Let's go ahead and leave ours at "core:dashboards", the default setting. +| Field | What it holds | +| --- | --- | +| **Name** | The name of the widget. It must be unique. | +| **Description** | A short description of the widget, used internally. | +| **Widget Type** | The type of the widget. For a first widget, select "HTML". | +| **Size** | One of seven sizes: Quarter, One Third, Half, Two Third, Three Quarters, Full Size and Double Size. | +| **Permission** | The manager permission a user needs for the widget to appear. Empty means the widget is shown to everyone. | +| **Namespace** | The Namespace to associate the widget with. Leave it at "core" unless you build an Extra. | +| **Lexicon** | The lexicon to load with the widget. The default is "core:dashboards". | +| **Properties** | Arbitrary properties of the widget, stored as JSON. A file or a snippet widget receives them as `$scriptProperties`. | -You'll note that as you type the name of the widget, text appears below it following what you type. This is the automatic translation tool for Widget names; if you were to type a Lexicon Entry key, it would translate it (try typing "widget\_create" for kicks to see what it does). +As you type the name, a translated version of it appears below the field. The translation looks up the key in the lexicon of the widget. Type the key of an existing entry, for example `w_configcheck`, and it shows the translated name of that entry. -Now, in your dashboard widget content, go ahead and put this: +Now, in the content of the widget, put this: ``` php

Hello, world!

@@ -29,13 +30,13 @@ Our widget should look like this: ![](dashboard-create1.png) -Go ahead and save the Widget. +Save the widget. ### Assigning the Widget to the Default Dashboard -Now that we've got our widget, let's assign it to the Default Dashboard, by going back to the main Dashboards page, clicking on the "Dashboards" tab, and finding the default Dashboard. Right-click on it, and click "Update Dashboard". This will load the Default Dashboard editing page. +To assign the widget to the Default Dashboard, go back to the main Dashboards page, click on the "Dashboards" tab, and find the Default Dashboard. Right-click on it and click "Edit". This loads the editing page of the Default Dashboard. -From here, click the "Place Widget" button above the Widgets grid on this page. Select our "Hello World" widget from the dropdown, and click save. Now our Widget is on the Dashboard! Let's go ahead and place it in position #2 by dragging it between the "Configuration Check" widget and the "MODX News Feed" widget: +From here, click the "Place Widget" button above the Widgets grid on this page. Select the "Hello World" widget from the dropdown, and click save. To place it in position #2, drag it between the "Configuration Check" widget and the "MODX News Feed" widget: ![](dashboard-create2.png) @@ -45,24 +46,31 @@ Save your Dashboard. > > Adding a widget directly on the dashboard page (via the dashboard view itself) only adds it for the currently logged-in user. Other users will not see it unless it is also added to the template. > -> On large sites with many users, adding a widget to the template will create a placement record for each user who already has a personal copy of that dashboard. Keep this in mind if performance is a concern. +> A widget that is added to the template arrives at the existing users with the default size and at the end of the list. +> +> On large sites with many users, adding a widget to the template creates a placement record for every user with a personal copy of that dashboard. Keep this in mind if performance is a concern. ### Viewing the Widget -Now, if you click the "Dashboard" top menu item on the page, you can see your new dashboard widget in place! +Now, if you click the MODX logo in the top left, you can see your new dashboard widget in place! ![](dashboard-create3.png) +## Removing a Widget + +A widget is removed from the Widgets tab, and that removes it from all the Dashboards it was placed on. The widgets that ship with MODX cannot be removed. + ## Other Widget Types -Obviously, there are more widget types to create. See the [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types "Dashboard Widget Types") section for more information on creating different types of widgets. +See the [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types "Dashboard Widget Types") section for the other types of widgets. ## See Also -1. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) -2. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) -3. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) +1. [Dashboards](building-sites/client-proofing/dashboards) +2. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) +3. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) +4. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) diff --git a/en/building-sites/client-proofing/dashboards/index.md b/en/building-sites/client-proofing/dashboards/index.md index 162ea67a6..2ad3a4ba6 100644 --- a/en/building-sites/client-proofing/dashboards/index.md +++ b/en/building-sites/client-proofing/dashboards/index.md @@ -1,48 +1,65 @@ --- title: "Dashboards" -_old_id: "90" -_old_uri: "2.x/administering-your-site/dashboards" +description: "The Dashboard of MODX: the widgets on the page a user sees after logging in, the core widgets, and the personal copy each user gets." --- -## What are Dashboards? +## What a Dashboard Is -A Dashboard in MODX is the page that shows on initial loading of the MODX manager, or when clicking the "Dashboard" link in the top-left of the screen. Dashboards can contain an unlimited number of "widgets", which are boxes that show various content on the Dashboard. Widgets can be arranged in any order, and can be either a file, a MODX Snippet, or straight HTML. +A Dashboard is the page that opens when a user logs in to the manager. The MODX logo in the top left leads to it as well. -Each User Group in MODX is assigned a Dashboard by default. This means that you can give different Users different Dashboards via the User Group they belong to. +A Dashboard holds widgets: boxes with content. A widget is a file, a MODX Snippet, straight HTML, or PHP code, and the widgets can be arranged in any order. -If a User is part of two different groups, it will use the Dashboard of its Primary Group, which can be set in the User editing screen. +Each User Group is assigned a Dashboard. This is how different users get different Dashboards. If a user belongs to two groups, the Dashboard of the Primary Group is used. The Primary Group is set on the User editing screen. + +## The Core Widgets + +MODX ships seven widgets: + +| Widget | Permission | +| --- | --- | +| MODX News Feed | — | +| MODX Security Feed | — | +| Who's Online | — | +| Configuration Check | — | +| Buttons | — | +| Recently Edited Resources | `view_document` | +| Updates | `workspaces` | + +The last two are shown only to the users who hold the permission, so they are missing on the Dashboard of an ordinary user. ## Customizable Dashboards -Dashboards have a **Customizable** setting. When this is checked (the default), MODX clones the dashboard's widget layout for each user the first time they load the dashboard. This gives each user their own personal copy of the dashboard, which they can then rearrange, add widgets to, or remove widgets from without affecting other users. +A Dashboard has a **Customizable** setting. When it is on (the default), MODX clones the layout of the widgets for every user the first time they open the Dashboard. Each user then has a personal copy, which they can rearrange, add widgets to, or remove widgets from, without touching the Dashboard of anyone else. + +A user can also resize a widget on their own copy, as long as the Dashboard is customizable. + +When **Customizable** is off, all users share the same layout and cannot change it. -When **Customizable** is unchecked, all users share the same dashboard layout and cannot make personal changes to it. +A Dashboard has a second setting, **Hide Left-Hand Trees**. It hides the trees on the left while the Dashboard is shown. ### How Template Changes Propagate -The widget layout configured through the Dashboards manager page (Dashboard -> Dashboards -> Update Dashboard) serves as the **template** for a customizable dashboard. When you add or remove widgets from the template, those changes propagate to all existing users of that dashboard: +The layout configured on the Dashboards manager page serves as the **template** of a customizable Dashboard. When you add or remove widgets from the template, the changes propagate to all existing users of that Dashboard: -- **Widgets added** to the template will automatically appear for all users who already have a personal copy of the dashboard. -- **Widgets removed** from the template will be removed from all users' personal dashboards. +- **Widgets added** to the template appear for all users who already have a personal copy. +- **Widgets removed** from the template are removed from all users' personal Dashboards. -Other personal customizations, such as widget order, are not affected by template changes. +The order of the widgets is not affected by template changes. A widget added to the template arrives at the existing users with the default size, at the end of the list, not with the size of the template. -Changes made directly on a user's dashboard page (for example, removing a widget with the close button or adding a widget via the dashboard itself) only affect that individual user and do not change the template. +Changes made directly on the Dashboard of a user affect that user only and do not change the template. This covers removing a widget with the close button and adding a widget from the Dashboard itself. -## Using Dashboards +## Permissions -- [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing "Managing Your Dashboard") -- [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups "Assigning a Dashboard to a User Group") -- [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget "Creating a Dashboard Widget") -- [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types "Dashboard Widget Types") +The Dashboards page and all the actions on the widgets require the permission `dashboards`. The Dashboard itself is shown to any user who is allowed into the manager. ## See Also -1. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) -2. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) -3. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) +1. [Dashboards](building-sites/client-proofing/dashboards) +2. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) +3. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) +4. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) \ No newline at end of file + 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/en/building-sites/client-proofing/dashboards/managing.md b/en/building-sites/client-proofing/dashboards/managing.md index 8fac46002..89f53a939 100644 --- a/en/building-sites/client-proofing/dashboards/managing.md +++ b/en/building-sites/client-proofing/dashboards/managing.md @@ -1,37 +1,51 @@ --- title: "Managing Your Dashboard" -_old_id: "196" -_old_uri: "2.x/administering-your-site/dashboards/managing-your-dashboard" +description: "Edit a Dashboard in MODX: assign and arrange the widgets, create a Dashboard of your own, and keep the template of a customizable Dashboard in order." --- -This article describes how to edit a Dashboard, including on how to assign and arrange Widgets for that Dashboard. +## Editing a Dashboard -## Editing Your Dashboard +Go to the main Dashboards page, which you find in the top menu under **Admin → Dashboards**. The first tab holds a grid of the Dashboards, most likely only the "Default" one. Right-click the row and choose **Edit**. This loads the editing page of the Dashboard. -Go to the main Dashboards page, which can be found in the top menu via "Dashboard" -> "Dashboards". Once loaded, you'll notice a grid in the first tab that holds (most likely) one dashboard, the "Default" dashboard. Right-click the row, and click "Update Dashboard". This will load the editing page for the Dashboard. - -You will see a name and description field, and below, a grid of Widgets assigned to the dashboard. You can drag the widgets around to rearrange them, add widgets by clicking the "Place Widget" button, or remove widgets by right-clicking on a widget: +You see a name and a description field, and below them a grid of the widgets of the Dashboard. You can drag the widgets to rearrange them, add widgets with the **Place Widget** button, or remove them with the right mouse button: ![](dashboard-edit.png) +The name and the description of the "Default" Dashboard cannot be changed. It is the Dashboard every user gets when no group assigns another one. + +## Creating and Removing a Dashboard + +The page has a **Create** button, which makes a Dashboard of your own. The context menu of a Dashboard has **Duplicate** and **Delete** next to **Edit**. Duplicating a Dashboard copies its widgets and their placement; the copy is yours to change. + +The "Default" Dashboard cannot be deleted. When a Dashboard is deleted, the groups that were assigned to it fall back to the "Default" one. + +The grid of Dashboards can be filtered by a user group, which is the quickest way to find the Dashboard a certain group works with. + ## Template vs Personal Changes -Changes made on this page update the dashboard **template**. For [customizable dashboards](building-sites/client-proofing/dashboards "Dashboards"), template changes are propagated to all users who have a personal copy of that dashboard: +Changes made on this page update the Dashboard **template**. For [customizable Dashboards](building-sites/client-proofing/dashboards "Dashboards"), template changes are propagated to all users who have a personal copy of that Dashboard: - When you **add a widget** here, it will appear on the dashboard for all existing users of that dashboard. - When you **remove a widget** here, it will be removed from all users' personal dashboards. -This is different from changes made directly on the dashboard page itself (for example, using the close button on a widget or adding a widget from the dashboard view). Those changes only affect the currently logged-in user. +This is different from changes made directly on the dashboard page itself. Using the close button on a widget or adding a widget from the dashboard view affects only the currently logged-in user. If you want to enforce a widget change across all users, make it from this management page. If you only want to adjust your own dashboard, make the change directly on the dashboard page instead. +A widget that is added to the template arrives at the existing users with the default size and at the end of the list. + +## Permissions + +Every action on this page requires the permission `dashboards`. + ## See Also -1. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) -2. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) -3. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) +1. [Dashboards](building-sites/client-proofing/dashboards) +2. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) +3. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) +4. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) \ No newline at end of file + 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/en/building-sites/client-proofing/dashboards/usergroups.md b/en/building-sites/client-proofing/dashboards/usergroups.md index 3546760e8..556e39753 100644 --- a/en/building-sites/client-proofing/dashboards/usergroups.md +++ b/en/building-sites/client-proofing/dashboards/usergroups.md @@ -1,29 +1,29 @@ --- title: "Assigning to a User Group" -_old_id: "25" -_old_uri: "2.x/administering-your-site/dashboards/assigning-a-dashboard-to-a-user-group" +description: "Assign a Dashboard to a User Group in MODX, and how the personal copy of a customizable Dashboard is made for the members of the group." --- -This article describes how to assign a Dashboard to a User Group. +Find the User Group you want to assign the Dashboard to, and edit it. The tree of the User Groups is on the page **Access → ACLs**: right-click the group in the tree and choose **Edit User Group**. -First off, find the User Group that you would like to assign the Dashboard to, and edit it. You can do so by "Menu" -> "Access Controls", then right-clicking on the group in the User Groups tree, and clicking "Update User Group". - -From there, you can simply click on the "Dashboard" dropdown, and select the Dashboard you want to assign to this User Group. All users in this group that have this group as their Primary Group will load that Dashboard instead of the Default now. +From there, click the "Dashboard" dropdown and select the Dashboard you want to assign to this User Group. All users in this group that have this group as their Primary Group will load that Dashboard instead of the Default now. ![](dashboard-assign.png) +The Dashboard is assigned in the form of the group. There is no screen that assigns a Dashboard to groups in the other direction. + ## Customizable Dashboards and User Groups -If the assigned dashboard has the **Customizable** setting checked, MODX creates a personal copy of the dashboard's widget layout for each user the first time they log in. Users can then rearrange, add, or remove widgets on their own copy without affecting other group members. +If the assigned dashboard has the **Customizable** setting checked, MODX creates a personal copy of the widget layout for each user on first login. Users can then rearrange, add, or remove widgets on their own copy without affecting other group members. -When an administrator later updates the dashboard template (by adding or removing widgets through the Dashboards manager page), those changes are applied to all existing users' personal dashboards. See [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing "Managing Your Dashboard") for more on how template changes propagate. +When an administrator later updates the dashboard template, those changes are applied to all existing users' personal dashboards. The template is edited through the Dashboards manager page. See [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing "Managing Your Dashboard") for more on how template changes propagate. ## See Also -1. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) -2. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) -3. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) +1. [Dashboards](building-sites/client-proofing/dashboards) +2. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) +3. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) +4. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) diff --git a/en/building-sites/client-proofing/dashboards/widget-types/file.md b/en/building-sites/client-proofing/dashboards/widget-types/file.md index c869bb774..fea556a44 100644 --- a/en/building-sites/client-proofing/dashboards/widget-types/file.md +++ b/en/building-sites/client-proofing/dashboards/widget-types/file.md @@ -1,13 +1,15 @@ --- title: "File" +description: "The File Dashboard Widget of MODX: the ways a file can return the content of a widget, and the variables it has available." _old_id: "85" _old_uri: "2.x/administering-your-site/dashboards/dashboard-widget-types/dashboard-widget-type-file" --- -The File Dashboard Widget Type runs a file on the filesystem, which can either: +The File Dashboard Widget Type runs a file on the filesystem. The file can return the content of the widget in three ways: -- Return the output of the file, rendering it in the content pane of the widget -- Return the name of a class that extends modDashboardWidgetInterface, a MODX-provided abstract class, that has a render() method that will return the output to render to the content pane of the widget +- Return the output of the file, which is rendered in the content pane of the widget. +- Print the output of the file and return nothing. +- Return the name of a class that extends `modDashboardWidgetInterface`, the abstract class that MODX provides for widgets. The class has a `render()` method that returns the output. ## Usage @@ -19,20 +21,34 @@ Simply place the name of the file in the content textarea of the widget. You can - `[[++assets_path]]` - `[[++manager_theme]]` +**Use an absolute path** +A relative path is resolved against the working directory of the PHP process, not against the root of MODX. It does not survive a move of the installation. Build the path from `[[++manager_path]]` and the like. + ### Returning the Output -There are two methods in your external file to return the content of the widget. The first is simply returning the output, like so: +The first way to return the content of the widget is to return the output, like so: ``` php Hello, World! Version: 1.0 diff --git a/en/building-sites/client-proofing/dashboards/widget-types/html.md b/en/building-sites/client-proofing/dashboards/widget-types/html.md index 2bb86a165..e3e191a6f 100644 --- a/en/building-sites/client-proofing/dashboards/widget-types/html.md +++ b/en/building-sites/client-proofing/dashboards/widget-types/html.md @@ -1,5 +1,6 @@ --- title: "HTML" +description: "The HTML dashboard widget of MODX: straight HTML in the content of the widget." _old_id: "86" _old_uri: "2.x/administering-your-site/dashboards/dashboard-widget-types/dashboard-widget-type-html" --- @@ -22,7 +23,7 @@ To output the username of the logged-in user. You can also call Snippets, like s [[MyDashboardSnippet]] ``` -Note that in snippets there is no "active resource", so snippets referencing `$modx->resource` will have issues. +Note that on the Dashboard there is no active resource, so a snippet that references `$modx->resource` will have issues. ## See Also diff --git a/en/building-sites/client-proofing/dashboards/widget-types/index.md b/en/building-sites/client-proofing/dashboards/widget-types/index.md index c2d74034a..d046840ee 100644 --- a/en/building-sites/client-proofing/dashboards/widget-types/index.md +++ b/en/building-sites/client-proofing/dashboards/widget-types/index.md @@ -1,23 +1,20 @@ --- title: "Widget Types" -_old_id: "89" -_old_uri: "2.x/administering-your-site/dashboards/dashboard-widget-types" +description: "The types of Dashboard Widget in MODX and the value each of them is stored with." --- -This article lists the different types of Dashboard Widgets that are available. +A Dashboard Widget holds its content in one of four types. The type is stored with the widget, and the value matters when you write the widget yourself. + +| Type | What it does | Stored value | +| --- | --- | --- | +| [File](building-sites/client-proofing/dashboards/widget-types/file "Dashboard Widget Type - File") | Runs a file from the filesystem. | `file` | +| [Snippet](building-sites/client-proofing/dashboards/widget-types/snippet "Dashboard Widget Type - Snippet") | Runs a MODX Snippet. | `snippet` | +| [HTML](building-sites/client-proofing/dashboards/widget-types/html "Dashboard Widget Type - HTML") | Shows straight HTML. | `html` | +| [Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php "Dashboard Widget Type - Inline PHP") | Runs PHP code, like a Snippet. | `php` | + +## See Also 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) - -## See Also - -1. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing) -2. [Assigning a Dashboard to a User Group](building-sites/client-proofing/dashboards/usergroups) -3. [Creating a Dashboard Widget](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Dashboard Widget Types](building-sites/client-proofing/dashboards/widget-types) - 1. [Dashboard Widget Type - File](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Dashboard Widget Type - HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Dashboard Widget Type - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Dashboard Widget Type - Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/en/building-sites/client-proofing/dashboards/widget-types/inline-php.md b/en/building-sites/client-proofing/dashboards/widget-types/inline-php.md index 89ec33bd6..d57e3b81b 100644 --- a/en/building-sites/client-proofing/dashboards/widget-types/inline-php.md +++ b/en/building-sites/client-proofing/dashboards/widget-types/inline-php.md @@ -1,27 +1,28 @@ --- title: "Inline PHP" +description: "The Inline PHP Dashboard Widget of MODX: PHP code that runs like a Snippet, and the rules it has to follow." _old_id: "87" _old_uri: "2.x/administering-your-site/dashboards/dashboard-widget-types/dashboard-widget-type-inline-php" --- - The Inline PHP widget acts very similar to the [Snippet Widget](building-sites/client-proofing/dashboards/widget-types/snippet "Dashboard Widget Type - Snippet"), except it runs the content of the widget as if it were a Snippet. +The Inline PHP widget runs the content of the widget as if it were a [Snippet Widget](building-sites/client-proofing/dashboards/widget-types/snippet "Dashboard Widget Type - Snippet"). The difference is the code: PHP instead of a call to a Snippet. ## Usage - Simply place your PHP code in the content panel, and return the output of your widget. +Simply place your PHP code in the content panel, and return the output of your widget. - For example, this will display "Hello, World!": +For example, this will display "Hello, World!": ``` php resource` in your widget, as there is no active resource for the dashboard -- Do not put a closing PHP tag at the end of your code! For some reason, it gets parsed incorrectly (as of MODX 2.2.8) +- Use `return`, not `echo`. What you print goes into the output of the page, not into the content of the widget. +- Do not use `$modx->resource` in your widget, as there is no active resource on the Dashboard. +- The tags `` are cut off before the code runs, so a closing tag is not needed. ## See Also diff --git a/en/building-sites/client-proofing/dashboards/widget-types/snippet.md b/en/building-sites/client-proofing/dashboards/widget-types/snippet.md index 94a8a8078..d432182da 100644 --- a/en/building-sites/client-proofing/dashboards/widget-types/snippet.md +++ b/en/building-sites/client-proofing/dashboards/widget-types/snippet.md @@ -1,5 +1,6 @@ --- title: "Snippet" +description: "The Snippet dashboard widget of MODX: a snippet that returns the content of the widget." _old_id: "88" _old_uri: "2.x/administering-your-site/dashboards/dashboard-widget-types/dashboard-widget-type-snippet" --- diff --git a/en/building-sites/client-proofing/form-customization/index.md b/en/building-sites/client-proofing/form-customization/index.md index 7d04de557..5f19de861 100644 --- a/en/building-sites/client-proofing/form-customization/index.md +++ b/en/building-sites/client-proofing/form-customization/index.md @@ -1,39 +1,47 @@ --- title: "Customizing the Manager" +description: "Form Customization in MODX: the profiles, the sets and the rules that change the forms of the manager." _old_id: "83" _old_uri: "2.x/administering-your-site/customizing-the-manager" --- ## What is Form Customization? - Form Customization is a feature that allows users to create Rules, which govern how manager pages render their forms in the MODX Revolution Manager. +Form Customization lets you change the forms of the manager: hide a field, rename it, give it another value, move a TV to another tab. -## How Does it Work? +The section is under **Admin → Form Customization**, and it needs the permission `customize_forms`. - Currently, Form Customization has 3 layers: +## The Three Layers -> Profile -> Sets -> Rules +> Profile → Set → Rules - A Profile is a collection of Sets, and Sets are collections of Rules. Profiles can be restricted to specific User Groups. +A **Profile** is a collection of Sets, and it can be bound to User Groups. A **Set** is a collection of Rules, and it is bound to a page of the manager. A **Rule** is one change that the Set applies to the form. - A Set is a collection of Rules, and is tied to a certain view. Normally, you would have a Set for the Resource/Create page, and a Set for the Resource/Update page. Sets can also be tied to specific [Templates](building-sites/elements/templates "Templates") (meaning they load only when the Resource is using that Template). They can also have a 'Constraint' set, which limits the Set's execution to the restriction made in the Constraint. +The rules are not edited on their own: they are rebuilt from the three grids of the set every time the set is saved. See [Form Customization Rules](building-sites/client-proofing/form-customization/rules "Form Customization Rules"). - A Rule is all the variations applied in a Set. Rules are hidden from view in MODX Revolution, but are instead shown as fields on the Set Editing page. +## How It Is Stored - More information about each of the parts of Form Customization can be found in each part's respective page: +A profile holds sets, and a set holds its rules. The list of the fields and of the regions that can be changed is kept in a reference table. It is filled in when MODX is installed. -1. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) -2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) - 1. [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs) -3. [Manager Templates and Themes](building-sites/client-proofing/custom-manager-themes) +## Which Forms Can Be Customized -### What Forms can I Customize? +Only the pages of a resource: **Create Resource** and **Edit Resource**. The page of a chunk, a snippet, a user or a user group is not covered. - The Resource Create and Update pages can be customized at this time in Form Customization. +A set is bound to one of three actions: + +| Action | The set applies to | +| --- | --- | +| Create Resource | The page that creates a resource. | +| Edit Resource | The page that edits a resource. | +| Create & Edit Resource | Both pages at once. | + +With the last one the set covers both pages. The list of the fields and of the regions it offers comes from the page that edits a resource. ## See Also -1. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) -2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) - 1. [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs) -3. [Manager Templates and Themes](building-sites/client-proofing/custom-manager-themes) +1. [Customizing the Manager](building-sites/client-proofing/form-customization) +2. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) +3. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) + 1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) + 2. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) +4. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) diff --git a/en/building-sites/client-proofing/form-customization/profiles.md b/en/building-sites/client-proofing/form-customization/profiles.md index 3cd33bfd8..73db22244 100644 --- a/en/building-sites/client-proofing/form-customization/profiles.md +++ b/en/building-sites/client-proofing/form-customization/profiles.md @@ -1,18 +1,24 @@ --- title: "Profiles" +description: "A Form Customization profile in MODX: a collection of sets, bound to the user groups that get them." _old_id: "132" _old_uri: "2.x/administering-your-site/customizing-the-manager/form-customization-profiles" --- ## What is a Form Customization Profile? -A Profile is a collection of [Form Customization Sets](building-sites/client-proofing/form-customization/sets "Form Customization Sets"). A Profile can be restricted to only load for specific User Groups. If no User Groups are assigned, the Profile will be run for all Users. +A Profile is a collection of [Form Customization Sets](building-sites/client-proofing/form-customization/sets "Form Customization Sets"). A Profile can be restricted to load for specific User Groups. If no User Groups are assigned, the Profile runs for all Users. -It can also be marked 'inactive', which will disable its execution. +A Profile can also be marked 'inactive', which disables its execution. + +**Only the primary group of a user is matched** +By default, a profile is matched against the primary group of the user. A profile that is bound to a secondary group has no effect until the setting `form_customization_use_all_groups` is turned on. ## See Also -1. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) -2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) - 1. [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs) -3. [Manager Templates and Themes](building-sites/client-proofing/custom-manager-themes) +1. [Customizing the Manager](building-sites/client-proofing/form-customization) +2. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) +3. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) + 1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) + 2. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) +4. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) diff --git a/en/building-sites/client-proofing/form-customization/rules/field-default.md b/en/building-sites/client-proofing/form-customization/rules/field-default.md index 587caf9e5..a85b670eb 100644 --- a/en/building-sites/client-proofing/form-customization/rules/field-default.md +++ b/en/building-sites/client-proofing/form-customization/rules/field-default.md @@ -1,23 +1,26 @@ --- title: "Field Default" +description: "The Field Default rule of a Form Customization set in MODX: how it puts a value into a field of the form." _old_id: "122" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/field-default" --- -## The Field Default Rule +## What the Rule Does -The Field Default Rule, when set, will automatically set the default value of a field. +Puts a value into a field of the form of the manager. The value appears when the form opens, and it is the value the field gets if the user saves the form without changing it. -This will only work on "create" pages, **not** "update" pages. +The rule is applied on the page the set is bound to: the page that creates a resource, or the page that edits one. To have it only on the page that creates a resource, bind the set to the action **Create Resource** instead of **Create & Edit Resource**. -## Examples +## Where It Is Set -An example Rule of setting the default Category for a [Snippet](extending-modx/snippets "Snippets") for all [Users](building-sites/client-proofing/security/users "Users") in the User Group HR Department would look like this: +The **Fields** tab of the set, in the **Default Value** column. A field with a value gets the rule; an empty cell removes it. -![](fc-fielddefault1.png) +## The Template of a New Resource + +On the field `template` the rule sets the template that a new resource gets. The field is only offered when the set is bound to the action **Create Resource**. ## See Also -``` php - [[getResources@section? &parents=`122` &context=`revolution`]] - ``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/field-label.md b/en/building-sites/client-proofing/form-customization/rules/field-label.md index 0af08573e..ac3a92a59 100644 --- a/en/building-sites/client-proofing/form-customization/rules/field-label.md +++ b/en/building-sites/client-proofing/form-customization/rules/field-label.md @@ -1,21 +1,20 @@ --- title: "Field Label" +description: "The Field Label rule of a Form Customization set in MODX: how it renames a field of the form." _old_id: "123" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/field-label" --- -## The Field Label Rule +## What the Rule Does -The Field Label Rule, when set, will change a Label of a field to any text value. +Replaces the label of a field of the form with a text of your own. The field itself keeps its name and its value; only the text next to it changes. -## Examples +## Where It Is Set -An example Rule of changing the introtext's label to "Comments" for the [Users](building-sites/client-proofing/security/users "Users") in the [User Group](building-sites/client-proofing/security/user-groups "User Groups") "Marketing" would look like this: - -![](fc-fieldlabel.png) +The **Fields** tab of the set, in the **Label** column. A field with a label of its own gets the rule; an empty cell keeps the standard label of the field. ## See Also -``` php -[[getResources@section? &parents=`123` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/field-visible.md b/en/building-sites/client-proofing/form-customization/rules/field-visible.md index 65e7c85ce..49bc0621e 100644 --- a/en/building-sites/client-proofing/form-customization/rules/field-visible.md +++ b/en/building-sites/client-proofing/form-customization/rules/field-visible.md @@ -1,21 +1,28 @@ --- title: "Field Visible" +description: "The Field Visible rule of a Form Customization set in MODX: how it hides a field of the form." _old_id: "124" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/field-visible" --- -## The Field Visible Rule +## What the Rule Does -The Field Visible Rule, when set, will declare a field "visible" or not to a user. +Hides a field of the form of the manager. The field is not drawn at all, and the value of the resource in it is left alone. -## Examples +## Where It Is Set -An example Rule of hiding the introtext field from the [Users](building-sites/client-proofing/security/users "Users") in the [User Group](building-sites/client-proofing/security/user-groups "User Groups") "HR Department" would look like this: +The **Fields** tab of the set, in the **Visible** column. Clearing the checkbox of a field creates the rule; ticking it back removes the rule. -![](fc-fieldvisible.png) +## What It Applies To + +The fields of the form of the resource: + +`id`, `pagetitle`, `alias`, `longtitle`, `description`, `introtext`, `content`, `published`, `deleted`, `publishedon`, `pub_date`, `unpub_date`, `template`, `hidemenu`, `menutitle`, `link_attributes`, `menuindex`, `class_key`, `content_type`, `parent`, `content_dispo`, `isfolder`, `show_in_tree`, `hide_children_in_tree`, `alias_visible`, `uri_override`, `uri`, `richtext`, `cacheable`, `searchable`, `syncsite`. + +The list of the fields is stored in the reference table of the form, and it is filled in when MODX is installed. A database that was upgraded from 2.x may have a shorter list. ## See Also -``` php -[[getResources@section? &parents=`124` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/index.md b/en/building-sites/client-proofing/form-customization/rules/index.md index 3109c0d36..f2308e6e7 100644 --- a/en/building-sites/client-proofing/form-customization/rules/index.md +++ b/en/building-sites/client-proofing/form-customization/rules/index.md @@ -1,17 +1,51 @@ --- title: "Form Customization Rules" +description: "The ten rules of a Form Customization set in MODX: what each of them does and in which grid of the set it is set." _old_id: "133" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules" --- -## What is a Rule? +## What the Rules Are -Rules in MODX Revolution are simply generic rules that apply to any Action (manager page). They also can be tied to User Groups, wherein a Rule will only be applied if the User is part of that User Group. +The rules are the changes a set applies to the form of the manager. There are ten of them, and each of them is set in one of the three grids of the set. -## What are the Rules available? +| Rule | What it does | Where it is set | +| --- | --- | --- | +| [Field Visible](building-sites/client-proofing/form-customization/rules/field-visible "Field Visible") | Hides a field of the form. | Fields, **Visible** | +| [Field Label](building-sites/client-proofing/form-customization/rules/field-label "Field Label") | Renames a field of the form. | Fields, **Label** | +| [Field Default](building-sites/client-proofing/form-customization/rules/field-default "Field Default") | Puts a value into a field of the form. | Fields, **Default Value** | +| [Tab Visible](building-sites/client-proofing/form-customization/rules/tab-visible "Tab Visible") | Hides a region of the form. | Regions, **Visible** | +| [Tab Title](building-sites/client-proofing/form-customization/rules/tab-title "Tab Title") | Renames a region of the form. | Regions, **Title** | +| [New Tab](building-sites/client-proofing/form-customization/rules/new-tab "New Tab") | Adds a region of its own to the form. | Regions, **Create** | +| [TV Visible](building-sites/client-proofing/form-customization/rules/tv-visible "TV Visible") | Hides a TV of the form. | Template Variables, **Visible** | +| [TV Title](building-sites/client-proofing/form-customization/rules/tv-title "TV Title") | Renames a TV of the form. | Template Variables, **Label** | +| [TV Default](building-sites/client-proofing/form-customization/rules/tv-default "TV Default") | Sets the default value of a TV. | Template Variables, **Default Value** | +| [Move TV to Tab](building-sites/client-proofing/form-customization/rules/move-tv-to-tab "Move TV to Tab") | Moves a TV into another region. | Template Variables, **Region** | -The available Rules are: +## The Rules Are Not Edited Directly -``` php -[[getResources@section? &parents=`133` &context=`revolution`]] -``` +There is no grid of rules in MODX 3. The rules are rebuilt from the three grids of the set every time the set is saved. What you change is the grid, not the rule. + +The three grids live on the tabs of the set: + +- **Set Information and Fields** — the set itself and the fields of the form; +- **Regions** — the regions of the form; +- **Template Variables** — the TVs of the template of the set. + +## The Order of the Rules + +The rules are applied in a fixed order, so that one rule never undoes another: + +1. the default value of a field; +2. the new region, then the visibility and the title of the regions; +3. the label and the visibility of the fields; +4. the default value, the label and the visibility of the TVs; +5. the move of a TV into another region. + +The move comes last on purpose: a TV can be moved into a region that the same set has just created. + +## See Also + +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md b/en/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md index 65d08c0d5..06616eb02 100644 --- a/en/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md +++ b/en/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md @@ -1,34 +1,25 @@ --- title: "Move TV to Tab" +description: "The Move TV to Tab rule of a Form Customization set in MODX: how it moves a template variable into another region." _old_id: "1353" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/move-tv-to-tab" --- -## The Move TV to Tab Rule +## What the Rule Does -The Move TV to Tab rule will move any TV to the tab you specify. +Moves a TV of the form of the manager into another region. The TV is drawn in that region instead of the one it belonged to. -## Usage +## Where It Is Set -Specify the ID of the tab to move to in the "name" field of the Rule. Then specify the TV's ID prefixed with 'tv' in the "value" field. +The **Template Variables** tab of the set, in the **Region** column. Put the id of the region you want the TV moved into. -The list of available tabs is: +**The id is not checked** +Whatever you type into the cell is taken as it is. A typo does nothing, and there is no message about it. Take the id from the list of the regions on [Customizing Tabs](building-sites/client-proofing/form-customization/tabs "Customizing Tabs"). The **Region (ID)** column of the **Regions** tab of the same set has them as well. -| ID | Description | -| ---------------------- | ------------------------------------------- | -| modx-resource-settings | The first tab, or Create/Edit resource tab. | -| modx-page-settings | The second tab, or Page Settings tab. | - -You can also create a tab with the [New Tab](building-sites/client-proofing/form-customization/rules/new-tab "New Tab") rule and move a TV there. - -## Examples - -An example rule for moving the TV 1 to the first tab in the Resource create page would look like so: - -![](rule-tvmove.png) +The **Region Rank** column next to it sets the order of the variables inside the region. ## See Also -``` php -[[getResources@section? &parents=`1353` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/new-tab.md b/en/building-sites/client-proofing/form-customization/rules/new-tab.md index ec75c775f..3c21b3ef4 100644 --- a/en/building-sites/client-proofing/form-customization/rules/new-tab.md +++ b/en/building-sites/client-proofing/form-customization/rules/new-tab.md @@ -1,44 +1,29 @@ --- title: "New Tab" +description: "The New Tab rule of a Form Customization set in MODX: how it adds a region of your own to the form." _old_id: "209" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/new-tab" --- - The following is relevant to older versions of MODX. See [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs#CustomizingTabsviaFormCustomization-AddingNewTabs) for instructions for newer versions of MODX. +## What the Rule Does -## The New Tab Rule +Adds a region of your own to the form of the manager. The region appears in the form as a tab of its own, next to the regions of the form of the resource. - The New Tab Rule, when set, will create a new tab in the panel. +## Where It Is Set -## Usage +The **Regions** tab of the set. Press **Create** to add a row to the grid, and fill in two fields: -- Specify the ID of this new tab in the "Name" field. -- Specify the tabpanel ID in the "Containing Panel" field -- Set the Rule to "New Tab" -- Set the title of the new tab in the "Value" field +- **Region (ID)** — the id of the region, for example `my-new-tab`. The id has to be unique within the set, and it is what you refer to when you move a TV into the region. +- **Title** — the text on the tab. -### Available TabPanels +The row can be deleted again with the **Delete** item of its context menu. Only a region that was created this way can be deleted; the regions of the form itself cannot. - Here are the IDs for the corresponding tab panels on various manager pages. +## Where the Region Appears -| ID | Corresponding Page | -| ------------------- | ------------------------------ | -| modx-resource-tabs | The Resource edit/create page. | -| modx-chunk-tabs | The Chunk page. | -| modx-snippet-tabs | The Snippet page. | -| modx-plugin-tabs | The Plugin page. | -| modx-template-tabs | The Template page. | -| modx-tv-tabs | The Template Variable page. | -| modx-user-tabs | The User page. | -| modx-usergroup-tabs | The User Group page. | -| modx-context-tabs | The Context page. | - - Tab Panels on non-Resource pages are only available in 2.0.0-pl and up. - -## Examples - - An example rule for creating a new tab in the Resource edit page would look like so: - - ![](rule-tabnew.png) +A region of your own is added to the form of the resource. It cannot be added to the form of another element. Form Customization does not cover the page of a chunk, a snippet, a user or a user group. ## See Also + +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/tab-title.md b/en/building-sites/client-proofing/form-customization/rules/tab-title.md index 32f7860a7..0549e32c2 100644 --- a/en/building-sites/client-proofing/form-customization/rules/tab-title.md +++ b/en/building-sites/client-proofing/form-customization/rules/tab-title.md @@ -1,32 +1,22 @@ --- title: "Tab Title" +description: "The Tab Title rule of a Form Customization set in MODX: how it renames a region of the form." _old_id: "300" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/tab-title" --- -## The Tab Title Rule +## What the Rule Does -The Tab Title Rule will change the title of any Tab. +Replaces the title of a region of the form with a text of your own. The region keeps its place in the form; only the text on its tab changes. -## Usage +## Where It Is Set -The values for the Rule should be as follows: +The **Regions** tab of the set, in the **Title** column. A region with a title of its own gets the rule; an empty cell keeps the standard title. -- **Name**: The ID of the tab to change. -- **Containing Panel**: The ID of the tabpanel to change. -- **Rule**: Tab Title -- **Value**: The new text to change the tab title to. - -For a list of tabs available for each page, see [Form Customization Pages](building-sites/client-proofing/form-customization "Form Customization Pages"). - -## Examples - -An example Rule of changing the title for the Page Settings tab for all [Users](building-sites/client-proofing/security/users "Users") to "Custom Fields" would look like this: - -![](fc-tabtitle.png) +The regions of the form always belong to the panel of the resource. A region of your own, created with the [New Tab](building-sites/client-proofing/form-customization/rules/new-tab "New Tab") rule, gets its title from the same column. ## See Also -``` php -[[getResources@section? &parents=`300` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/tab-visible.md b/en/building-sites/client-proofing/form-customization/rules/tab-visible.md index 5d22ca9d4..90056094d 100644 --- a/en/building-sites/client-proofing/form-customization/rules/tab-visible.md +++ b/en/building-sites/client-proofing/form-customization/rules/tab-visible.md @@ -1,21 +1,20 @@ --- title: "Tab Visible" +description: "The Tab Visible rule of a Form Customization set in MODX: how it hides a region of the form." _old_id: "301" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/tab-visible" --- -## The Tab Visible Rule +## What the Rule Does -The Tab Visible Rule, if set to 0, will hide a tab from a User. +Hides a region of the form of the manager. A region is a whole tab of the form or a part of one; the list of the regions is on [Customizing Tabs](building-sites/client-proofing/form-customization/tabs "Customizing Tabs"). -## Examples +## Where It Is Set -An example Rule of hiding the Page Settings tab for all [Users](building-sites/client-proofing/security/users "Users") would look like this: - -![](fc-tabvisible.png) +The **Regions** tab of the set, in the **Visible** column. Clearing the checkbox of a region creates the rule; ticking it back removes the rule. ## See Also -``` php -[[getResources@section? &parents=`301` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/tv-default.md b/en/building-sites/client-proofing/form-customization/rules/tv-default.md index e78b385c8..c157f7b17 100644 --- a/en/building-sites/client-proofing/form-customization/rules/tv-default.md +++ b/en/building-sites/client-proofing/form-customization/rules/tv-default.md @@ -1,32 +1,25 @@ --- title: "TV Default" +description: "The TV Default rule of a Form Customization set in MODX: how it sets the default value of a template variable." _old_id: "313" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/tv-default" --- -## The TV Default Value Rule +## What the Rule Does -The TV Default Value Rule, if set, will set the default value for a TV. +Sets the default value of a TV of the form of the manager. The value appears when the form opens. -This only works on "create" Actions, **not** "update" Actions. +The rule is applied on the page the set is bound to: the page that creates a resource, or the page that edits one. To have it only on the page that creates a resource, bind the set to the action **Create Resource** instead of **Create & Edit Resource**. -## Usage +## Where It Is Set -The values for the Rule should be as follows: +The **Template Variables** tab of the set, in the **Default Value** column. -- **Name**: The ID of the TV prefixed with 'tv'; for example, for the TV with ID 23, 'tv23' -- **Containing Panel**: 'modx-panel-resource' -- **Rule**: 'TV Default Value' -- **Value**: The value you want to set as the default. - -## Examples - -An example Rule of setting the default value for a TV with ID 23 to "test" is: - -![](fc-tvdefault.png) +**An empty cell zeroes the default value** +A cell that is cleared does not restore the default value of the variable: it sets an empty default. To get the original value back, type it into the cell yourself. ## See Also -``` php -[[getResources@section? &parents=`313` &context=`revolution`]] -``` \ No newline at end of file +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/tv-title.md b/en/building-sites/client-proofing/form-customization/rules/tv-title.md index aed30690b..7db03f11e 100644 --- a/en/building-sites/client-proofing/form-customization/rules/tv-title.md +++ b/en/building-sites/client-proofing/form-customization/rules/tv-title.md @@ -1,21 +1,20 @@ --- title: "TV Title" +description: "The TV Title rule of a Form Customization set in MODX: how it renames a template variable of the form." _old_id: "314" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/tv-title" --- -## The TV Title Rule +## What the Rule Does -The TV Title Rule will change the title of a TV. +Replaces the label of a TV of the form with a text of your own. The TV keeps its name and its value; only the text next to it changes. -## Examples +## Where It Is Set -An example Rule of setting the label to "Boo!" for a TV with ID of 1 for all [Users](building-sites/client-proofing/security/users "Users") would look like this: - -![](rule-tvlabel.png) +The **Template Variables** tab of the set, in the **Label** column. A TV with a label of its own gets the rule; an empty cell keeps the standard label. ## See Also -``` php -[[getResources@section? &parents=`314` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/rules/tv-visible.md b/en/building-sites/client-proofing/form-customization/rules/tv-visible.md index c0a9604ec..c81558dea 100644 --- a/en/building-sites/client-proofing/form-customization/rules/tv-visible.md +++ b/en/building-sites/client-proofing/form-customization/rules/tv-visible.md @@ -1,21 +1,20 @@ --- title: "TV Visible" +description: "The TV Visible rule of a Form Customization set in MODX: how it hides a template variable of the form." _old_id: "315" _old_uri: "2.x/administering-your-site/form-customization/form-customization-rules/tv-visible" --- -## The TV Visible Rule +## What the Rule Does -The TV Visible Rule, if set to 0, will hide a TV from a User. +Hides a TV of the form of the manager. The TV is not merely hidden: its type becomes `hidden`, so it is not drawn and cannot be filled in. -## Examples +## Where It Is Set -An example Rule of hiding the a TV with ID of 1 for all [Users](building-sites/client-proofing/security/users "Users") would look like this: - -![](rule-tvvisible.png) +The **Template Variables** tab of the set, in the **Visible** column. Clearing the checkbox of a TV creates the rule; ticking it back removes the rule. ## See Also -``` php -[[getResources@section? &parents=`315` &context=`revolution`]] -``` +1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) +2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) +3. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) diff --git a/en/building-sites/client-proofing/form-customization/sets.md b/en/building-sites/client-proofing/form-customization/sets.md index 9d781fb12..f534b358b 100644 --- a/en/building-sites/client-proofing/form-customization/sets.md +++ b/en/building-sites/client-proofing/form-customization/sets.md @@ -1,44 +1,57 @@ --- title: "Sets" +description: "A Form Customization set in MODX: the page it applies to, the template and the condition it is restricted by, and the three grids of rules it holds." _old_id: "134" _old_uri: "2.x/administering-your-site/customizing-the-manager/form-customization-sets" --- ## What is a Form Customization Set -A Form Customization Set is a collection of Rules that occur for a specific page (action) in the Manager. Currently, Sets can apply to either the Resource Create or Update pages. Think of them like a way of collecting all your "Whenever the Create Resource page loads, all these fields change." rules. Sets can also be marked 'inactive' to not load. +A Form Customization Set is a collection of Rules that apply to a specific page (action) in the manager. Think of a set as a way of collecting all your "Whenever the Edit Resource page loads, all these fields change" rules. A set can also be marked 'inactive' so that it does not load. + +A set is bound to one of three actions: **Create Resource**, **Edit Resource** or **Create & Edit Resource**. See [Customizing the Manager](building-sites/client-proofing/form-customization "Customizing the Manager"). ### Restricting to a Template -You can select a Template that the Set is restricted to load to. If a Resource (or on Create Resource, the parent's template or "default\_template" setting) has this as its Template, this Set will run. Not setting a Template will assume that the Set should run for all Resources. +You can select a Template that the Set is restricted to. If a Resource has this Template, the Set runs. On Create Resource, the Template of the parent or the `default_template` setting is used. A Set without a Template runs for all Resources. -Also, setting a Template restricts the list of Template Variables that are shown to be editable to the Template Variables assigned to that Template. +Setting a Template also restricts the list of Template Variables that are shown to be editable to the Template Variables assigned to that Template. ### Using Constraints -A Constraint can be set on the Set to restrict to a certain value. For example, setting a Constraint to a field of 'parent' and value of '123' will apply this Set to all direct children of parent 123. A Constraint for field 'class\_key' and value 'modWebLink' will apply this Set to all WebLinks for the Set's page. +A Constraint restricts a Set to a certain value. For example, a Constraint of field `parent` and value `123` applies the Set to all direct children of the resource 123. A Constraint of field `class_key` and value `MODX\Revolution\modWebLink` applies the Set to all WebLinks on the page of the Set. + +Both parts of the constraint have to be filled in. Fill in only one of them and the set does not save. + +The value may be a comma-separated list. The rule then applies to any of the values in the list. + +The value is compared with the field of the resource as it is. The field `class_key` holds the full name of the class, with its namespace. ## Making Set Rules -Rules can be adjusted in a set by using the grids and tabs in the Set editing page. When you're done editing the fields, use the "Save" button on the top right to save the set. +Rules are adjusted in a set by using the grids on the Set editing page. The page has three tabs: **Set Information and Fields**, **Regions** and **Template Variables**. When you're done, use the "Save" button on the top right to save the set. + +Changing the template of a set reloads the page and rebuilds the list of the TVs for the new template. ### Adjusting Fields -Fields are found on the first tab in the Set editing page. You can change the visibility of a field, the Label given to the field, or its default value. (Note: default value changes only apply to 'Create' pages.) To revert back to the normal label or default value for a field, simply leave the field blank. +Fields are found on the **Set Information and Fields** tab of the Set editing page. You can change the visibility of a field, the Label given to the field, or its default value. To revert back to the normal label of a field, simply leave the field blank. -### Hiding or Renaming Tabs +The fields you can change are the fields of the form of the resource: `id`, `pagetitle`, `alias`, `longtitle`, `description`, `introtext`, `content`, `published`, `deleted`, `publishedon`, `pub_date`, `unpub_date`, `template`, `hidemenu`, `menutitle`, `link_attributes`, `menuindex`, `class_key`, `content_type`, `parent`, `content_dispo`, `isfolder`, `show_in_tree`, `hide_children_in_tree`, `alias_visible`, `uri_override`, `uri`, `richtext`, `cacheable`, `searchable`, `syncsite`. -Tabs are found in the 2nd tab in the Set editing page. You can change their visibility, as well as their title. You can also create new tabs to show up on the editing page. +### Hiding or Renaming Regions -When creating a new tab, you'll be presented with both ID and Title fields. The Title field is what will show as the text of the new tab; whereas the ID is what is used when moving TVs into the tab. +Regions are found on the **Regions** tab of the Set editing page. You can change their visibility, as well as their title. You can also create a new region to show up on the editing page. -See [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs "Customizing Tabs via Form Customization") for more information. +See [Customizing Tabs](building-sites/client-proofing/form-customization/tabs "Customizing Tabs") for more information. ### Adjusting Template Variables -TVs are found in the 3rd tab in the Set editing page. You can adjust their Label, default value, visibility, or what tab they reside on. +TVs are found on the **Template Variables** tab of the Set editing page. You can adjust their Label, default value, visibility, or what region they reside on. -If you want to change what Tab a TV resides on, simply change the tab field to the ID of the tab you want to move it to. The 'Tab Rank' column allows you to adjust the order in which the TV is put into the Tab with regard to other TVs being moved into that Tab. +To change what region a TV resides on, change the Region field to the id of the region you want to move it to. The 'Region Rank' column sets the order of the TV among the other TVs moved into that region. + +The rules are applied in a fixed order, and the move of a TV comes last. A TV can be moved into a region that the same set has just created. See [Form Customization Rules](building-sites/client-proofing/form-customization/rules "Form Customization Rules"). ## Editing Sets via XML @@ -46,9 +59,21 @@ Sets can be exported to XML files by right-clicking on a Set in the Profile's ed Importing a Set from XML will create a **new** Set, not override any existing ones. After you've imported the Set from XML, you may deactivate any older Sets. +**The rules of the TVs do not survive the import** +The importer writes the rules of a TV under the bare id of the variable. Everything that reads them looks for the id with the prefix `tv`. The rules of the TVs of an imported set have to be set again by hand in the grids of the set. + +## The API of the Section + +A package can work with the section through the actions of the connector. All of them need the permission `customize_forms`: + +- `Security/Forms/Profile/Activate`, `ActivateMultiple`, `Create`, `Deactivate`, `DeactivateMultiple`, `Duplicate`, `GetList`, `Remove`, `RemoveMultiple`, `Update`, `UpdateFromGrid`; +- `Security/Forms/Set/Activate`, `ActivateMultiple`, `Create`, `Deactivate`, `DeactivateMultiple`, `Duplicate`, `Export`, `GetList`, `Import`, `Remove`, `RemoveMultiple`, `Update`, `UpdateFromGrid`. + ## See Also -1. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) -2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) - 1. [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs) -3. [Manager Templates and Themes](building-sites/client-proofing/custom-manager-themes) +1. [Customizing the Manager](building-sites/client-proofing/form-customization) +2. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) +3. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) + 1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) + 2. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) +4. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) diff --git a/en/building-sites/client-proofing/form-customization/tabs.md b/en/building-sites/client-proofing/form-customization/tabs.md index fb9f7535b..bdc1ed4e1 100644 --- a/en/building-sites/client-proofing/form-customization/tabs.md +++ b/en/building-sites/client-proofing/form-customization/tabs.md @@ -1,42 +1,56 @@ --- title: "Customizing Tabs" +description: "The regions of the form of a resource in MODX that Form Customization can hide or rename, and how to add a region of your own." _old_id: "82" _old_uri: "2.x/administering-your-site/customizing-the-manager/form-customization-sets/customizing-tabs-via-form-customization" --- - When you use Form Customization to customize the forms in the MODX manager, you can either allow/disallow access to specific fields, or you can allow/disallow access to entire tabs or _parts_ of tabs. +Form Customization hides or renames whole tabs of the form of a resource, and parts of those tabs. - **When a Tab is not a Tab** - When setting up Form Customization rules under **Security --> Form Customization**, then editing a behavior set, there is a list of "Tabs", but the list doesn't correspond directly to the familiar "Document", "Settings", "Template Variables", and "Resource Groups". Rather, the tab ids listed here refer to entire tabs or _parts_ of tabs. +**When a Tab is not a Tab** +Setting up Form Customization under **Admin → Form Customization** and editing a set shows a list of "Regions". The list doesn't correspond directly to the familiar "Document", "Settings", "Template Variables", and "Resource Groups". The region ids listed here refer to entire tabs or _parts_ of tabs. ## Tab Regions - These are the various tab regions whose visibility can be toggled. - -| ID | Default Tab Title | Description | -| ---------------------------------- | ------------------ | ------------- | -| modx-resource-settings | Document | A primary tab | -| modx-resource-main-left | | | -| modx-resource-main-right | | | -| modx-page-settings | Settings | A primary tab | -| modx-page-settings-left | | | -| modx-page-settings-right | | | -| modx-page-settings-right-box-left | | | -| modx-page-settings-right-box-right | | | -| modx-panel-resource-tv | Template Variables | A primary tab | -| modx-resource-access-permissions | Resource Groups | A primary tab | +These are the various tab regions whose visibility can be toggled. + +| ID | Default Tab Title | Description | +| --- | --- | --- | +| modx-resource-settings | Document | A primary tab | +| modx-resource-main-left | | | +| modx-resource-content-above | | | +| modx-resource-content-below | | | +| modx-resource-main-right | | | +| modx-resource-main-right-top | | | +| modx-resource-main-right-middle | | | +| modx-resource-main-right-bottom | | | +| modx-page-settings | Settings | A primary tab | +| modx-page-settings-left | | | +| modx-page-settings-right | | | +| modx-page-settings-box-left | | | +| modx-page-settings-box-right | | | +| modx-panel-resource-tv | Template Variables | A primary tab | +| modx-resource-access-permissions | Resource Groups | A primary tab | + +A set that is bound to the action **Create Resource** offers two regions less: `modx-resource-content-above` and `modx-resource-content-below`. + +The list of the regions is stored in a reference table, and it is filled in when MODX is installed. A database that was upgraded from 2.x may have a shorter list. ## Adding New Tabs - Adding a new tab is quite simple. Edit your Set, and open the Regions tab. Click the Create New Tab button, give it an ID like "my-new-tab" and a description. +Adding a new tab is quite simple. Edit your Set, and open the **Regions** tab. Press **Create**, give the region an ID like `my-new-tab` and a **Title**. ![](fc_new_tab.jpg) -Any time you need to refer to the tab region, for example if moving Template Variables into the new tab, use the ID you gave it. +Any time you need to refer to the region, for example when moving Template Variables into the new tab, use the ID you gave it. + +The id has to be unique within the set. A region created this way can be deleted again with the **Delete** item of its context menu. The regions of the form itself cannot. ## See Also -1. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) -2. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) - 1. [Customizing Tabs via Form Customization](building-sites/client-proofing/form-customization/tabs) -3. [Manager Templates and Themes](building-sites/client-proofing/custom-manager-themes) +1. [Customizing the Manager](building-sites/client-proofing/form-customization) +2. [Form Customization Profiles](building-sites/client-proofing/form-customization/profiles) +3. [Form Customization Sets](building-sites/client-proofing/form-customization/sets) + 1. [Form Customization Rules](building-sites/client-proofing/form-customization/rules) + 2. [Customizing Tabs](building-sites/client-proofing/form-customization/tabs) +4. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) diff --git a/en/building-sites/client-proofing/index.md b/en/building-sites/client-proofing/index.md index d3746cbc1..20066a543 100644 --- a/en/building-sites/client-proofing/index.md +++ b/en/building-sites/client-proofing/index.md @@ -1,7 +1,33 @@ --- title: "Client-proofing the manager" +description: "Tone down the Manager of MODX for a client: the look of the manager and of the login page, the dashboards, the forms of the manager, and the access to it." --- The manager is a very powerful administrative interface, and when you've built a site for a client it is likely you'll want to tone a few things down a bit. -There are different tools at your disposal for that. +## The Look of the Manager + +- [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) — override the files of the manager with a theme of your own. +- [Customizing the Login](building-sites/client-proofing/manager-login) — the logo, the background, the help block and the language of the login page. +- The setting `manager_logo` puts your own logo into the left panel of the manager. + +## The Dashboards + +[Dashboards](building-sites/client-proofing/dashboards) — the widgets on the page a user sees after logging in, and who sees which. + +## The Forms of the Manager + +[Form Customization](building-sites/client-proofing/form-customization) — the profiles that hide fields, rename tabs and change values, and the sets of rules they hold. + +## The Access to the Manager + +[Security](building-sites/client-proofing/security) — the policies, the permissions, the user groups, the roles and the resource groups that decide what a user may do. + +## See Also + +1. [Client-proofing the manager](building-sites/client-proofing) +2. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) +3. [Customizing the Login](building-sites/client-proofing/manager-login) +4. [Dashboards](building-sites/client-proofing/dashboards) +5. [Form Customization](building-sites/client-proofing/form-customization) +6. [Security (ACLs)](building-sites/client-proofing/security) diff --git a/en/building-sites/client-proofing/manager-login.md b/en/building-sites/client-proofing/manager-login.md index 626545ea5..71a314fa8 100644 --- a/en/building-sites/client-proofing/manager-login.md +++ b/en/building-sites/client-proofing/manager-login.md @@ -1,41 +1,73 @@ --- title: Customizing the Login +description: "The login page of the MODX Manager: its logo, the background image, the help block, the language, and the settings that change them." --- -With MODX3 you get more and easier control over the appearance of the manager login page. +The login page of MODX 3 has its own settings, its own template and its own events. You can change its look without touching the rest of the manager. ## Logo -By default, the MODX logo will be used. This file is included in the release in `/manager/templates/default/images/modx-logo-color.svg`. +The logo of the site is used by default. The file is `manager/templates/default/images/modx-logo-color.svg`. -To use a different logo, provide an image URL in the the `login_logo` system setting. This can be both a local file or an external (full) URL. The image is limited to a width of 192 pixels (or 384 on 2x displays). +To use a different logo, put the address of an image into the `login_logo` system setting. It can be a local file or a full external URL. The image is limited to a width of 192 CSS pixels. -## Background image +The logo is used in the letters of the manager as well, in the standard template `email/default.tpl`. -The background image on the login screen is a default one included in `/manager/templates/default/images/login/default-background.jpg`. The photo provided with MODX 3.0.0 was created by Christian Seel, and shows a mountain range near Engelberg, Switzerland, where the new login experience was originally built during a SnowUp event. ([Source](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)) +**A custom theme needs its own logo** +The default logo is read from the directory of the theme, with no fallback to `default`. A theme that has no `images/modx-logo-color.svg` shows a broken logo on the login page. -> If you've created or use a custom manager theme, you must also provide a `/manager/templates/YOUR-THEME/images/login/default-background.jpg` file to act as the default. +The favicon of the page is a separate setting, `manager_favicon_url`. + +## Background Image + +The background of the login screen is a default one, included in `manager/templates/default/images/login/default-background.jpg`. The photo provided with MODX 3.0.0 was created by Christian Seel ([source](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)). -To change the background to a different image, provide an image URL in the `login_background_image` system setting. This can be both a local file or an external (full) URL. A landscape image works best. +> If you've created or use a custom manager theme, you must also provide a `/manager/templates/YOUR-THEME/images/login/default-background.jpg` file to act as the default. -### Changing programmatically +To change the background to a different image, put the address of an image into the `login_background_image` system setting. It can be a local file or a full external URL. A landscape image works best. -Alternatively, the background can also be changed programmatically with a plugin. +### Changing Programmatically -One pre-made example of that is the [DailyPhoto extra](https://modx.com/extras/package/dailyphoto) which uses a different random photo each day from Unsplash. +The background can also be set by a plugin, which is the way to give every visitor a different picture. One pre-made example is the [DailyPhoto extra](https://modx.com/extras/package/dailyphoto), which uses a different random photo each day from Unsplash. -To create your own custom logic for the background image, create a plugin that listens to the `OnManagerLoginFormRender` system event, with code like this: +To set the background yourself, create a plugin that listens to the `OnManagerLoginFormRender` system event: -```php +``` php $modx->controller->setPlaceholder('background', '/full/url/to/image.jpg'); ``` -## Help block +The event `OnManagerLoginFormPrerender` does the same, but its output is placed before the form. + +## Help Block + +The login page also includes a help block, which is disabled by default. To enable it, set the `login_help_button` system setting to yes. A help link is then shown at the bottom of the login panel. + +The content of the login block is managed in the lexicon. Go to **Admin → Lexicons**, select `core` as the namespace (if it is not pre-selected) and the `login` topic, and choose the language to edit. The relevant lexicon keys are `login_help_button_text`, `login_help_text`, and `login_help_title`. Double-click a value to edit it. + +The text of the greeting is chosen by the time of day from the keys `login_greeting_morning`, `login_greeting_afternoon`, `login_greeting_evening` and `login_greeting_night` of the same topic. + +## Language + +The language of the login page is picked on the page itself. It is not the `manager_language` setting: in MODX 3 that setting is removed on upgrade, and the language lives in the session. The login page takes the language from the request, then from the session, then from the `Accept-Language` header of the browser. It falls back to `en`. + +## Other Settings + +| Setting | What it changes | +| --- | --- | +| `allow_manager_login_forgot_password` | Whether the block for resetting a forgotten password is shown. | +| `manager_login_url_alternate` | The address an unauthorized user is sent to, instead of the login page. | +| `manager_direction` | The direction of the text, `rtl` for a right-to-left language. | +| `compress_css` | Whether the login page links the minified stylesheet. | +| `password_min_length` | The minimum length of a password, in the hint under the field. | +| `session_cookie_lifetime` | The lifetime of the session, shown in the label of the "remember me" checkbox. | -The login page also includes a help block, however this is disabled by default. To enable it, set the `login_help_button` system setting to yes. A help link will then be shown at the bottom of the login panel. +## Passwordless Login -The content of the login block is managed in the lexicon. To change, go to System > Lexicons. Select `core` as the namespace (if not pre-selected by default) and the `login` topic. Also choose the language to edit. The relevant lexicon keys are `login_help_button_text`, `login_help_text`, and `login_help_title` which can be edited by double clicking on the value. +Instead of a username and a password, the login page can offer [logging in with a magic link](building-sites/client-proofing/security/passwordless-login). With `passwordless_activated` set, the form shows only the field for the e-mail address. The lifetime of the link is set by the `passwordless_expiration` setting, 3600 seconds by default. -## Passwordless login +## See Also -If desirable you can also enable [logging in with a magic login link](building-sites/client-proofing/security/passwordless-login) instead of a username and password. +1. [Client-proofing the manager](building-sites/client-proofing) +2. [Custom Manager Themes](building-sites/client-proofing/custom-manager-themes) +3. [Customizing the Login](building-sites/client-proofing/manager-login) +4. [Logging in with a magic link](building-sites/client-proofing/security/passwordless-login) diff --git a/en/building-sites/client-proofing/security/index.md b/en/building-sites/client-proofing/security/index.md index 0fda5c1c5..896df9403 100644 --- a/en/building-sites/client-proofing/security/index.md +++ b/en/building-sites/client-proofing/security/index.md @@ -1,25 +1,45 @@ --- title: "Security (ACLs)" +description: "The security model of MODX: the groups, the policies and the permissions, and how an access control list ties them together." _old_id: "488" _old_uri: "2.x/administering-your-site/security" --- -## Security in MODX Revolution +## The Security Model -Security in MODX Revolution is primarily driven by an Attribute-Based Access Control (ABAC) paradigm. +Security in MODX is list-based. The rights are granted to User Groups and are tied to an object with a minimum role. -Each user in MODX has a [User](building-sites/client-proofing/security/users "Users") object, which can be assigned to any number of [User Groups](building-sites/client-proofing/security/user-groups "User Groups"). Each User Group then has attributes assigned to it via [Access Control Lists](building-sites/client-proofing/security/policies/acls "ACLs") (ACLs). These ACLs take a variety of names depending on how they are applied, but all share one common principle - they contain a list of [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions"). These Permissions allow access to different areas or actions within MODX. +Every user can be a member of any number of User Groups. Each User Group gets its attributes from Access Control Lists (ACLs), which contain a list of Permissions. The permissions open up the different areas and actions of MODX. -ACLs usually have the following: +An ACL usually has the following: -- **Principal** - The object that is getting the access permissions. This is in MODX, by default, a User Group. -- **Target** - The object they apply to, for example, a Context or Resource Group. +- **Principal** - The object that is getting the access permissions. In MODX, by default, a User Group. +- **Target** - The object they apply to, for example a Context or Resource Group. - **Access Policy** - The list of Permissions that is gained by this ACL. - **Authority** - The minimum Authority level required to use this ACL (see [Roles](building-sites/client-proofing/security/roles "Roles")). -Access is **allow/deny** in MODX, meaning that access is "open" by default. Once an ACL is applied to an object, such as a Context or Resource Group, those Contexts or Resource Groups will now only be accessible to the objects with appropriate Permissions. +A user passes the check of an ACL when the authority of their role in the group is **not greater** than the authority of that ACL. The policies are given to the group; the role is only the number that is compared with it. -### Security Tutorial Video +Access is **allow/deny** in MODX, meaning that access is "open" by default. Once an ACL is applied to an object, such as a Context or Resource Group, only the objects with appropriate Permissions can reach it. + +### The Permissions of the Page + +The page of the Access Control Lists needs the permission `access_permissions`. + +## What a Fresh Installation Looks Like + +MODX 3 creates the following when it is installed: + +| Who | What | +| --- | --- | +| The anonymous user | The policy **Load Only** on the context `web`, with the authority 9999. | +| The group `Administrator` | The policy **Administrator** on the contexts `web` and `mgr`, with the authority 0 — the role Super User. | + +The anonymous user is not a group: it is an ACL with the principal `0`. There is no group "Anonymous" in the database, and the tree of the groups shows a pseudo entry "(Anonymous)". + +The role **Member** has the authority 9999, so it does not pass the check of an ACL with the authority 0. A user with the role **Super User** does. + +## Security Tutorial Video Demonstrates by applying concepts to the MODX Sample Site to: @@ -32,8 +52,55 @@ Demonstrates by applying concepts to the MODX Sample Site to: ### Example: Context Access -A good example is creating a Context named 'test', and assigning an ACL to it. This can be done by editing the Context, and going to the 'Access Permissions' tab. From here, you can give a User Group (say, 'HR Dept') explicit access to this Context by selecting the User Group, the 'Administrator' Access Policy, and specifying a required Authority (say, 9999 for 'Member') to have: +A good example is creating a Context named 'test', and assigning an ACL to it. This can be done by editing the Context, and going to the 'Access Permissions' tab. From here, you can give a User Group (say, 'HR Dept') explicit access to this Context. Select the User Group, the 'Administrator' Access Policy, and a required Authority (say, 9999 for 'Member'): ![](sec-ugctx1.png) This will restrict the 'test' Context to users who are a Member (or [Role](building-sites/client-proofing/security/roles "Roles") with more authority) of the 'HR Dept' User Group. + +## Events + +The behaviour of the authentication and of the accounts can be changed with a plugin. The events of the section: + +| Event | When it fires | +| --- | --- | +| OnManagerLogin, OnWebLogin | After a user has logged in. | +| OnManagerAuthentication, OnWebAuthentication | While a user is being authenticated. | +| OnUserNotFound | When a login names a user that does not exist. | +| OnManagerLogout, OnWebLogout | After a user has logged out. | +| OnBeforeManagerLogout, OnBeforeWebLogout | Before a user logs out. | +| OnUserBeforeSave, OnUserSave | Before and after a user is saved. | +| OnUserBeforeRemove, OnUserRemove | Before and after a user is removed. | +| OnUserFormSave, OnBeforeUserFormSave | Before and after a user is saved from the form of the manager. | +| OnUserChangePassword | After a user has changed the password. | +| OnUserActivate, OnBeforeUserActivate | After and before a user is activated. | +| OnUserDeactivate, OnBeforeUserDeactivate | After and before a user is deactivated. | +| OnUserBeforeAddToGroup, OnUserAddToGroup | Before and after a user is added to a group. | +| OnUserBeforeRemoveFromGroup, OnUserRemoveFromGroup | Before and after a user is removed from a group. | +| OnUserGroupBeforeSave, OnUserGroupSave | Before and after a group is saved. | +| OnUserGroupBeforeRemove, OnUserGroupRemove | Before and after a group is removed. | +| OnResourceGroupBeforeSave, OnResourceGroupSave | Before and after a resource group is saved. | +| OnBeforeResourceGroupRemove, OnResourceGroupRemove | Before and after a resource group is removed. | +| OnResourceAddToResourceGroup, OnResourceRemoveFromResourceGroup | When a resource is added to or removed from a resource group. | + +## See Also + +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/passwordless-login/index.md b/en/building-sites/client-proofing/security/passwordless-login/index.md index a3c969c29..d61dd0930 100644 --- a/en/building-sites/client-proofing/security/passwordless-login/index.md +++ b/en/building-sites/client-proofing/security/passwordless-login/index.md @@ -1,31 +1,57 @@ --- title: "Passwordless login" sortorder: 0 +description: "Logging in to MODX with a magic link instead of a password: how to turn it on, how long the link lives, and what it does not change." --- -MODX3 has a new feature named "passwordless login", which can be activated by a system setting. Once you have activated that feature, it is no longer needed to enter a password and a username to login. Instead, you simply enter your account's email address, and the system will send you an email with a one-time login link. By clicking on that link you will then be immediately being logged into the manager. +MODX 3 can log a user in without a password. With the feature activated, the login form asks for an e-mail address only, and sends a one-time login link to it. Clicking the link logs the user into the manager. ## Benefits of passwordless login -Having the need for a strong password often makes people choose generic pseudo-strong passwords by reusing a proven strong phrase and maybe just adding a number per service. As a site administrator you should not encourage your users to do insecure things. This moves the risk of having an insecure password away from your MODX installation, but of course needs a secure email account for your users. But this is also the case for the traditional username+password login, because this also has the password self-service where you can reset your password via email. +As a site administrator you should not encourage your users to choose insecure passwords. Passwordless login moves the risk of a weak password away from your MODX installation, but of course needs a secure e-mail account for your users. The traditional username and password login has the same requirement, because it also offers self-service password resets by e-mail. -Additionally, if passwordless login is enabled, no passwords are stored any more in the MODX database. Then there is no more theoretical risk of passwords being stolen by a database breach (regardless of any encryption). +The password of the user stays in the database all the same. Every login by a link writes the hash of a temporary password into the field `password` of the user. The gain is that the user has no password to choose, to remember or to reuse, not that the password is gone. ## How to enable passwordless login -In order to activate the passwordless login, you need to set the system setting `passwordless_activated` in the area "Authentication and Security" of the core system settings to "Yes". The next time you login you will be presented the following login screen: +Set the system setting `passwordless_activated` in the area "Authentication and Security" of the core system settings to "Yes". The setting is off by default. The next time you log in you will be presented the following login screen: ![](passwordless-login-screen.jpg) - -Just enter your account's email address and you will receive an email with a - personal login link. + +Just enter the account's e-mail address and you will receive an e-mail with a personal login link. ![](passwordless-email.png) - + ## Configure link expiration -You can configure the expiration time of the login link via the system setting `passwordless_expiration`. By default it is set to 3600 seconds, which should be way enough for everyone to login. If you are paranoid, you can easily set it to a lower value, e.g. 600 to allow usage of the link only for 10 minutes. The validity period will also be shown in the email itself. +You can configure the expiration time of the login link via the system setting `passwordless_expiration`. By default it is set to 3600 seconds, which is enough for everyone to log in. Set it to a lower value, e.g. 600, to allow usage of the link only for 10 minutes. The validity period will also be shown in the e-mail itself. + +## The Link Is Used Once + +The link works only once: the record is removed from the registry as soon as it has been used. The token of the link is signed with the hash of the user's password, so a link stops working as soon as the password changes. ## Additional notes -Be aware that there will be _no error message_ if you enter an unknown email address during login. This is a well-known and intended behavior to prevent user-enumeration attempts. +Be aware that there will be _no error message_ if you enter an unknown e-mail address during login. This is a well-known and intended behavior to prevent user-enumeration attempts. + +## See Also + +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/policies/acls.md b/en/building-sites/client-proofing/security/policies/acls.md index 2c0a39e5e..5f0dcef90 100644 --- a/en/building-sites/client-proofing/security/policies/acls.md +++ b/en/building-sites/client-proofing/security/policies/acls.md @@ -1,5 +1,6 @@ --- title: "ACLs" +description: "The access control lists of MODX: the five kinds of ACL, what a group gets with one, and how the role is compared with it." _old_id: "9" _old_uri: "2.x/administering-your-site/security/policies/acls" --- @@ -10,18 +11,28 @@ An ACL, or Access Control List, is a set of [Permissions](building-sites/client- ## Usage -In MODX, ACLs can be applied to any modAccessibleObject. Primarily MODX Revolution 2.0 allows for ACLs on Resources and Contexts. +MODX 3 has five kinds of ACL. Each of them is set on a tab of a User Group: + +| Kind | What it restricts | +| --- | --- | +| Context ACL | The access to a context. | +| Resource Group ACL | The access to the resources of a resource group. | +| Element Category ACL | The access to the elements of a category, and to the fields of a resource. | +| Media Source ACL | The access to the files of a media source. | +| Namespace ACL | The access to the elements of a namespace. | + +The first two are described below. ### Context ACL -A Context ACL is referenced of 4 parts: +A Context ACL is made of 4 parts: - A [Context](building-sites/contexts "Contexts") - A [User Group](building-sites/client-proofing/security/user-groups "User Groups") - A [Minimum Role](building-sites/client-proofing/security/roles "Roles") - An [Access Policy](building-sites/client-proofing/security/policies "Policies") -This means that one can assign a ACL to a Context that will apply to: +This means that one can assign an ACL to a Context that will apply to: - All the Users in a User Group - ...with at least the Minimum Role specified @@ -53,30 +64,30 @@ That has a few practical consequences: 1. A policy that grants `publish_document` only on a frontend context (`web` or another site context) does **not** unlock manager publish controls. You need a Context Access ACL on **`mgr`**. 2. Resource ACL permissions `publish` / `unpublish` (on the [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy)) are a different ACL surface. The current manager publish UI and save path do not use them. 3. Multiple user groups still **OR** together for a given context. `checkPolicy` returns true when **any** matching Context Access ACL for that context grants the permission. You do not need every group to include publish. -4. A common trap: one shared group gives **Content Editor** (no publish) on `mgr`, and a second group puts a custom policy with publish only on another context. The user is in both groups, but still cannot publish in the manager until `publish_document` exists on an **`mgr`** Context Access ACL. +4. A common trap: one shared group gives **Content Editor** (no publish) on `mgr`, and a second group puts a custom policy with publish on another context. The user is in both groups, but still cannot publish in the manager until `publish_document` exists on an **`mgr`** Context Access ACL. -To fix that setup: add Context Access for **`mgr`** on at least one of the user's groups, with a policy that includes `publish_document` (and `unpublish_document` if needed). Leave Content Editor on the other group if you want. Flush sessions/permissions and retest. +To fix that setup, add Context Access for **`mgr`** on at least one of the user's groups. Use a policy that includes `publish_document` (and `unpublish_document` if needed). Leave Content Editor on the other group if you want. Flush sessions/permissions and retest. See also [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) (`publish_document`) and [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access). Background: [modxcms/revolution#14925](https://github.com/modxcms/revolution/issues/14925). ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/policies/index.md b/en/building-sites/client-proofing/security/policies/index.md index be120cae3..01d79439e 100644 --- a/en/building-sites/client-proofing/security/policies/index.md +++ b/en/building-sites/client-proofing/security/policies/index.md @@ -1,31 +1,43 @@ --- title: "Policies" +description: "The access policies of MODX: the twelve that ship with the core, and the template that decides what a policy may hold." _old_id: "243" _old_uri: "2.x/administering-your-site/security/policies" --- ## What is an Access Policy? -An Access Policy is a set of [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") containing one or many Permissions, as defined in the manager. By default MODX comes with pre-configured Access Policies: +An Access Policy is a list of [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions"), defined in the manager. By default MODX comes with twelve pre-configured Access Policies: -- **Administrator**: Context administration policy with all default permissions. -- **Content Editor**: Context administration policy with limited, content-editing related Permissions, but no publishing Permissions (`publish_document` / `unpublish_document`). -- **Context**: A standard Context policy that you can apply when creating Context ACLs for basic read/write and view\_unpublished access within a Context. -- **Element**: MODX Element policy with all attributes. -- **Load Only**: A minimal policy with permission to load an object. -- **Load, List and View**: Provides load, list and view permissions only. -- **Media Source Admin**: Media Source administration policy. -- **Media Source User**: Media Source user policy, with basic viewing and using - but no editing - of Media Sources. -- **Object**: An Object policy with all permissions. -- **Resource**: MODX Resource Policy with all attributes. +| Policy | What it is | Policy Template | +| --- | --- | --- | +| Administrator | Context administration policy with all default permissions. | AdministratorTemplate | +| Content Editor | Context administration policy with limited, content-editing related Permissions, but no publishing Permissions (`publish_document` / `unpublish_document`). | AdministratorTemplate | +| Context | A standard Context policy that you can apply when creating Context ACLs for basic read/write and view\_unpublished access within a Context. | ContextTemplate | +| Developer | Context administration policy with all permissions of the administrator, except the administrative and the security ones. | AdministratorTemplate | +| Element | MODX Element policy with all attributes. | ElementTemplate | +| Hidden Namespace | Hides a namespace from the lists. It grants `load` and `view`, and denies `list`. | NamespaceTemplate | +| Load Only | A minimal policy with permission to load an object. | ObjectTemplate | +| Load, List and View | Provides load, list and view permissions only. | ObjectTemplate | +| Media Source Admin | Media Source administration policy. | MediaSourceTemplate | +| Media Source User | Media Source user policy, with basic viewing and using - but no editing - of Media Sources. | MediaSourceTemplate | +| Object | An Object policy with all permissions. | ObjectTemplate | +| Resource | MODX Resource Policy with all attributes. | ResourceTemplate | -If you customize any of the above default Access Policies, duplicate (and rename) them before customizing! If you don't do that all customizations will be lost when updating MODX to a newer version as they get overridden by the setup script. +The Policy Template of a policy decides which permissions it can hold at all. It is the list of checkboxes you get when you create the policy. See [Policy Templates](building-sites/client-proofing/security/policies/policytemplates "Policy Templates"). + +**Duplicate a default policy before you change it** +The setup script recreates the policies of the core on every update, so your changes to them can be lost. + +## The Permissions of the Page + +The page of the policies needs the permission `policy_view` to see the list, `policy_new` and `policy_save` to create a policy, `policy_edit` to change one, and `policy_delete` to delete one. The templates need `policy_template_view`, `policy_template_new`, `policy_template_save`, `policy_template_edit` and `policy_template_delete`. ## Creating and Editing To create an Access Policy in the manager, navigate to -> Security -> Access Controls -> Access Policies +> the lock icon in the user menu → **Access Control Lists** → the tab **Policies** From there you can add new policies. To edit an Access Policy in the manager, simply right-click the Policy you want to edit. @@ -35,7 +47,7 @@ Policies can be used in a myriad of different ways. Here are 3 example usages th ### Context Access -Access Policies can be assigned as [Access Control Lists](building-sites/client-proofing/security/policies/acls "ACLs") (ACLs) to a Context and User Group, with a specified Minimum [Role](building-sites/client-proofing/security/roles "Roles"). When done, this means that all the Users in that User Group with at least the Role specified as the Minimum Role can use the Permissions in the Policy in the Context specified in the [ACL](building-sites/client-proofing/security/policies/acls "ACLs"). +Access Policies can be assigned as [Access Control Lists](building-sites/client-proofing/security/policies/acls "ACLs") (ACLs) to a Context and User Group, with a specified Minimum [Role](building-sites/client-proofing/security/roles "Roles"). When done, all the Users in that User Group with at least the Minimum Role can use the Permissions in the Policy. This applies to the Context specified in the [ACL](building-sites/client-proofing/security/policies/acls "ACLs"). MODX comes with a default ["Administrator" Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy "Permissions - Administrator Policy") that contains all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") one would use in a Context ACL. It's best to duplicate this policy when creating a custom access policy for restricting manager users. @@ -43,7 +55,7 @@ Manager publish controls require `publish_document` on a Context Access ACL for ### Resource Group Access -They can also be Resource ACLs, that limit access to Resources based on Roles and Resource Groups. MODX comes packaged with a default ["Resource" Policy](building-sites/client-proofing/security/policies/permissions/resource-policy "Permissions - Resource Policy") that contains all the basic Permissions one would use in a Resource Group ACL. +They can also be Resource ACLs, that limit access to Resources based on Roles and Resource Groups. MODX comes packaged with a default ["Resource" Policy](building-sites/client-proofing/security/policies/permissions/resource-policy "Resource Policy") that contains all the basic Permissions one would use in a Resource Group ACL. An example would be to assign the "Resource" policy to a Resource Group called 'HR Documents'. Then, you would give a User Group called "HR Department" access to this Resource Group via the Resource ACL: @@ -53,7 +65,7 @@ This would restrict all Resources in the "HR Documents" Resource Group to Users ### Element Category Access -Elements can be restricted from view by ACLs on Categories. For example, if you had a User Group called 'Developers', and wanted Users in that group to be the only Group that could see Elements in the Category 'Gallery', you would create an ACL like such, in the "Element Category Access" tab when editing the User Group: +Elements can be restricted from view by ACLs on Categories. For example, say you have a User Group called 'Developers' and want its Users to be the only ones who see the Elements in the Category 'Gallery'. Create an ACL like this, in the "Element Category Access" tab of the group: ![](acl-ecat1.png) @@ -69,26 +81,26 @@ and its permissions: ![](policy1-perm.png) -Any User that had access to this Policy would have the permissions 'view\_accounts' and 'save\_accounts'. +Any User that had access to this Policy would have the permissions `view_accounts` and `save_accounts`. ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) - 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) - 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) - 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) - 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) - 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md b/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md index 1fea482f5..cdea66c31 100644 --- a/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md +++ b/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md @@ -1,5 +1,6 @@ --- title: "Administrator Policy" +description: "The Administrator policy of MODX and the full list of the permissions it holds." _old_id: "218" _old_uri: "2.x/administering-your-site/security/policies/permissions/permissions-administrator-policy" --- @@ -10,119 +11,216 @@ This policy is packaged into MODX and is given to users on the 'mgr' context who ## Default Permissions -| Name | Description of Access | -| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| about | The About page. | -| access\_permissions | Any Access Permission-related pages and actions. | -| action\_ok | -| actions | The [Actions](extending-modx/menus/actions "Actions and Menus") page. | -| change\_password | User can change their user password. | -| change\_profile | User can change their profile. | -| content\_types | The [Content Types](building-sites/resources/content-types "Content Types") page. | -| create | Basic "create" access on objects. | -| credits | View the Credits page. | -| customize\_forms | View and manage the [Customizing the Manager](building-sites/client-proofing/form-customization "Customizing the Manager") page. | -| database | The System Info page | -| database\_truncate | The ability to truncate a database table. | -| delete\_category | To delete or remove any Categories. | -| delete\_chunk | To delete or remove any [Chunks](building-sites/elements/chunks "Chunks"). | -| delete\_context | To delete or remove any [Contexts](building-sites/contexts "Contexts"). | -| delete\_document | To delete or remove any [Resources](building-sites/resources "Resources"). | -| delete\_eventlog | To empty the Event Log. | -| delete\_plugin | To delete or remove any [Plugins](extending-modx/plugins "Plugins"). | -| delete\_snippet | To delete or remove any [Snippets](extending-modx/snippets "Snippets"). | -| delete\_template | To delete or remove any [Templates](building-sites/elements/templates "Templates"). | -| delete\_tv | To delete or remove any [Template Variables](building-sites/elements/template-variables "Template Variables"). | -| delete\_role | To delete or remove any [Roles](building-sites/client-proofing/security/roles "Roles"). | -| delete\_user | To delete or remove any [Users](building-sites/client-proofing/security/users "Users"). | -| edit\_category | To edit any Categories. | -| edit\_chunk | To edit any [Chunks](building-sites/elements/chunks "Chunks"). | -| edit\_context | To edit any [Contexts](building-sites/contexts "Contexts"). | -| edit\_document | To edit any [Resources](building-sites/resources "Resources"). | -| edit\_locked | Allows a user to override a lock and edit a locked Resource. | -| edit\_parser | -| edit\_plugin | To edit any [Plugins](extending-modx/plugins "Plugins"). | -| edit\_role | To edit any [Roles](building-sites/client-proofing/security/roles "Roles"). | -| edit\_snippet | To edit any [Snippets](extending-modx/snippets "Snippets"). | -| edit\_template | To edit any [Templates](building-sites/elements/templates "Templates"). | -| edit\_tv | To edit any [Template Variables](building-sites/elements/template-variables "Template Variables"). | -| edit\_user | To edit any [User](building-sites/client-proofing/security/users "Users"). | -| element\_tree | The ability to view the Elements Tree on the left nav. | -| empty\_cache | To empty the site cache. | -| export\_static | To export the site to static HTML. | -| file\_manager | To use the file manager, including creating/deleting files. | -| file\_tree | To view the Files Tree on the left nav. | -| flush\_sessions | Can flush Sessions across the site. | -| frames | To use the MODX Manager UI at all. | -| help | To view the Help page. | -| home | To view the Welcome page. | -| import\_static | To view or use the Import pages. | -| languages | To edit or view Lexicon Languages. | -| lexicons | To edit or view Lexicons and [Internationalization](extending-modx/internationalization "Internationalization"). | -| list | Basic permission to "list" any object. List means to get a collection of objects. | -| load | Basic permission to "load" any object, or be able to return it as an instance at all. | -| logout | To be able to logout as a user. | -| logs | To view the logs, such as error and manager logs. | -| menus | To edit or save any top Menu items. | -| messages | To send or view any personal Messages. | -| namespaces | To edit or view [Namespaces](extending-modx/namespaces "Namespaces"). | -| new\_category | To create a new Category. | -| new\_chunk | To create a new [Chunk](building-sites/elements/chunks "Chunks"). | -| new\_context | To create a new [Context](building-sites/contexts "Contexts"). | -| new\_document | To create a new [Resources](building-sites/resources "Resources"). | -| new\_document\_in\_root | To create a [Resource](building-sites/resources "Resources") at the site root. Replaces the removed `udperms_allowroot` setting. | -| new\_plugin | To create a new [Plugin](extending-modx/plugins "Plugins"). | -| new\_role | To create a new [Role](building-sites/client-proofing/security/roles "Roles"). | -| new\_snippet | To create a new [Snippet](extending-modx/snippets "Snippets"). | -| new\_template | To create a new [Template](building-sites/elements/templates "Templates"). | -| new\_tv | To create a new [Template Variable](building-sites/elements/template-variables "Template Variables"). | -| new\_user | To create a new [User](building-sites/client-proofing/security/users "Users"). | -| packages | To use any Transport Packages in the [Package Management](extending-modx/transport-packages "Package Management") system. | -| property\_sets | To view and edit [Properties and Property Sets](building-sites/properties-and-property-sets "Properties and Property Sets"). | -| providers | To view and edit [Providers](building-sites/extras/providers "Providers") across the site. | -| publish\_document | To publish or unpublish any Resource. In the manager UI this is checked on the **`mgr`** context via `hasPermission('publish_document')`. A grant only on another context does not unlock manager publish controls. See [ACLs](building-sites/client-proofing/security/policies/acls#manager-publishing-and-multiple-groups). | -| purge\_deleted | To empty the Recycle Bin. | -| remove | Basic permission to remove any object. | -| remove\_locks | To remove all existing Locks throughout the site. | -| resource\_tree | To view the Resource Tree in the left nav. | -| save | Basic save permission for any object. | -| save\_category | To save any Categories. | -| save\_chunk | To save any [Chunks](building-sites/elements/chunks "Chunks"). | -| save\_context | To save any [Contexts](building-sites/contexts "Contexts"). | -| save\_document | To save any [Resources](building-sites/resources "Resources"). | -| save\_plugin | To save any [Plugins](extending-modx/plugins "Plugins"). | -| save\_role | To save any [Roles](building-sites/client-proofing/security/roles "Roles"). | -| save\_snippet | To save any [Snippets](extending-modx/snippets "Snippets"). | -| save\_template | To save any [Templates](building-sites/elements/templates "Templates"). | -| save\_tv | To save any [Template Variables](building-sites/elements/template-variables "Template Variables"). | -| save\_user | To save any [User](building-sites/client-proofing/security/users "Users"). | -| search | To use the Search page. | -| settings | To view and edit any System Settings. | -| steal\_locks | To "steal" locks, overriding a current lock on a document. | -| unlock\_element\_properties | To be able to edit the default properties for any Element. | -| view | Basic permission to "view" any object. | -| view\_category | To view any Categories. | -| view\_chunk | To view any [Chunks](building-sites/elements/chunks "Chunks"). | -| view\_context | To view any [Contexts](building-sites/contexts "Contexts"). | -| view\_document | To view any [Resources](building-sites/resources "Resources"). | -| view\_eventlog | To view the Event Log. | -| view\_offline | -| view\_plugin | To view any [Plugins](extending-modx/plugins "Plugins"). | -| view\_role | To view any [Roles](building-sites/client-proofing/security/roles "Roles"). | -| view\_snippet | To view any [Snippets](extending-modx/snippets "Snippets"). | -| view\_template | To view any [Templates](building-sites/elements/templates "Templates"). | -| view\_tv | To view any [Template Variables](building-sites/elements/template-variables "Template Variables"). | -| view\_unpublished | To view any unpublished [Resources](building-sites/resources "Resources"). | -| view\_user | To view any [User](building-sites/client-proofing/security/users "Users"). | -| workspaces | To utilize [Package Management](extending-modx/transport-packages "Package Management"). | +| Name | Description of Access | +| --- | --- | +| `about` | The About page. | +| `access_permissions` | Any Access Permission-related pages and actions. | +| `actions` | The [Actions](extending-modx/menus/actions "Actions and Menus") page. | +| `change_password` | User can change their user password. | +| `change_profile` | User can change their profile. | +| `charsets` | To view a list of charsets. | +| `class_map` | To view a list of classes in the Class Map. | +| `components` | To view the Extras menu. | +| `content_types` | The [Content Types](building-sites/resources/content-types "Content Types") page. | +| `countries` | To view a list of countries. | +| `create` | Basic "create" access on objects. | +| `credits` | View the Credits page. | +| `customize_forms` | View and manage the [Customizing the Manager](building-sites/client-proofing/form-customization "Customizing the Manager") page. | +| `dashboards` | View and manage Custom Dashboards. | +| `database` | The System Info page | +| `database_truncate` | The ability to truncate a database table. | +| `delete_category` | To delete or remove any Categories. | +| `delete_chunk` | To delete or remove any [Chunks](building-sites/elements/chunks "Chunks"). | +| `delete_context` | To delete or remove any [Contexts](building-sites/contexts "Contexts"). | +| `delete_document` | To delete or remove any [Resources](building-sites/resources "Resources"). | +| `delete_eventlog` | To empty the Event Log. | +| `delete_plugin` | To delete or remove any [Plugins](extending-modx/plugins "Plugins"). | +| `delete_propertyset` | To delete or remove any Property Sets. | +| `delete_role` | To delete or remove any [Roles](building-sites/client-proofing/security/roles "Roles"). | +| `delete_snippet` | To delete or remove any [Snippets](extending-modx/snippets "Snippets"). | +| `delete_static_resource` | To delete or remove any static resource, also requires delete\_document permission. | +| `delete_symlink` | To delete or remove any symlink, also requires delete\_document permission. | +| `delete_template` | To delete or remove any [Templates](building-sites/elements/templates "Templates"). | +| `delete_tv` | To delete or remove any [Template Variables](building-sites/elements/template-variables "Template Variables"). | +| `delete_user` | To delete or remove any [Users](building-sites/client-proofing/security/users "Users"). | +| `delete_weblink` | To delete or remove any weblink, also requires delete\_document permission. | +| `directory_chmod` | To chmod a physical directory. | +| `directory_create` | To create a physical directory. | +| `directory_list` | To list subdirectories for a physical directory. | +| `directory_remove` | To delete a physical directory. | +| `directory_update` | To rename a physical directory. | +| `edit_category` | To edit any Categories. | +| `edit_chunk` | To edit any [Chunks](building-sites/elements/chunks "Chunks"). | +| `edit_context` | To edit any [Contexts](building-sites/contexts "Contexts"). | +| `edit_document` | To edit any [Resources](building-sites/resources "Resources"). | +| `edit_locked` | Allows a user to override a lock and edit a locked Resource. | +| `edit_plugin` | To edit any [Plugins](extending-modx/plugins "Plugins"). | +| `edit_propertyset` | To edit any Property Sets. | +| `edit_role` | To edit any [Roles](building-sites/client-proofing/security/roles "Roles"). | +| `edit_snippet` | To edit any [Snippets](extending-modx/snippets "Snippets"). | +| `edit_static_resource` | To edit static resources, also requires edit\_document permission. | +| `edit_symlink` | To edit symlinks, also requires edit\_document permission. | +| `edit_template` | To edit any [Templates](building-sites/elements/templates "Templates"). | +| `edit_tv` | To edit any [Template Variables](building-sites/elements/template-variables "Template Variables"). | +| `edit_user` | To edit any [User](building-sites/client-proofing/security/users "Users"). | +| `edit_weblink` | To edit weblinks, also requires edit\_document permission. | +| `element_tree` | The ability to view the Elements Tree on the left nav. | +| `empty_cache` | To empty the site cache. | +| `error_log_erase` | To erase the error log. | +| `error_log_view` | To view the error log. | +| `events` | To view any System Events. | +| `export_static` | To export the site to static HTML. | +| `file_create` | To create a file. | +| `file_list` | To list files within a given physical directory. | +| `file_manager` | To use the file manager, including creating/deleting files. | +| `file_remove` | To delete physical files. | +| `file_tree` | To view the Files Tree on the left nav. | +| `file_unpack` | To extract zip archives. | +| `file_update` | To edit the content of physical files. WARNING: grants ability to execute arbitrary server-side code. | +| `file_upload` | To upload files to a directory. | +| `file_view` | To view the contents of a file. | +| `flush_sessions` | Can flush Sessions across the site. | +| `frames` | To use the MODX Manager UI at all. | +| `help` | To view the Help page. | +| `home` | To view the Welcome page. | +| `language` | To switch the current language in the manager. | +| `languages` | To edit or view Lexicon Languages. | +| `lexicons` | To edit or view Lexicons and [Internationalization](extending-modx/internationalization "Internationalization"). | +| `list` | Basic permission to "list" any object. List means to get a collection of objects. | +| `load` | Basic permission to "load" any object, or be able to return it as an instance at all. | +| `logout` | To be able to logout as a user. | +| `menu_reports` | Show the main menu item "Reports". | +| `menu_security` | Show the main menu item "Security". | +| `menu_site` | Show the main menu item "Site". | +| `menu_support` | Show the main menu item "Support". | +| `menu_system` | Show the main menu item "System". | +| `menu_tools` | Show the main menu item "Tools". | +| `menu_trash` | Show the main menu item "Trash Manager". | +| `menu_user` | Show the main menu item "User". | +| `menus` | To edit or save any top Menu items. | +| `messages` | To send or view any personal Messages. | +| `mgr_log_erase` | To clear the manager action log. | +| `mgr_log_view` | To view the manager action log. | +| `namespaces` | To edit or view [Namespaces](extending-modx/namespaces "Namespaces"). | +| `new_category` | To create a new Category. | +| `new_chunk` | To create a new [Chunk](building-sites/elements/chunks "Chunks"). | +| `new_context` | To create a new [Context](building-sites/contexts "Contexts"). | +| `new_document` | To create a new [Resources](building-sites/resources "Resources"). | +| `new_document_in_root` | To create a [Resource](building-sites/resources "Resources") at the site root. Replaces the removed `udperms_allowroot` setting. | +| `new_plugin` | To create a new [Plugin](extending-modx/plugins "Plugins"). | +| `new_propertyset` | To create a new Property Set. | +| `new_role` | To create a new [Role](building-sites/client-proofing/security/roles "Roles"). | +| `new_snippet` | To create a new [Snippet](extending-modx/snippets "Snippets"). | +| `new_static_resource` | To create a new Static Resource. | +| `new_symlink` | To create a new SymLink. | +| `new_template` | To create a new [Template](building-sites/elements/templates "Templates"). | +| `new_tv` | To create a new [Template Variable](building-sites/elements/template-variables "Template Variables"). | +| `new_user` | To create a new [User](building-sites/client-proofing/security/users "Users"). | +| `new_weblink` | To create a new WebLink. | +| `packages` | To use any Transport Packages in the [Package Management](extending-modx/transport-packages "Package Management") system. | +| `policy_delete` | To delete an Access Policy. | +| `policy_edit` | To edit an Access Policy. WARNING: combined with policy\_save permission, grants ability to escalate privileges, including security-related permissions. | +| `policy_new` | To create a new Access Policy. | +| `policy_save` | To save an Access Policy. | +| `policy_template_delete` | To delete an Access Policy Template. | +| `policy_template_edit` | To edit an Access Policy Template. | +| `policy_template_new` | To create a new Access Policy Template. | +| `policy_template_save` | To save an Access Policy Template. | +| `policy_template_view` | To view an Access Policy Template. | +| `policy_view` | To view an Access Policy. | +| `property_sets` | To view and edit [Properties and Property Sets](building-sites/properties-and-property-sets "Properties and Property Sets"). | +| `providers` | To view and edit [Providers](building-sites/extras/providers "Providers") across the site. | +| `publish_document` | To publish or unpublish any Resource. In the manager UI this is checked on the **`mgr`** context via `hasPermission('publish_document')`. A grant only on another context does not unlock manager publish controls. See [ACLs](building-sites/client-proofing/security/policies/acls#manager-publishing-and-multiple-groups). | +| `purge_deleted` | To empty the Recycle Bin. | +| `remove` | Basic permission to remove any object. | +| `remove_locks` | To remove all existing Locks throughout the site. | +| `resource_duplicate` | To duplicate a Resource. | +| `resource_quick_create` | To be able to use Quick Create Resource in the left-hand tree. | +| `resource_quick_update` | To be able to use Quick Edit Resource in the left-hand tree. | +| `resource_tree` | To view the Resource Tree in the left nav. | +| `resourcegroup_delete` | To delete a Resource Group. | +| `resourcegroup_edit` | To edit a Resource Group. | +| `resourcegroup_new` | To create a new Resource Group. | +| `resourcegroup_resource_edit` | To edit Resources in a Resource Group. | +| `resourcegroup_resource_list` | To view or list Resources in a Resource Group. | +| `resourcegroup_save` | To save a Resource Group. | +| `resourcegroup_view` | To list Resource Groups. | +| `save` | Basic save permission for any object. | +| `save_category` | To save any Categories. | +| `save_chunk` | To save any [Chunks](building-sites/elements/chunks "Chunks"). | +| `save_context` | To save any [Contexts](building-sites/contexts "Contexts"). | +| `save_document` | To save any [Resources](building-sites/resources "Resources"). | +| `save_plugin` | To save any [Plugins](extending-modx/plugins "Plugins"). | +| `save_propertyset` | To save any Property Sets. | +| `save_role` | To save any [Roles](building-sites/client-proofing/security/roles "Roles"). | +| `save_snippet` | To save any [Snippets](extending-modx/snippets "Snippets"). | +| `save_template` | To save any [Templates](building-sites/elements/templates "Templates"). | +| `save_tv` | To save any [Template Variables](building-sites/elements/template-variables "Template Variables"). | +| `save_user` | To save any [User](building-sites/client-proofing/security/users "Users"). | +| `search` | To use the Search page. | +| `set_sudo` | To make any User sudo. | +| `settings` | To view and edit any System Settings. | +| `source_delete` | To delete a Media Source. | +| `source_edit` | To edit a Media Source. | +| `source_save` | To create or save a Media Source. | +| `source_view` | To view and list Media Sources. | +| `sources` | To manage Media Sources and Media Source Types. | +| `steal_locks` | To "steal" locks, overriding a current lock on a document. | +| `tree_show_element_ids` | Show the IDs in the Elements tree. | +| `tree_show_resource_ids` | Show the IDs in the Resource tree. | +| `undelete_document` | To undelete any Resource. | +| `unlock_element_properties` | To be able to edit the default properties for any Element. | +| `unpublish_document` | To unpublish any Resources. | +| `usergroup_delete` | To delete a User Group. | +| `usergroup_edit` | To edit a User Group. WARNING: exposes UserGroup Settings which can override security-related System Settings, such as uploadable file types and API credentials. | +| `usergroup_new` | To create a new User Group. | +| `usergroup_save` | To save a User Group. | +| `usergroup_user_edit` | To edit Users in a User Group. | +| `usergroup_user_list` | To view or list Users in a User Group. | +| `usergroup_view` | To view a User Group. | +| `view` | Basic permission to "view" any object. | +| `view_category` | To view any Categories. | +| `view_chunk` | To view any [Chunks](building-sites/elements/chunks "Chunks"). | +| `view_context` | To view any [Contexts](building-sites/contexts "Contexts"). | +| `view_document` | To view any [Resources](building-sites/resources "Resources"). | +| `view_element` | To get a list of Elements or Element classes. | +| `view_eventlog` | To view the Event Log. | +| `view_offline` | To be able to view the site when it is in offline status. | +| `view_plugin` | To view any [Plugins](extending-modx/plugins "Plugins"). | +| `view_propertyset` | To view any Property Sets. | +| `view_role` | To view any [Roles](building-sites/client-proofing/security/roles "Roles"). | +| `view_snippet` | To view any [Snippets](extending-modx/snippets "Snippets"). | +| `view_sysinfo` | To view the system info page. | +| `view_template` | To view any [Templates](building-sites/elements/templates "Templates"). | +| `view_tv` | To view any [Template Variables](building-sites/elements/template-variables "Template Variables"). | +| `view_unpublished` | To view any unpublished [Resources](building-sites/resources "Resources"). | +| `view_user` | To view any [User](building-sites/client-proofing/security/users "Users"). | +| `workspaces` | To utilize [Package Management](extending-modx/transport-packages "Package Management"). | ## Custom Permissions -If you have created your own actions and menu items (e.g. if you have created a [Custom Manager Page](extending-modx/custom-manager-pages "Custom Manager Pages Tutorial")), then you can define custom permission items when you create the menu item (System --> Actions --> Create Menu) that correspond to permissions listed here. +If you have created your own actions and menu items (e.g. a [Custom Manager Page](extending-modx/custom-manager-pages "Custom Manager Pages Tutorial")), then you can define custom permission items for them. Create the menu item (System --> Actions --> Create Menu) and let the permission items match those listed here. ![](modx+custom+permission.jpg) ## See Also -1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/policies/permissions/index.md b/en/building-sites/client-proofing/security/policies/permissions/index.md index 4c1bfdf3e..f5987259d 100644 --- a/en/building-sites/client-proofing/security/policies/permissions/index.md +++ b/en/building-sites/client-proofing/security/policies/permissions/index.md @@ -1,48 +1,49 @@ --- title: "Permissions" +description: "The permissions of MODX: what a single permission is, and how the policies group them." _old_id: "217" _old_uri: "2.x/administering-your-site/security/policies/permissions" --- ## What is a Permission? -A Permission in Revolution is a single access control that allows or denies execution of a single task. You can think of a permission as a checkbox: can a user perform an action or not? +A Permission in MODX is a single access control that allows or denies execution of a single task. You can think of a permission as a checkbox: can a user perform an action or not? -An example Permission is "content\_types" - if a user's Policy does not contain this Permission, then the user will not be able to perform that action. In this case, the user can not view the Content Types page. +An example Permission is `content_types`: if a user's Policy does not contain it, the user cannot perform that action. In this case, the user can not view the Content Types page. -Normally you don't deal with permissions individually, but in groups called [Access Policies](building-sites/client-proofing/security/policies "Policies"). An [Access Policy](building-sites/client-proofing/security/policies "Policies") is a list of individual permissions (also called an Access Control List or ACL). For example, if you need to grant users the permissions necessary to edit content in the manager, you can assign them to use the "Content Editor" policy. +Normally you don't deal with permissions individually, but in groups called [Access Policies](building-sites/client-proofing/security/policies "Policies"). An [Access Policy](building-sites/client-proofing/security/policies "Policies") is a list of individual permissions (also called an Access Control List or ACL). For example, to grant users the permissions needed to edit content in the manager, assign them the "Content Editor" policy. -MODX permissions are always additive: if a permission exists on "Access Policy A" and not on "Access Policy B" and you add both policies to a user, the effective policy is a collection of all the permissions defined in both policies. Adding more policies will never remove permissions for a user. For example, if you add a limited "Load Only" policy to an administrator user, the administrator user will still be able to do all the things defined in the Administrator policy. +MODX permissions are always additive. If a permission exists on "Access Policy A" and not on "Access Policy B", and you add both policies to a user, the effective policy holds the permissions of both. Adding more policies will never remove permissions for a user. For example, if you add a limited "Load Only" policy to an administrator user, that user still can do everything the Administrator policy defines. ## Usage In practice, Access Policies are associated with User Groups (not with individual users). Access Policies are associated with a User Group, and users may be added to the group. -Access Policies (ACLs) define lists of permissions (see Menu --> Access Controls). These lists contain groups of permissions that belong together. +Access Policies (ACLs) define lists of permissions (see the lock icon in the user menu → **Access Control Lists**). These lists contain groups of permissions that belong together. -1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) +1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) +2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + +Policy Templates organize the lists of permissions in the Access Policies. An Access Policy is a list of checkboxes, the Policy Templates define which checkboxes are available for an Access Policy. Because the full list of permissions may be quite long, it's not efficient to define Access Policies while having to wade through hundreds of checkboxes. Policy Templates allow you to narrow down the options available to an Access Policy. ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) - -There are also "Policy Templates" -- these help organize the lists of permission in the Access Policies. An Access Policy is a list of checkboxes, the Policy Templates define which checkboxes are available for an Access Policy. Because the full list of permissions may be quite long, it's not efficient to define Access Policies while having to wade through hundreds of checkboxes. Policy Templates allow you to narrow down the options available to an Access Policy. diff --git a/en/building-sites/client-proofing/security/policies/permissions/resource-policy.md b/en/building-sites/client-proofing/security/policies/permissions/resource-policy.md index 73c778b03..0e43bc8e8 100644 --- a/en/building-sites/client-proofing/security/policies/permissions/resource-policy.md +++ b/en/building-sites/client-proofing/security/policies/permissions/resource-policy.md @@ -1,5 +1,6 @@ --- title: "Resource Policy" +description: "The Resource policy of MODX and the permissions it holds." _old_id: "219" _old_uri: "2.x/administering-your-site/security/policies/permissions/permissions-resource-policy" --- @@ -11,24 +12,42 @@ This policy is packaged into MODX and is given to users on any context who want ## Default Permissions | Name | -|------| -| add\_children | -| create | -| delete | -| list | -| load | -| move | -| publish | -| remove | -| save | -| steal\_lock | -| undelete | -| unpublish | -| view | +| --- | +| `add_children` | +| `copy` | +| `create` | +| `delete` | +| `list` | +| `load` | +| `move` | +| `publish` | +| `remove` | +| `save` | +| `steal_lock` | +| `undelete` | +| `unpublish` | +| `view` | Do not confuse Resource permissions `publish` / `unpublish` with Administrator/context permission `publish_document`. The manager publish checkbox, dates, tree actions, and publish processors gate on `publish_document` for the **`mgr`** context. Resource `publish` / `unpublish` alone will not open those controls. See [ACLs: Manager publishing and multiple groups](building-sites/client-proofing/security/policies/acls#manager-publishing-and-multiple-groups). ## See Also -1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/policies/policytemplates.md b/en/building-sites/client-proofing/security/policies/policytemplates.md index d51fe741b..609f22fe0 100644 --- a/en/building-sites/client-proofing/security/policies/policytemplates.md +++ b/en/building-sites/client-proofing/security/policies/policytemplates.md @@ -1,18 +1,19 @@ --- title: "PolicyTemplates" +description: "The policy templates of MODX and the groups that organise them." _old_id: "244" _old_uri: "2.x/administering-your-site/security/policies/policytemplates" --- ## What are Policy Templates? -Policy Templates define which permissions are _available_ to an [Access Policy](building-sites/client-proofing/security/policies "Policies"). A Policy Template does not say if a permission is actually granted or denied (the Access Policy does that), it just defines which permissions the Access Policy should be able to check or uncheck. Having a Policy Template is useful if need to narrow down the list of available permissions you want to define in an Access Policy. +Policy Templates define which permissions are _available_ to an [Access Policy](building-sites/client-proofing/security/policies "Policies"). A Policy Template does not say if a permission is granted or denied (the Access Policy does that). It only defines which permissions the Access Policy can check or uncheck. Having a Policy Template is useful if need to narrow down the list of available permissions you want to define in an Access Policy. Although there is some overlap between the specific permissions defined in each policy template, each template contains _mostly_ unique permissions. Each template defines all the permissions that apply to the Access Control Lists (ACLs) they target; each is meant to be self-contained. ### AdministratorTemplate -Defines all permissions for working in the MODX manager. In other words, it defines what actions can be taken from a context. Generally policies based on this template are not used in contexts other than manager unless users need to execute processors from them (like front-end extension). [See all Administrator Policy Permissions](building-sites/client-proofing/security/policies/permissions/administrator-policy "Permissions - Administrator Policy") +Defines all permissions for working in the MODX manager. In other words, it defines what actions can be taken from a context. Generally policies based on this template are not used in contexts other than manager unless users need to execute processors from them (like front-end extension). [See all Administrator Policy Permissions](building-sites/client-proofing/security/policies/permissions/administrator-policy "Administrator Policy") ### ElementTemplate @@ -28,30 +29,48 @@ Generic xPDOObject permissions for any modAccessibleObject to make use of. ### ResourceTemplate -Resource defines extra permissions associated with Resource Group ACLs. [See all Resource Policy permissions](building-sites/client-proofing/security/policies/permissions/resource-policy "Permissions - Resource Policy") +Resource defines extra permissions associated with Resource Group ACLs. [See all Resource Policy permissions](building-sites/client-proofing/security/policies/permissions/resource-policy "Resource Policy") ### ContextTemplate Context defines context access when administration actions are not involved. +### NamespaceTemplate + +Namespace holds the three permissions of a namespace: `list`, `load` and `view`. + +## Policy Template Groups + +The templates are put into groups, and the group decides in which part of the list of the policies a policy shows up. MODX 3 ships with seven groups: + +| Group | The templates in it | +| --- | --- | +| Administrator | AdministratorTemplate | +| Object | ObjectTemplate | +| Resource | ResourceTemplate | +| Element | ElementTemplate | +| MediaSource | MediaSourceTemplate | +| Namespace | NamespaceTemplate | +| Context | ContextTemplate | + ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/resource-groups.md b/en/building-sites/client-proofing/security/resource-groups.md index ff7428b02..b70bb83ba 100644 --- a/en/building-sites/client-proofing/security/resource-groups.md +++ b/en/building-sites/client-proofing/security/resource-groups.md @@ -1,5 +1,6 @@ --- title: "Resource Groups" +description: "The resource groups of MODX: how they collect the resources and how a group gets access to them." _old_id: "261" _old_uri: "2.x/administering-your-site/security/resource-groups" --- @@ -14,7 +15,7 @@ You can manage the pages in a Resource Group in two different ways: ### Option 1 -Go to Security -> Resource Groups. From there you will see a list of all defined Resource Groups and a tree of Resources. +Go to the lock icon in the user menu → **Resource Groups**. From there you will see a list of all defined Resource Groups and a tree of Resources. Drag the Resources from the right tree directly into Resource Groups in the left tree: diff --git a/en/building-sites/client-proofing/security/roles.md b/en/building-sites/client-proofing/security/roles.md index 307b875d8..d400912d8 100644 --- a/en/building-sites/client-proofing/security/roles.md +++ b/en/building-sites/client-proofing/security/roles.md @@ -1,24 +1,39 @@ --- title: "Roles" +description: "The roles of MODX: the number of authority they carry and how it is compared with the access of a group." _old_id: "268" _old_uri: "2.x/administering-your-site/security/roles" --- ## What is a Role? -A role is a position or status held within a certain situation. In MODX, it can be used to group Users into a position or status within a User Group, e.g. "Editor" or "Front-end Read Only". +A Role groups the Users of a User Group by position or status, e.g. "Editor" or "Front-end Read Only". -Roles in MODX use an integer value called "Authority". **Lower numbers represent a stronger authority.** E.g. a Role with Authority 10 will inherit any and all Group Policies assigned to itself and to any roles defined with Authority 11, but a user Role with Authority 11 does NOT inherit any of the Group Policies from Role 10. +Roles use an integer value called "Authority". **Lower numbers represent a stronger authority.** A user passes the check of an ACL when the authority of their role is **not greater** than the authority of the ACL. A user with a role of authority 10 passes every ACL that a user with a role of authority 11 passes. -Be sure you clarify your language when talking about Authority because this inverse relationship can lead to some confusing sentences. +Be sure you clarify your language when talking about Authority because this inverse relationship can lead to some confusing sentences. It helps to think of "Authority" as ordinal numbers: first, second, third, etc. **Authority=1** is the first authority and trumps **Authority=2** (i.e. the second authority). -It helps to think of "Authority" as ordinal numbers: first, second, third, etc. **Authority=1** is the first authority and trumps **Authority=2** (i.e. the second authority). +**The authority numbers are unique** +The database will not let you create two roles with the same authority: the column has a unique index. -You should generally avoid duplicate authority numbers. +## The Roles of MODX + +MODX 3 ships with two roles: + +| Role | Authority | +| --- | --- | +| Member | 9999 | +| Super User | 0 | + +The role **Super User** passes the check of every ACL, because the authority of an ACL is never below 0. The role **Member** passes only the ACLs whose authority is 9999 or more. + +## The Permissions of the Page + +The page of the roles needs the permission `view_role` to see the list, `new_role` and `save_role` to create a role, `edit_role` to change one, and `delete_role` to delete one. ## Usage -One common example is to create Roles that mimic a basic employee position structure. Let's say we create the following Roles and Authority levels: +A common example is to create Roles that mimic a basic employee position structure. Let's say we create the following Roles and Authority levels: - Administrator - 0 - Director - 1 @@ -30,37 +45,37 @@ One common example is to create Roles that mimic a basic employee position struc We can then create a User Group called "HR Department". Within that User Group, we'll assign Users to those Roles (you can have multiple Users per Role, as well). -Now, let's say John has a Role of Coordinator. Mark has a Role of Supervisor. We're going to give Mark's "HR Deparment" User Group an Access Policy (which is a set of Permissions) called "AccountPolicy" that has the following Access Permissions in it: +Now, let's say John has a Role of Coordinator. Mark has a Role of Supervisor. We're going to give Mark's "HR Department" User Group an Access Policy called "AccountPolicy". It holds the following Access Permissions: -- view\_accounts -- save\_accounts +- `view_accounts` +- `save_accounts` We've assigned this Policy to the "web" context for our User Group "HR Department". We then set its Minimum Role value to "Supervisor": ![](ug-ctx-grid1.png) -This means that Mark has these Permissions, since he's in the User Group, and has at least the Role of "Supervisor" (which is the Role he has, specifically). +This means that Mark has these Permissions: he's in the User Group and has at least the Role of "Supervisor". -But this **also** means that John has these Permissions as well, since he is a "Coordinator" which has a stronger Authority level than "Supervisor". So, John as Coordinator has "inherited" the Permissions than Mark had as Supervisor. +But this **also** means that John has these Permissions as well, since he is a "Coordinator" which has a stronger Authority level than "Supervisor". So, John as Coordinator has the Permissions that Mark had as Supervisor. ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md b/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md index 349f8a7fb..ab40479af 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md +++ b/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md @@ -1,32 +1,33 @@ --- title: "Creating a Second Super Admin User" +description: "Create a second administrator of MODX, with the group and the role that give the rights." _old_id: "74" _old_uri: "2.x/administering-your-site/security/security-tutorials/creating-a-second-super-admin-user" --- ## The Problem -You want another MODX Revolution User to have full manager access, with all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. Perhaps it's your colleague or your client, but by creating another Administrator, you are handing over the keys to the _entire_ site. This is a simplistic scenario: the other admin would be able to modify or delete your user, so it may not be a viable solution for what you need to do. In the process of walking users through this task, this page gives a brief introduction to roles and access policies. +You want another User to have full manager access, with all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. Perhaps it's your colleague or your client, but by creating another Administrator you are handing over the keys to the _entire_ site. This is a simplistic scenario. The other admin could modify or delete your user, so this may not be a viable solution for what you need. ## The Solution After logging into your site's manager, do the following: -1. Create a new user: Manage -> Users -> New User (Button) +1. Create a new user: the lock icon in the user menu → **Users** -> New User (Button) 2. Be sure you give the new user a unique username, password, and email. -3. Before saving the user, click the tab marked **Access Permissions** and click the button marked **Add User Group to User** +3. Before saving the user, click the tab marked **Access Permissions** and click the button marked **Add User to Group** 1. **User Group:**`Administrator` 2. **Role:**`Super User` -4. Save the user. (You can always return to Security -> Manage Users and right-click the user to update the properties). +4. Save the user. (You can always return to the lock icon in the user menu → **Users** and right-click the user to update the properties). 5. Try logging in to the manager using a different browser to verify that the login works. ## Why can't I add another Administrator with a different [Role](building-sites/client-proofing/security/roles "Roles"), e.g. a "Member"? -Try it. When you try to login using the other username with only a "Member" role, permission will be denied. But why? It has to do with [Context Access](building-sites/contexts "Contexts") and [Access Policies](building-sites/client-proofing/security/policies "Policies"), which get a lot more complicated in a hurry. If you have a look at Security -> Access Controls and then right-click the Administrator User Group -> Update User Group, then click on the **Context Access** tab. You'll see something like this: +Try it. When you try to login using the other username with only a "Member" role, permission will be denied. But why? It has to do with [Context Access](building-sites/contexts "Contexts") and [Access Policies](building-sites/client-proofing/security/policies "Policies"), which get a lot more complicated in a hurry. Have a look at the lock icon in the user menu → **Access Control Lists**, right-click the Administrator User Group -> Update User Group, then click **Context Access**. You'll see something like this: ![](user-group-perms.jpg) -By default, MODX Revolution has 2 contexts: **web** (the front-end) and **mgr** (the back-end). From this table, we can learn 2 things: that the _minimum_ role is the Super-User role, and the "Access Policy" in use for this context is "Administrator". Even if you don't understand what all of that means, this is a good place to start educating you about permissions. +By default, MODX has 2 contexts: **web** (the front-end) and **mgr** (the back-end). From this table we can learn 2 things: the _minimum_ role is the Super-User role, and the "Access Policy" for this context is "Administrator". Even if you don't understand what all of that means, this is a good place to start educating you about permissions. ### Minimum Role @@ -34,18 +35,33 @@ From the Context Access screen, you can see that you have to be at least a "Supe ### Roles -While we're at it, why would you want to give another user another role if he or she was going to have the _exact_ same privileges as you? Technically speaking, if they have the exact same privileges, then their role is equivalent to yours. In other words, you don't need a new role. +While we're at it, why give another user another role if they are going to have the _exact_ same privileges as you? Technically speaking, if they have the exact same privileges, then their role is equivalent to yours. In other words, you don't need a new role. When thinking about roles, think about that access policy there. The access policy says what your user can and can't do if you are assigned a particular role. ## See Also -See the other tutorial about [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access") for an example of how to create a user with a permission level of less than you. - -Shaun McCormick's video on [Understanding MODX Revolution Security](http://vimeo.com/13856994) gives a detailed walk-through of setting up some complex permission schemes. - -1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) + +Related resources for this tutorial: + +- [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access") — an example of how to create a user with a permission level of less than yours. +- Shaun McCormick's video on [Understanding MODX Revolution Security](http://vimeo.com/13856994) — a detailed walk-through of setting up complex permission schemes. diff --git a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index e7dfc35ac..72deb0e40 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -1,24 +1,25 @@ --- title: "Giving a User Manager Access" +description: "Give a user in MODX the rights of a manager: the group, the roles and the policy that do it." _old_id: "155" _old_uri: "2.x/administering-your-site/security/security-tutorials/giving-a-user-manager-access" --- ## The Problem - You want a User to have manager editing access, but not have all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. This tutorial, partially written by BobRay, will help you through that. +You want a User to have manager editing access, but not have all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. This tutorial, partially written by BobRay, will help you through that. ## The Solution 1. In Access Controls ->Roles, create a new role (lets call it "Editor") with an authority of 10. -2. In Settings -> Access Control Lists -> Access Policies, duplicate the administrator policy and rename it to whatever you want, for our example we'll use "AdminLite". +2. In the lock icon in the user menu → **Access Control Lists** → the tab **Policies**, duplicate the administrator policy and rename it. For our example we'll use "AdminLite". 3. Edit the AdminLite Policy to use whatever [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") you want the User to have. -4. In Settings -> Access Control Lists -> User Groups, right click on the "Administrator" group and select "Update User Group." +4. In the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users**, right click the "Administrator" group and select "Update User Group.". 5. On the Permissions -> Context Access tab, add two new entries to the grid: 1. Context: 'mgr' Minimum Role: 'Editor', Access Policy 'AdminLite' 2. Context: 'web' Minimum Role: 'Editor', Access Policy 'Load, List and View' -6. In Manage -> Users, create the new user, or edit existing, and via the Access Permissions tab, assign them to the Administrator group with a role of Editor. -7. Click on Security -> Flush Sessions and re-login. +6. In the lock icon in the user menu → **Users**, create the new user or edit an existing one. On the Access Permissions tab, assign them to the Administrator group with a role of Editor. +7. Click on **Logout All Users** and re-login. ## Publishing in the manager @@ -32,8 +33,22 @@ More detail: [ACLs: Manager publishing and multiple groups](building-sites/clien ## See Also -1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) \ No newline at end of file +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/security-tutorials/index.md b/en/building-sites/client-proofing/security/security-tutorials/index.md index d9e89cb46..108bde423 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/index.md +++ b/en/building-sites/client-proofing/security/security-tutorials/index.md @@ -1,5 +1,6 @@ --- title: "Security Tutorials" +description: "The tutorials of the security section of MODX: member-only pages, managers, the anonymous user and the access to the elements." _old_id: "271" _old_uri: "2.x/administering-your-site/security/security-tutorials" --- diff --git a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index 2843a74e0..6efa7c136 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -1,134 +1,106 @@ --- title: "Making Member-Only Pages" +description: "Protect the pages of a MODX site so that only the members of a group can see them." _old_id: "186" _old_uri: "2.x/administering-your-site/security/security-tutorials/making-member-only-pages" --- -## Introduction +## The Steps -MODX Revolution uses a whole new set of security systems to allow you more flexibility while giving your users access (or denying) to Manager and Web resources. As there seems to be need for a proper tutorial to get you into the basics of working with this advanced system this document has been written. - -It's common to have pages in the front end of a site that can only be seen by certain users. This tutorial describes how to do that in MODX Revolution. It assumes that you already know how to let users register and log in using the components in the [Login](/extras/login "Login") package. The process described below will have no effect on which resources users can see or edit in the MODX Manager. - -For those that are savvy enough, below follows a simple list to help you through the maze or to remind you how it works. If you need more information and would like some examples, scroll down to the related subsection below. - -1. Create a Resource Group (Security -> Resource Groups -> Create Resource Group) +1. Create a Resource Group (the lock icon in the user menu → **Resource Groups** → **Create Resource Group**) 2. Link your member-only resource to the Resource Group. (By editing the resource, or by dragging them from the resource tree to the right) -3. Create a User Group (Security -> Access Controls -> User Groups -> New User Group) +3. Create a User Group (the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> New User Group) 4. Add a resource group entry on the Resource Group Access tab (context: web, minimum role: Member (9999), access policy: Resource) -5. Add users to the user group with the role of Member. (Security -> Manage Users) -6. Flush permissions (Security -> Flush Permissions) and try it in another browser (not just another browser window: another browser) +5. Add users to the user group with the role of Member. (the lock icon in the user menu → **Users**) +6. Flush permissions (**Flush Your Permissions**) and try it in another browser (not just another browser window: another browser) -## Access Wizard explanation (2.2.2 and later) +This tutorial describes how to protect the pages of the front end of a site so that only certain users can see them. It assumes that you already know how to let users register and log in using the components in the [Login](/extras/login "Login") package. The process described below has no effect on which resources users can see or edit in the manager. -MODX 2.2.2 ships with an access wizard that simplifies this process. The step-by-step explanation is still valid, but the access wizard simplifies the process. You may wish to read both explanations to gain a better understanding of how each aspect of MODX's security system interacts. +## Access Wizard + +The wizard of the resource group walks you through the whole process. The result is the same as when you set every step by hand. ### 1. Create a Resource Group -Go to Security -> Resouce Groups and click the Create Resource Group. A window similar to this should pop up: ![](create-resource-group.png) +A [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") is a collection of resources which you can link to user groups and access list entries. When you have created a resource group, you can easily classify pages to be only visible for certain user groups, or roles within user groups. + +Go to the lock icon in the user menu → **Resource Groups** and click the Create Resource Group. A window similar to this should pop up: ![](create-resource-group.png) Let's go over each section: -| Section | Explanation | Tutorial Default | -| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| Name | This is the name of the resource group that we're generating. Make it descriptive and easy-to-remember. | Protected | -| Contexts | This is the context where you want the rules to apply. For this tutorial, we only have one context, "web", and we only want to hide things there. | web | -| Automatically give Administrator Group Access | Checking this box will give all users in the default administrator group access to the resource group. As of 2.2.1, the default admin user is marked as a "sudo" user and they can view all resource groups, regardless of whether the administrator group has access. However, if there are any other administrators that don't have sudo access and we want them to be able to view the resources in the resource group, we should check that box. | checked | -| Automatically give Anonymous Group Access | Checking this box will give all users in the anonymous user group access to the resource group. When someone comes to your website and they're not logged into anywhere, they're considered in the anonymous user group. We want to protect our pages from users who aren't logged in, so let's leave this box unchecked for this tutorial. | unchecked | -| Create Parallel User Group | You may not wish to have everyone who can view the member-only pages be in the administrator group (if you've checked the "Automatically give Administrator Group Access" option). In this case, you can create another user group that has access to the resources in this resource group. Let's check that, as our members aren't administrators. | checked | -| Automatically Give Other User Groups Access | If you have any other user groups that you've defined previously to this tutorial to whom you want to give access, you can list them here. | | +| Section | Explanation | Tutorial Default | +| --- | --- | --- | +| Name | The name of the resource group that we're generating. Make it descriptive and easy-to-remember. | Protected | +| Contexts | The context where you want the rules to apply. For this tutorial, we only have one context, "web", and we only want to hide things there. | web | +| Automatically give Administrator Group Access | Checking this box will give all users in the default administrator group access to the resource group. The default admin user is marked as a "sudo" user, and a sudo user bypasses the checks of the policies, so they see all resource groups regardless of whether the administrator group has access. However, if there are any other administrators that don't have sudo access and we want them to be able to view the resources in the resource group, we should check that box. | checked | +| Automatically give Anonymous Group Access | Checking this box will give the anonymous user access to the resource group. When someone comes to your website and is not logged in, they are the anonymous user. We want to protect our pages from users who aren't logged in, so let's leave this box unchecked for this tutorial. | unchecked | +| Create Parallel User Group | You may not wish to have everyone who can view the member-only pages be in the administrator group (if you've checked the "Automatically give Administrator Group Access" option). In this case, you can create another user group that has access to the resources in this resource group. Let's check that, as our members aren't administrators. | checked | +| Automatically Give Other User Groups Access | If you have any other user groups that you've defined previously to this tutorial to whom you want to give access, you can list them here. | | -Great! We have a resource group and a user group created. We now need to add resources to the resource group and users to that user group and then we'll be laughing. +Great! We have a resource group and a user group created. We now need to add resources to the resource group and users to that user group. ### 2. Add Resources to the Resource Group -Tell MODX which Resources to protect. Stay on the page from Step 1 (Security > Resource Groups). On the right, open the web context to see the pages on your site. Drag them from the right column into your Resource Group. Or edit each Resource, open the Resource Groups tab, and check **Access** on the "Protected" row. +Tell MODX which Resources to protect. Stay on the page from Step 1 (the lock icon in the user menu → **Resource Groups**). On the right, open the web context to see the pages on your site. Drag them from the right column into your Resource Group. Or edit each Resource, open the Resource Groups tab, and check **Access** on the "Protected" row. ### 3. Add Users to the User Group -Okay, we've had enough of the Resource Group page. Go to Security > Access Controls. In the Users Groups tab, we can see a list of all of the user groups on our site. Right click on the "Protected" User group. Select "Add User to Group". For the "Name", select the user you want in the user group. For the Role, let's select "Member" for now. Roles define what an individual user can do within a user group, but we don't need that fine of control for this tutorial. Click Save. +Go to the lock icon in the user menu → **Access Control Lists**. In the Users Groups tab, we can see a list of all of the user groups on our site. Right click on the "Protected" User group. Select "**Add User to Group**". For the "Name", select the user you want in the user group. For the Role, let's select "Member" for now. Roles define what an individual user can do within a user group, but we don't need that fine of control for this tutorial. Click Save. + +As soon as you have protected a resource by (1) assigning it to one or more resource groups and (2) linking the group to a user group with an access control, those pages no longer show up for users that are not linked to it. The default behavior in that case is displaying the 404-error page. If you would rather return the 401-error, give the anonymous user "load" permission for the resource group; more about this in a later tutorial. At this moment in the tutorial, your page is not visible yet, because you have not added it to a user group. -It is important to realize that as soon as you have protected a resource by (1) assigning it to one or more resource groups and (2) linking the resource group to a user group using an access control, those pages will no longer show up for users that are not linked to the resource group. The default behavior in that case is displaying the 404-error page. If you would rather return the 401-error, you will need to give the anonymous user group "load" permission for the resource group. More about this in a later tutorial. At this moment in the tutorial, your page will not be visible as you have not yet added it to a user group. +When you use a websignup snippet, make sure it puts the new users into the right user group. -We now have our resources in a resource group, and users in a user group. Done? Sorry, we have a few small things to do first. If you're following this tutorial and this is your first foray into MODX security, you will likely run into a small but important snag: the user group we created doesn't have context access to our front end context, web. In other words, if we could view that context, we could view those protected resources -- but we can't currently view that context. Let's give our user group permission to view that context. +We now have our resources in a resource group, and users in a user group. Done? Sorry, we have a few small things to do first. If you're following this tutorial and this is your first foray into MODX security, you will likely run into a small but important snag. The user group we created has no context access to our front end context, web. In other words, if we could view that context, we could view those protected resources — but we can't currently view that context. Let's give our user group permission to view it. ### 4. Add Context Access to the User Group -Go to Security > Access Controls. Right click on the protected user group. Select "Update user group". Go to the Context Access tab. Click "Add Context". We are presented with a dialog such as the one below. Let's break it down: ![](context-access.png) +Go to the lock icon in the user menu → **Access Control Lists**. Right click on the protected user group. Select "Update user group". Go to the Context Access tab. Click "Add Context". We are presented with a dialog such as the one below. Let's break it down: ![](context-access.png) -| Section | Explanation | Tutorial Default | -| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| Context | This specifies to which context we're giving access. The basic use case will have web and mgr. Web is the public front-end of your website, and mgr is the private back-end of your website (i.e., the manager that you're logged in). | web | -| Minimum Role | This specifies what user roles this rule will apply to. If we want all users in this user group, select "Member - 9999". This is where some of that fine control comes in that we talked about earlier. | Member - 9999 | -| Access Policy | This specifies what permissions we're giving to the users. Different policies will allow user groups to do different things. | Administrator | +| Section | Explanation | Tutorial Default | +| --- | --- | --- | +| Context | This specifies to which context we're giving access. The basic use case will have web and mgr. Web is the public front-end of your website, and mgr is the private back-end of your website (i.e., the manager that you're logged in). | web | +| Minimum Role | This specifies what user roles this rule will apply to. If we want all users in this user group, select "Member - 9999". This is where some of that fine control comes in that we talked about earlier. | Member - 9999 | +| Access Policy | This specifies what permissions we're giving to the users. Different policies will allow user groups to do different things. | Administrator | -Let's make one rule with "web", "Member - 9999", and "Load, List and View". If we want users to be able to view the MODX manager, we can add a second rule to give them access to the mgr context: "mgr", "Member - 9999", and "Administrator". All these users will have admin access. If you would prefer to limit their permissions, you could instead choose "Content Editor" or "Developer" for their access policies. Alternatively, you can make your own in Security > Access Policies if you want to be specific about what users can or can't do. +Let's make one rule with "web", "Member - 9999", and "Load, List and View". If we want users to be able to view the manager, we can add a second rule for the mgr context: "mgr", "Member - 9999", and "Administrator". Those users get admin access. If you would prefer to limit their permissions, you could instead choose "Content Editor" or "Developer" for their access policies. Alternatively, you can make your own policy in the lock icon in the user menu → **Access Control Lists** → the tab **Policies**, if you want to be specific about what users can do. -We now have users in a user group, resources in a resource group, and that user group can view the context. We're so close! +We now have users in a user group, resources in a resource group, and that user group can view the context. ### 5. Flush Permissions -Before you can see a change, you need to reset / flush what your individual users can see and do. Go to Security > Flush Permissions. To test this in the front end, you must use a different browser. 90% of your grief will come from not testing in a different browser or flushing your permissions, so don't be lazy and open that second browser up. Congratulations, you now have members-only pages! +Before you can see a change, you need to reset / flush what your individual users can see and do. Go to **Flush Your Permissions**. To test this in the front end, you must use a different browser. Most of the trouble comes from not testing in a different browser or flushing your permissions. Don't be lazy: open that second browser. Congratulations, you now have members-only pages! In some cases you may need to clear the site cache, specifically for the mgr (manager) context as elements and resources may cache their permissions. -## Step-by-step explanation (pre-2.2.2) - -If you're not quite as savvy, or would rather also know what happens when you set a certain permission or make an access entry, you might find this section interesting. As of 2.2.2, MODX ships with an Access Wizard and you might wish to start with that. - -### 1. Create a Resource Group - -A [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") is a collection of resources which you can link to user groups and access list entries. When you have created a resource group, you can easily classify pages to be only visible for certain user groups, or roles within user groups. - -To create a resource group, navigate to Security -> Resource Groups and click on the Create Resource Group button. In the popup you are prompted to enter a name for the resource group. In the tutorial we expect you named it "Protected". - -### 2. Link your member-only resource to the Resource Group - -Now that you have a resource group, you should add resources to it. There are two ways to achieve this. - -First, go to Security -> Resource Groups and drag Resources from the right tree into the left groups ("Protected"). Or edit the Resource and check **Access** on the Resource Groups tab. - -### 3. Create a User Group - -You have a resource group with resource applied to them, now you'll need to decide who will be able to view the resources. For this, we'll make a new user group. - -To do this, go to Security -> Access Controls. On the (default) User Groups tab, click on the New User Group button. Choose a name for the group, and submit the form. - -### 4. Add Resource Group access - -Move on to the "Resource Group Access" tab. This tab defines the resource groups your user group has access to. Three out of four fields are similar to the Context Access groups, namely the Context, Minimum Role and Access Policy. A new one is Resource Group which, as you probably guessed, defines the resource group the user group can access. - -The settings: - -- Resource Group: whatever you named it, for example "Protected" -- Context: web -- Minimum role: Member (9999) -- Access Policy: Resource - -It is important to realize that as soon as you have protected a resource by (1) assigning it to one or more resource groups and (2) linking the resource group to a user group using an access control, those pages will no longer show up for users that are not linked to the resource group. The default behavior in that case is displaying the 404-error page. If you would rather return the 401-error, you will need to give the anonymous user group "load" permission for the resource group. More about this in a later tutorial. At this moment in the tutorial, your page will not be visible as you have not yet added it to a user group. - -### 5. Add users to the user group - -Now add some users to the user group. You can do this by editing the user, or by going back to the Users tab and adding them from there. It will ask for the User Group, as well as the Role. As we assumed the Member role with an authority of 9999, you can simply use that one. - -When using a websignup snippet, make sure it automatically puts them in the right user group. - -### 6. Flush permissions - -Now that all settings are done, you will need to flush permissions (Security -> Flush Permissions) before you will see an effect. Also make sure that, if you go to test it front-end, you use a different browser all together. Don't use a different tab or browser window, as it will still use your Manager login to check for permissions. - -Please note that in some cases it is also necessary to clear the site cache, specifically for the mgr (manager) context, as elements and resources may cache their permissions. - ## Still can't get it to work? Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then go to the Forums to ask for help. If you think the tutorial is misleading or inaccurate, please visit the forum topic (linked below) and post about what is incorrect so it can be fixed. ## See Also -Bob's permissions guide: - -Forum topic discussing this tutorial: - -Using the Login Snippet to set up a basic "Members Only" area: [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") - -Security: [Security](building-sites/client-proofing/security "Security") +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) + +Related resources for this tutorial: + +- Bob's permissions guide: +- Forum topic discussing this tutorial: +- Using the Login Snippet to set up a basic "Members Only" area: [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") diff --git a/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md b/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md index ae16525a3..b35c7378a 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md +++ b/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md @@ -1,33 +1,59 @@ --- title: "More on the Anonymous User Group" +description: "Who the anonymous user of MODX is, and how to give the visitor a different access than the default one." _old_id: "1352" _old_uri: "2.x/administering-your-site/security/security-tutorials/more-on-the-anonymous-user-group" --- ## Who's Anonymous? -Anyone who visits the site and is not logged in belongs to the Anonymous [User Group](building-sites/client-proofing/security/user-groups "User Groups"). +Anyone who visits the site and is not logged in is the anonymous user. -You can edit the User Group by navigating to the top menu item Security » Access Controls, User Groups tab. Then right-click on the Anonymous User Group's name and select "Update User Group". ![](access+controls.png) +**The anonymous user is not a User Group** +In the database there is no group "Anonymous". The anonymous user is an access control list with the principal `0`, and in the tree of the groups it shows up as a pseudo entry "(Anonymous)". You can edit that entry like any other group, but what you change is the access of the anonymous user. + +You reach it by navigating to the lock icon in the user menu → **Access Control Lists**, the tab **User Groups & Users**. Then right-click on the "(Anonymous)" entry and select "Update User Group". ![](access+controls.png) ## What Can Anonymous Users Do? -By default, Anonymous Users are granted Load Only permissions in every [Context](building-sites/contexts "Contexts") except the "mgr" Context. Without Load Only permissions, requests to the Context would result in a 404 Page Not Found response. +By default, the anonymous user is granted Load Only permissions in every [Context](building-sites/contexts "Contexts") except the "mgr" Context. Without Load Only permissions, requests to the Context would result in a 404 Page Not Found response. ![](user+group_+anonymous.png) Load Only permissions doesn't necessarily mean they can View the Resource (see below). -For example, if you create a [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") and grant access permissions to a specific User Group, the Anonymous User Group won't be able to access that Resource Group at all. This is the basis of [Creating Member Only Pages](administering-your-site/security/security-tutorials/making-member-only-pages "Making Member-Only Pages"). +For example, if you create a [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") and grant access permissions to a specific User Group, the anonymous user cannot access it. This is the basis of [Creating Member Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages "Making Member-Only Pages"). ### 401 vs 404 Response on Protected Pages -When you create protected Resource Groups, the Anonymous User Group won't have Load permissions on it by default - they will get a 404 Page Not Found response. If you want them to see a 401 Unauthorized response instead, you have to grant the Anonymous User Group access to the Resource Group with Load Only permissions. +When you create protected Resource Groups, the anonymous user has no Load permissions on it by default. They get a 404 Page Not Found response. To give them a 401 Unauthorized response instead, grant the anonymous user access to the Resource Group with Load Only permissions. -You can do this in the Resource Group Access tab of the Anonymous User Group editing page. +You can do this in the Resource Group Access tab of the editing page of the anonymous user. ![](screen+shot+2012-10-19+at+11.43.46+pm.png) -Click on "Add Resource Group", select the protected Resource Group in the dropdown, select the Context in which you want to grant access (don't select the "mgr" context) and choose Load Only as the Access Policy. Click "Save" and you're done. - -They still will not be able to view the Resources in that protected Resource Group - they will only be able to "Load" it, and get a 401 response. You can specify a Resource ID to serve as a custom Unauthorized page by using the [Unauthorized Page System Setting](building-sites/settings/unauthorized_page "unauthorized_page"). +Click on "Add Resource Group", select the protected Resource Group in the dropdown, and select the Context for the access (don't select the "mgr" context). Choose Load Only as the Access Policy, click "Save", and you're done. + +They still will not be able to view the Resources in that protected Resource Group. They will only be able to "Load" it, and get a 401 response. You can specify a Resource ID to serve as a custom Unauthorized page by using the [Unauthorized Page System Setting](building-sites/settings/unauthorized_page "unauthorized_page"). + +## See Also + +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md b/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md index e22f9dc97..a86018fc7 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md +++ b/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md @@ -1,14 +1,11 @@ --- title: "Restricting an Element from Users" +description: "Hide an element of MODX from the users who may not edit it, with the access to its category." _old_id: "486" _old_uri: "2.x/administering-your-site/security/security-tutorials/restricting-an-element-from-users" --- -## Introduction - -This tutorial teaches you how to restrict any Element (such as a Template, Snippet, etc) from view in the MODX manager. It uses Element Category ACLs to accomplish the task, which allow you to protect any Elements in Categories from view. Users in the Editors User Group will be able to see the elements, but they will be hidden from users outside the group. - -### Brief Summary +## Brief Summary 1. Create a Category or use an existing one 2. Place the Element you want to protect into your Category @@ -29,19 +26,17 @@ Edit the Element and set its Category to be the new Category created in step 1. ### 3. Create a User Group -Go to Security -> Access Controls in the top menu, and find the "User Groups" tab. Then either create a new User Group or select a prior one. From there, right-click on the User Group and select "Update User Group". - -For Revolution 2.3.x, the Access Control Lists menu item is found in the Admin menu (the gear icon). +Go to the lock icon in the user menu → **Access Control Lists** in the top menu, and find the "User Groups" tab. Then either create a new User Group or select a prior one. From there, right-click on the User Group and select "Update User Group". -If using the Access Wizard form, make sure the group is given "mgr" access in the Context field, and specify the Category in the Element Categories field. You can also put a list of users to be added to this group in the Users field. Right-click on the new User Group to update it if not using the Wizard. +If using the Access Wizard form, make sure the group gets "mgr" access in the Context field, and specify the Category in the Element Categories field. You can also put a list of users to be added to this group in the Users field. Right-click on the new User Group to update it if not using the Wizard. ### 4. Add the Users to the User Group -With the new User Group open for updating, find the Users tab, and then add any users you want to see the Element into this User Group. Make sure to give them a Role of **at least** Member. Alternately, you can add individual users to the new User Group from the User's editing page in the Access Permission tab. +With the new User Group open for updating, find the Users tab and add any users you want to see the Element. Make sure to give them a Role of **at least** Member. Alternately, you can add individual users to the new User Group from the User's editing page in the Access Permission tab. ### 5. Add the Element Category ACL -Find the "Element Category Access" tab on this screen. For Revolution 2.3.x, this will be in the sidebar of the User Group's Permissions tab. +Find the "Element Category Access" tab on this screen. The tab is in the panel of the group, next to the other access tabs. Click "Add Category" on the button above the grid. Select: @@ -54,7 +49,7 @@ Click "Add Category" on the button above the grid. Select: ### 6. Flush Permissions -On the top menu, find "Security -> Flush Permissions" and click it. For Revolution 2.3.x this is Manage -> Logout All Users. +On the top menu, find "**Flush Your Permissions**" and click it. Then the lock icon in the user menu → **Logout All Users**. This force everyone to log in again, and your Element Category will now be protected from users outside the Editors User Group. @@ -62,25 +57,24 @@ This force everyone to log in again, and your Element Category will now be prote Sometimes, you want to hide elements from all users who are not in the Administrator group. To do that, put the elements in a category as we did above, but connect it to the Administrator user group: -- Go to the Administrator User Group edit page (Security -> Access Controls -> User Groups -> right click on "Administrator" and select Update User Group) For Revolution 2.3.x this is Access Control Lists in the Admin menu (the gear icon). +- Go to the Administrator User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Administrator" and pick Update User Group - Find the Element Category Access tab - Add the following ACL entry, by clicking on "Add Category": - Category: your Category you made/selected earlier - - Minimum Role: admin Super User + - Minimum Role: Super User - Access Policy: Element - Context: mgr - Click on the "Save" button in the dialog - Click on the "Save" button at the upper right - -- click Security -> Flush All Sessions in the top menu. For Revolution 2.3.x this is Manage -> Logout All Users. +- Click the lock icon in the user menu → **Logout All Users**. Now, only the admin Super User can see the elements. ## Special Case for Templates -Lets say you restricted a Template with the method above. But you also want another User Group, which doesn't have access to the Template, the ability to edit (but not create!) Resources with that Template, and see the Template's TVs. Currently, the 2nd User Group (Let's call them Editors) would be able to see the Resource, and the ID of the Template will show in the Template combobox, but they wont be able to see the TVs. We need to add another ACL to the Editors User Group to get them to load the Template and its associated TVs. +Lets say you restricted a Template with the method above. But you also want another User Group to edit (but not create!) Resources with that Template, and to see its TVs, though it has no access to the Template. Currently, the 2nd User Group (let's call them Editors) would see the Resource, and the ID of the Template would show in the Template combobox, but they wouldn't see the TVs. We need another ACL on that group to get them to load the Template and its TVs. -- Go to the Editors User Group edit page (Security -> Access Controls -> User Groups -> right click on "Editors" and select Update User Group) +- Go to the Editors User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Editors" and pick Update User Group - Find the Element Category Access tab - Add the following ACL entry, by clicking on "Add Category": - Category: your Category you made/selected earlier @@ -89,15 +83,28 @@ Lets say you restricted a Template with the method above. But you also want anot - Context: mgr - Click on the "Save" button in the dialog - Click on the "Save" button at the upper right +- Have the users in the Editors User Group logout and log back in, or alternatively click **Logout All Users** in the top menu -- Have the users in the Editors User Group logout and log back in, or alternatively click Security -> Flush Sessions in the top menu - -Done! Your Editors will now be able to see and edit TVs for the Template in the protected Category and they will be hidden from users who are not in the Editors User Group. +Done! Your Editors will now see and edit the TVs for the Template in the protected Category. The Template stays hidden from users who are not in the Editors User Group. ## See Also -1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/troubleshooting-security/index.md b/en/building-sites/client-proofing/security/troubleshooting-security/index.md index 6b48cc706..8b2b62b1a 100644 --- a/en/building-sites/client-proofing/security/troubleshooting-security/index.md +++ b/en/building-sites/client-proofing/security/troubleshooting-security/index.md @@ -1,5 +1,6 @@ --- title: "Troubleshooting Security" +description: "What to check when the access of MODX does not behave as it should." _old_id: "490" _old_uri: "2.x/administering-your-site/security/troubleshooting-security" --- diff --git a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index 9ea0da3b5..41e1495f3 100644 --- a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -1,34 +1,22 @@ --- title: "Resetting a User Password Manually" +description: "Reset the password of a user of MODX when the link for a forgotten password does not reach them: through the API." _old_id: "484" _old_uri: "2.x/administering-your-site/security/troubleshooting-security/resetting-a-user-password-manually" --- ## Resetting a User Password via Database Manipulation -It is not uncommon for a User account to become inaccessible because of a lost/forgotten password. In many cases, this can easily be resolved by having the user use the Forgot Password link on the login form. But in some cases you may need to manually reset the password directly in the database. You will need access to the database containing the MODX tables in order to this, either via PHPMyAdmin or another database client that allows you to edit or UPDATE database records. +It is not uncommon for a User account to become inaccessible because of a lost or forgotten password. In many cases, this can easily be resolved by having the user use the Forgot Password link on the login form. In some cases you need to reset the password directly. -### Resetting Password in MODX 2.1+ +**The password cannot be written into the database by hand** +MODX 3 hashes the passwords with `MODX\Revolution\Hashing\modNative`, which is the `password_hash()` function of PHP. A database has no such function, so the value of the field `password` cannot be calculated outside of PHP. -In MODX 2.1+, users are created by default with the a hashing algorithm called PBKDF2. Databases like MySQL or SQL Server generally do not have functions for calculating these hashes, and as a result, in order to manually reset the password in the database, you will also need to change the hash\_class specified for the user from hashing.modPBKDF2 to hashing.modMD5. Then you can use the native MD5() function to set the value of the password field appropriately. Here is an example MySQL UPDATE statement: - -``` php -UPDATE modx_users SET hash_class = 'hashing.modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; -``` - -If you want to then have the user password automatically converted back to PBKDF2, you can install the [pbkdf2Convert Plugin](https://modx.com/extras/package/pbkdf2convert) available from Package Management. - -### Resetting Password in MODX 2.0.x - -In MODX 2.0.x, you can simply reset the password field with a valid MD5 hash value directly in the database table. Here is an example MySQL UPDATE statement that can reset a user's password by username: - -``` php -UPDATE modx_users SET password = MD5('the-new-password') WHERE username = 'theusername'; -``` +There is a second way. Set the field `hash_class` of the user to the class `MODX\Revolution\Hashing\modMD5`, and write the password as an MD5 hash. The user can then log in with it, and the hash is recalculated with `modNative` the next time the password is changed. The name of the class has to be given with its namespace. The older name without it works only through a deprecated alias that prints a warning. ## Resetting a Password via the API -You can also reset the password (or manipulate any part of the MODX application) by using the API. Below is a sample script to update the password and email address of a given user. It also ensures this user is in the Administrator User Group. +You can also reset the password (or manipulate any part of the MODX application) by using the API. Below is a sample script to update the password and e-mail address of a given user. It also ensures this user is in the Administrator User Group. ``` php initialize('mgr'); -$query = $modx->newQuery('modUser'); -$query->where( array('username'=>$username) ); -$user = $modx->getObjectGraph('modUser', '{ "Profile":{}, "UserGroupMembers":{} }', $query); -// print_r($user); exit; +$query = $modx->newQuery(\MODX\Revolution\modUser::class); +$query->where(['username' => $username]); +$user = $modx->getObjectGraph(\MODX\Revolution\modUser::class, '{ "Profile":{}, "UserGroupMembers":{} }', $query); if (!$user) { die("ERROR: No user with username $username"); } -$user->set('username',$username); -$user->set('active',1); +$user->set('username', $username); +$user->set('active', 1); $user->set('password', $password); $user->Profile->set('email', $email); $user->Profile->set('blocked', 0); @@ -82,18 +69,18 @@ if (!empty($user->UserGroupMembers)) { // Add the User to the User Group if he is not a member if (!$is_member) { // Verify the user group exists - $UserGroup = $modx->getObject('modUserGroup', $user_group); + $UserGroup = $modx->getObject(\MODX\Revolution\modUserGroup::class, $user_group); if (!$UserGroup) { - die ("ERROR: User Group $user_group does not exist."); + die("ERROR: User Group $user_group does not exist."); } - $Member = $modx->newObject('modUserGroupMember'); + $Member = $modx->newObject(\MODX\Revolution\modUserGroupMember::class); $Member->set('user_group', $user_group); $Member->set('member', $user->get('id')); // Super User = role 2 $Member->set('role', 2); $Member->set('rank', 0); - $user->addOne($Member,'UserGroupMembers'); + $user->addOne($Member, 'UserGroupMembers'); } /* save user */ @@ -109,4 +96,26 @@ print "SUCCESS: User $username updated."; You can put this script anywhere on your server so long as you update the path to the primary **index.php** file. You can execute the script by hitting it in a browser or via the command line. **Warning** -Be extremely careful when using a script like this! If possible, do NOT put it inside your document root – instead put it outside of your document root and execute the script via the command line. \ No newline at end of file +Be extremely careful when using a script like this! If possible, do NOT put it inside your document root. Put it outside of your document root and execute the script via the command line. + +## See Also + +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) + 1. [Permissions](building-sites/client-proofing/security/policies/permissions) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACLs](building-sites/client-proofing/security/policies/acls) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) + 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/user-groups.md b/en/building-sites/client-proofing/security/user-groups.md index c5217b099..0f8f77db1 100644 --- a/en/building-sites/client-proofing/security/user-groups.md +++ b/en/building-sites/client-proofing/security/user-groups.md @@ -1,5 +1,6 @@ --- title: "User Groups" +description: "The user groups of MODX: the permissions they carry, the five kinds of access they define, and the roles inside them." _old_id: "328" _old_uri: "2.x/administering-your-site/security/user-groups" --- @@ -8,24 +9,23 @@ _old_uri: "2.x/administering-your-site/security/user-groups" User Groups are used by MODX to define permissions. Unlike some CMS's, in MODX a User can belong to _multiple_ User Groups. -## Usage +Permissions in MODX are granted to _User Groups_, not to individual users. A User must belong to at least one User Group to have any permissions. What a User can or cannot do depends on which User Groups the User belongs to. In other CMS's this concept is sometimes referred to as a "role". -Permissions in MODX are granted to _User Groups_, not to individual users, so a User must belong to at least one User Group in order to have any permissions. In other words, what a User can or cannot do depends on which User Groups the User belongs to. In other CMS's this concept is sometimes referred to as a "role". +To edit the permissions of a User Group, go to the lock icon in the user menu → **Access Control Lists**. Right-click an existing User Group to update it, or create a new User Group. -To edit a User Group's permissions, you need to go to Admin (the little gear icon) -> Access Control Lists, then right-click an existing User Group to update it, or create a new User Group. +A User Group can define access permissions to five areas: -A User Group can define access permissions to four areas: - -- **Context Access** -- this is where you would define access to the manager or to a front-end login portal. -- **Resource Group Access** -- this is where you would define access to a Resource Group -- **Element Category Access** -- this is where you could limit access to only certain Chunks or to only certain fields within a resource. -- **Media Source Access** -- this is where you could limit access to certain folders on the filesystem or S3 buckets. +- **Context Access** -- access to the manager or to a front-end login portal. +- **Resource Group Access** -- access to a Resource Group. +- **Element Category Access** -- access to only certain Chunks or to only certain fields within a resource. +- **Media Source Access** -- access to certain folders on the filesystem or S3 buckets. +- **Namespace Access** -- access to the elements of a namespace. ## Managing Members -To add or remove Users to User Groups you can edit the User Groups when you edit a single User (Manage -> Users) then right-click the User you want to edit and view the "Access Permissions" tab. +To add or remove Users from a User Group, edit the User Group when you edit a single User. Go to the lock icon in the user menu → **Users**, right-click the User you want to edit, and view the "Access Permissions" tab. -Another way to control this is by going to Admin -> Access Control Lists. From there you will see a tree of User Groups and their respective Users. You can assign a User to a User Group by right-clicking on the User Group and either: +Another way is to go to the lock icon in the user menu → **Access Control Lists**. From there you see a tree of User Groups and their respective Users. Assign a User to a User Group by right-clicking on the User Group and either: - Adding the User via the context menu item - Editing the User Group and adding a User on the grid there @@ -46,13 +46,17 @@ The Settings tab on a User Group defines [Setting](building-sites/settings) valu Users can have specific Roles within a User Group, should you choose. They can also exist in the User Group without a Role. Roles allow you to fine-tune your permissions more than in previous MODX versions. -Say you want to only allow Supervisors in the "HR Department" User Group access to some Resources; no problem. Just create a Role called "Supervisor", set its authority to some number below 9999 (let's say 3), and then add in the Users to the User Group "HR Department" (via the User Group editing screen), setting any would-be supervisors to the Supervisor Role. +Say you want to only allow Supervisors in the "HR Department" User Group access to some Resources; no problem. Just create a Role called "Supervisor" and set its authority to some number below 9999 (let's say 3). Then add the Users to the User Group "HR Department" (via the User Group editing screen), setting any would-be supervisors to the Supervisor Role. Then, you'll just add a Resource Policy (the packaged-in-with-modx one will do fine) to the Resource Group you want to restrict access to. It will look something like this: ![](ug-rg-grid1.png) -And you've got a role-based access permission! This specific ACL will limit all Resources (aka Documents) in the web context and in the resource group "TestResourceGroup4" to only Users in the "HR Department" User Group with at least a Role of Supervisor. Roles with lower authority numbers would also inherit access - say you had a Coordinator Role with an authority of 2; Users in this User Group would have access to this ACL as well. +And you've got a role-based access permission! This specific ACL limits all Resources in the web context and in the group "TestResourceGroup4" to Users of the "HR Department" User Group with at least a Role of Supervisor. Roles with lower authority numbers inherit the access as well. Say you had a Coordinator Role with an authority of 2: Users in this User Group would have access to this ACL too. + +### The Permissions of the Page + +The page of the groups needs the permission `usergroup_view` to see the list, `usergroup_new` and `usergroup_save` to create a group, `usergroup_edit` to change one, and `usergroup_delete` to delete one. To manage the members, `usergroup_user_list` shows them and `usergroup_user_edit` adds and removes them. ### Assigning User Groups and Roles via the MODX API @@ -70,22 +74,22 @@ if( $user ){ ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/en/building-sites/client-proofing/security/users.md b/en/building-sites/client-proofing/security/users.md index 1f1a2c93b..2dc82c9e0 100644 --- a/en/building-sites/client-proofing/security/users.md +++ b/en/building-sites/client-proofing/security/users.md @@ -1,28 +1,35 @@ --- title: "Users" +description: "The users of MODX: their fields, the flag of the superuser, the settings of a user, and the properties of the user on the front-end." _old_id: "329" _old_uri: "2.x/administering-your-site/security/users" --- ## What is a User? -A User is simply a representation of a login in MODX Revolution. +A User is a login in MODX. -Users can also be assigned to User Groups, which can have [ACLs](building-sites/client-proofing/security/policies/acls "ACLs") attached to them to provide Access Controls. +Users are assigned to User Groups, which carry [ACLs](building-sites/client-proofing/security/policies/acls "ACLs") that provide the access. + +## The Superuser + +The field `sudo` makes a user a superuser: `checkPolicy()` returns `true` right away, and the policy checks do not run for it at all. The user sees everything, whatever the ACLs say. + +Only a user with the permission `set_sudo` can give it away. The administrator of a fresh installation gets it. ## User Settings -User Settings in MODX Revolution will automatically override any System or Context settings with the same key for that user. They can also be completely unique settings as well. The order of inheritance for Settings is: +The settings of a user override any System or Context settings with the same key, and they can be unique to that user as well. The order of inheritance for Settings is: -`System Settings -> Context Settings -> User Settings` +`System Settings → Context Settings → User Settings` -To edit the user settings, navigate to **Security -> Manage Users -> Update User (_right-click_) -> Settings (_tab_)** +To edit the user settings, navigate to the lock icon in the user menu → **Users** → **Update User** (right-click) → **Settings** (tab). -You can change user-specific settings only _after_ you've created the user. The "Settings" tab is not visible when you first create the user. +You can change user-specific settings only _after_ you've created the user. The "Settings" tab is not visible when you first create the user. It is shown only to a user who has the permissions `settings` **and** `namespace`. ## Users in the Front-End -When a user is logged into the frontend of your site, their username and ID can be accessed by the following [Properties](building-sites/properties-and-property-sets "Properties and Property Sets"): +When a user is logged into the frontend of your site, their username and ID are available as [Properties](building-sites/properties-and-property-sets "Properties and Property Sets"): ``` php [[+modx.user.id]] - Prints the ID @@ -31,70 +38,97 @@ When a user is logged into the frontend of your site, their username and ID can If a user is not logged in, ID will be blank, and Username will be "(anonymous)". -As of MODX 2.4.0, the default Username can be set in the Systems Settings with the **default\_username** setting. +The default Username is set with the `default_username` setting. **Remember** -Keep in mind that confusing caveat: just because you have logged into the _manager_ does not mean that you are logged into the _web_ front-end. The user-specific settings and the [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") API method obeys this same rule, so if you're not logged in, then the **System Settings -> Context Settings -> User Settings** cannot fully apply. +Keep in mind that confusing caveat: just because you have logged into the _manager_ does not mean that you are logged into the _web_ front-end. The user-specific settings and the [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") API method obeys this same rule. If you're not logged in, the **System Settings → Context Settings → User Settings** cannot fully apply. -## User Field +## The Fields of a User Users contain the following fields: -| Name | Description | -| ------------ | ------------------------------------------------------------------ | -| id | The ID of the user. | -| username | The username of the user. | -| password | The user's encrypted password. | -| active | Either 1 or 0. If not active, the user will not be able to log in. | -| remote\_key | A remote user Key used by remote authentication apps. | -| remote\_data | A JSON array of data used by remote authentication apps. | +| Name | Description | +| -------------- | ------------------------------------------------------------------------------------------------------------- | +| id | The ID of the user. | +| username | The username of the user. | +| password | The user's encrypted password. | +| cachepwd | The cached password of the user. | +| class\_key | The class of the user. A user of a derived class inherits the behaviour of that class. | +| active | Either 1 or 0. If not active, the user will not be able to log in. | +| remote\_key | A remote user Key used by remote authentication apps. | +| remote\_data | A JSON array of data used by remote authentication apps. | +| hash\_class | The class that hashes the password of the user. The default of MODX 3 is `MODX\Revolution\Hashing\modNative`. | +| salt | The salt that the password of the user is hashed with. | +| primary\_group | The group that the user gets the dashboard and the access of its primary group from. | +| session\_stale | Whether the session of the user is stale. | +| sudo | Whether the user is a superuser. See [The Superuser](#the-superuser). | +| createdon | The date the user was created. | Users also have a Profile attached to them. It contains the following fields: -| Name | Description | -| ---------------- | ---------------------------------------------------------------------------------- | -| internalKey | The ID of the user. | -| fullname | The full name of the user. | -| email | The email of the user. | -| phone | The phone number. | -| mobilephone | The cellphone number. | -| fax | The fax number. | -| blocked | Either 1 or 0. If blocked is set to true, the user will not be able to log in. | -| blockeduntil | A timestamp that, when set, will prevent the user from logging in until this date. | -| blockedafter | A timestamp that, when set, will prevent the user from logging in after this date. | -| logincount | The number of logins for this user. | -| lastlogin | The last time the user logged in. | -| thislogin | The time the user logged in in their current session. | -| failedlogincount | The number of times the user has failed to log in since last logging in. | -| sessionid | The User's session ID that maps to the session table. | -| dob | The date of birth. | -| gender | 0 for neither, 1 for male and 2 for female. | -| address | The physical address. | -| country | The country of the user. | -| city | The city of the user. | -| zip | The zip or postal code for the user. | -| state | The physical state or province of the user. | -| photo | An optional field for a photo. Not used in the UI. | -| comment | An optional comment field for comments on the User. | -| website | The website of the user. | -| extended | A JSON array that can be used to store extra fields for the User. | +| Name | Description | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| internalKey | The ID of the user. | +| fullname | The full name of the user. | +| email | The email of the user. | +| phone | The phone number. | +| mobilephone | The cellphone number. | +| fax | The fax number. | +| blocked | Either 1 or 0. If blocked is set to true, the user will not be able to log in. | +| blockeduntil | A timestamp that, when set, will prevent the user from logging in until this date. | +| blockedafter | A timestamp that, when set, will prevent the user from logging in after this date. | +| logincount | The number of logins for this user. | +| lastlogin | The last time the user logged in. | +| thislogin | The time the user logged in in their current session. | +| failedlogincount | The number of times the user has failed to log in since last logging in. | +| sessionid | The User's session ID that maps to the session table. Deprecated, to be removed in 3.2. | +| dob | The date of birth. | +| gender | 0 for neither, 1 for male and 2 for female. | +| address | The physical address. | +| country | The country of the user. | +| city | The city of the user. | +| zip | The zip or postal code for the user. | +| state | The physical state or province of the user. | +| photo | The path to the picture of the user. It is shown in the header of the manager and is loaded through the Media Source of the setting `photo_profile_source`. If the user has no picture and the setting `enable_gravatar` is on, Gravatar is used. | +| comment | An optional comment field for comments on the User. | +| website | The website of the user. | +| extended | A JSON array that can be used to store extra fields for the User. | + +## The Settings of the Accounts + +| Setting | What it does | +| ------------------------------- | --------------------------------------------------------------------- | +| `passwordless_activated` | Turns the login by a magic link on. Off by default. | +| `passwordless_expiration` | The lifetime of the magic link, in seconds. 3600 by default. | +| `password_min_length` | The minimum length of a password. 12 by default. | +| `password_generated_length` | The length of a password that MODX generates. 16 by default. | +| `allow_multiple_emails` | Whether a user may have several addresses. | +| `clean_phone_number` | Whether the phone number is cleaned before it is saved. | +| `default_username` | The name of the user that is not logged in. `(anonymous)` by default. | +| `enable_gravatar` | Whether Gravatar is used when the user has no picture. | +| `photo_profile_source` | The Media Source the picture of the user is loaded from. | +| `unauthorized_page` | The page an unauthorized user is sent to. | +| `access_context_enabled` | Whether the access to a context is checked at all. | +| `access_resource_group_enabled` | Whether the access to a resource group is checked at all. | ## Grabbing the User via the API -The current user can be retrieved in the API via the $modx->user reference. For example, this snippet outputs the username of the user: +The current user can be retrieved in the API via the `$modx->user` reference. For example, this snippet outputs the username of the user: ``` php return $modx->user->get('username'); ``` -Note that to grab Profile fields, you'll need to first get the modUserProfile object via the Profile alias. For example, this snippet grabs the email of the user and returns it: +To read the Profile fields, get the `modUserProfile` object through the Profile alias first. For example, this snippet grabs the email of the user and returns it: ``` php $profile = $modx->user->getOne('Profile'); return $profile ? $profile->get('email') : ''; ``` -If the User is not logged in, $modx->user will still be available as an object, but will return 0 as the ID and (Anonymous) as the username. +If the User is not logged in, `$modx->user` is still available as an object, but returns 0 as the ID and (Anonymous) as the username. + +To write your own User class, see [Extending modUser](extending-modx/custom-users "Extending modUser"). ### Using Extended Fields @@ -113,23 +147,22 @@ $profile->save(); ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) -9. [Extending modUser](extending-modx/custom-users "Extending modUser") diff --git a/ru/building-sites/client-proofing/custom-manager-themes.md b/ru/building-sites/client-proofing/custom-manager-themes.md index 9a23e2897..7abfa6dee 100644 --- a/ru/building-sites/client-proofing/custom-manager-themes.md +++ b/ru/building-sites/client-proofing/custom-manager-themes.md @@ -1,34 +1,60 @@ --- title: "Пользовательские темы системы управления" translation: "building-sites/client-proofing/custom-manager-themes" +description: "Переопределить файлы менеджера MODX своей темой: как выбирается тема, что она обязана содержать и как переопределить один файл или контроллер." --- -**Важно**: Когда вы используете пользовательские темы или шаблоны системы управления, вам необходимо убедиться, что после обновления MODX все работает должным образом. Пользовательские шаблоны системы управления нередко конфликтуют с изменениями в ядре. +**Важно**: проверяйте пользовательскую тему менеджера после каждого обновления MODX. Тема может конфликтовать с изменениями нового выпуска, а файлы, добавленные выпуском, тема никогда не подхватит. -Настройка системы управления и её шаблонов. Например, если вы хотите настроить форму входа системы управления. +## Как устроена тема -Система управления MODX использует шаблон так же, как обычные страницы MODX. Файлы шаблонов системы управления находятся в директории **manager/templates/default**. Вы можете изменить системную настройку **manager_theme**, чтобы они указывали на новый каталог. +Менеджер построен на шаблонах Smarty. Файлы темы по умолчанию лежат в `manager/templates/default`. Системная настройка `manager_theme` хранит имя каталога внутри `manager/templates/`, и менеджер сначала читает файлы этой темы, а к тем, которых в ней нет, обращается к файлам темы `default`. -Способ настройки подобен расширению класса PHP: вы можете переопределить любой отдельный файл, имитируя структуру каталогов и меняя каталог в **manager_theme**. +В MODX 3 поставляется только тема `default`. Остальные приходят со сборкой или с дополнением, либо делаются вами. -Для версии 2.1 и более ранних необходимо скопировать весь каталог контроллеров и шаблонов для вашей темы. Для версии 2.2 и более поздних можно копировать отдельные файлы. +Тема охватывает не только страницы менеджера: из неё же резолвятся шаблоны виджетов дашбордов и переменных шаблона, а также контроллеры ресурсов. -Например, чтобы настроить только шаблон входа в систему управления, вы можете скопировать следующий файл в новый каталог: +## Переопределение одного файла ->manager/templates/default/security/login.tpl +Чтобы оформить только страницу входа, скопируйте файл: -Скопируйте этот файл в новый каталог, например, в такой: +`manager/templates/default/security/login.tpl` → `manager/templates/my-brand/security/login.tpl` ->manager/templates/custom/security/login.tpl +Затем задайте в `manager_theme` значение `my-brand`. Файл из `my-brand` заменит файл из `default`. -Затем обновите системную настройку **manager_theme**, чтобы она указывала на вновь созданный **пользовательский** каталог, и версия файла из **пользовательского** каталога заменит версию файла из каталога по умолчанию. +**Создайте каталог до того, как выберете тему** +Настройка — это выпадающий список каталогов `manager/templates/`, и его значение нельзя вписать руками. Сначала создайте `manager/templates/my-brand/`, потом выберите его в **Admin → Системные настройки**. -Вам также придется скопировать этот каталог: +## Что обязано быть в теме ->manager/controllers/default +Эти файлы читаются из каталога темы, без отката на `default`: -в новый каталог с тем же именем, что и ваш новый пользовательский каталог, например: +| Файл | Что ломается без него | +| --- | --- | +| `images/modx-icon-color.svg` | Значок сайта в шапке менеджера. | +| `images/modx-logo-color.svg` | Логотип на странице входа. | +| `images/login/default-background.jpg` | Фон страницы входа. | +| `email/default.tpl` | Создание пользователя: шаблон письма не найден. | ->manager/controllers/custom +**Стили страницы входа не темизируются** +`security/login.tpl` подключает стиль темы `default` по жёстко зашитому пути. Чтобы оформить его, положите `css/login.css` в каталог темы и поправьте ссылку в собственной копии `security/login.tpl`. То же самое с браузером файлов: его `browser/index.tpl` подключает `css/index.css` темы `default`. -Это связано с тем, что при изменении значения системной настройки **manager_theme** она также будет ссылается на новый каталог контроллеров. +Стили самого менеджера темизируются: положите `css/index.css` в каталог темы, и шапка подхватит его через плейсхолдер `{$indexCss}`. + +## Где должна лежать тема + +Каталог темы ищется внутри `manager/templates/` — это часть каталога установки, который перезаписывается при обновлении. Держите файлы темы в своём репозитории и восстанавливайте их после обновления. + +**Обновление сбрасывает тему** +При обновлении в режиме Evolve скрипт `setup/includes/upgrade.install.php` возвращает `manager_theme` в `default`. Проверяйте значение после каждого обновления. + +## Переопределение контроллера + +Контроллер переопределяется так же, только вместо `templates` в пути стоит `controllers`. Файл в теме должен называться так же, как в `default` (`.class.php`), а класс внутри него — называться `ManagerController` в глобальном пространстве, например `SecurityLoginManagerController`. + +## Смотрите также + +1. [Настройка системы управления для клиента](building-sites/client-proofing) +2. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) +3. [Настройка входа в Менеджер](building-sites/client-proofing/manager-login) +4. [Дашборды](building-sites/client-proofing/dashboards) diff --git a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md index 55bf8cf75..1050094b2 100644 --- a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md +++ b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md @@ -1,22 +1,27 @@ --- title: "Создание виджета панели управления" translation: "building-sites/client-proofing/dashboards/creating-a-widget" +description: "Создание виджета панели управления в MODX: поля виджета, размеры и как поместить его на панель." --- В этой статье описано, как создать собственный виджет панели управления, включая краткий обзор типов виджетов и принципов их работы. ## Создание базового виджета -Откройте страницу панелей управления (**Dashboard → Dashboards** в верхнем меню) и перейдите на вкладку **Widgets**. Нажмите **Create New Widget**. Откроется экран создания виджета. Вы увидите несколько полей: +Откройте страницу панелей управления (**Admin → Панели управления** в верхнем меню) и перейдите на вкладку **Widgets**. Нажмите **Создать**. Откроется экран создания виджета. На нём эти поля: -- **Name** - имя виджета. Назовём наш «Hello World». -- **Description** - краткое описание виджета для внутреннего использования. -- **Widget Type** - тип виджета. Подробнее об этом ниже. Пока выберите **HTML**. -- **Size** - размер виджета: half, full или double. Half занимает половину строки. Full занимает целую строку. Double занимает две строки. -- **Namespace** - пространство имён, с которым связан виджет. Полезно разработчикам Extras. Мы оставим **core**. -- **Lexicon** - позволяет загрузить лексикон для виджета. Оставим значение по умолчанию **core:dashboards**. +| Поле | Что в нём | +| --- | --- | +| **Name** | Имя виджета. Оно должно быть уникальным. | +| **Description** | Краткое описание виджета для внутреннего использования. | +| **Widget Type** | Тип виджета. Для первого виджета выберите «HTML». | +| **Size** | Один из семи размеров: Quarter, One Third, Half, Two Third, Three Quarters, Full Size и Double Size. | +| **Permission** | Право менеджера, которое нужно пользователю, чтобы виджет появился. Пусто — виджет виден всем. | +| **Namespace** | Пространство имён, с которым связан виджет. Оставьте «core», если вы не пишете дополнение. | +| **Lexicon** | Лексикон, который грузится вместе с виджетом. По умолчанию «core:dashboards». | +| **Properties** | Произвольные свойства виджета, которые хранятся в JSON. Виджет-файл или виджет-сниппет получает их как `$scriptProperties`. | -Когда вы вводите имя виджета, под полем появляется текст, повторяющий ваш ввод. Это автоматический перевод имён виджетов. Если ввести ключ записи лексикона, он переведётся (попробуйте `widget_create`, чтобы увидеть, как это работает). +Имя виджета должно быть уникальным. Когда вы вводите имя, под полем появляется текст, повторяющий ваш ввод: это автоматический перевод имён виджетов, он ищет ключ в лексиконе виджета. Введите ключ существующей записи, например `w_configcheck`, и увидите переведённое имя. В содержимое виджета вставьте: @@ -32,7 +37,7 @@ translation: "building-sites/client-proofing/dashboards/creating-a-widget" ### Назначение виджета панели по умолчанию -Вернитесь на главную страницу панелей управления, откройте вкладку **Dashboards** и найдите панель по умолчанию. Щёлкните по ней правой кнопкой мыши и выберите **Update Dashboard**. Откроется страница редактирования. +Вернитесь на главную страницу панелей управления, откройте вкладку **Dashboards** и найдите панель по умолчанию. Щёлкните по ней правой кнопкой мыши и выберите **Редактировать**. Откроется страница редактирования. Нажмите **Place Widget** над таблицей виджетов. Выберите **Hello World** в выпадающем списке и сохраните. Виджет добавлен на панель. Перетащите его на позицию №2 между виджетами **Configuration Check** и **MODX News Feed**: @@ -44,14 +49,20 @@ translation: "building-sites/client-proofing/dashboards/creating-a-widget" > > Добавление виджета прямо на странице панели (через сам просмотр панели) добавляет его только для текущего пользователя. Другие пользователи его не увидят, пока виджет не добавят в шаблон. > +> Виджет, добавленный в шаблон, приходит к существующим пользователям со стандартным размером и в конце списка, а не с тем размером, который указан в шаблоне. +> > На крупных сайтах с большим числом пользователей добавление виджета в шаблон создаёт запись размещения для каждого пользователя, у которого уже есть личная копия этой панели. Учитывайте это, если важна производительность. ### Просмотр виджета -Нажмите пункт **Dashboard** в верхнем меню. Вы увидите новый виджет на панели. +Нажмите на логотип MODX в левом верхнем углу. Вы увидите новый виджет на панели. ![](dashboard-create3.png) +## Удаление виджета + +Виджет удаляется на вкладке Widgets, и при этом он убирается со всех панелей, где он был размещён. Виджеты, которые поставляются с MODX, удалить нельзя. + ## Другие типы виджетов Доступны и другие типы виджетов. См. раздел [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types "Dashboard Widget Types"). diff --git a/ru/building-sites/client-proofing/dashboards/index.md b/ru/building-sites/client-proofing/dashboards/index.md index 9ef847550..fce9c5faa 100644 --- a/ru/building-sites/client-proofing/dashboards/index.md +++ b/ru/building-sites/client-proofing/dashboards/index.md @@ -1,25 +1,46 @@ --- title: "Панели управления" translation: "building-sites/client-proofing/dashboards" +description: "Панель управления в MODX: виджеты на странице, которую видит пользователь после входа, штатные виджеты и личная копия панели у каждого пользователя." --- -## Что такое панели управления? +## Что такое панели управления -Панель управления в MODX это страница, которая отображается при первой загрузке менеджера MODX или при нажатии ссылки «Панель управления» в левом верхнем углу экрана. Панели управления могут содержать неограниченное количество «виджетов», то есть блоков с разным содержимым на панели. Вы можете расположить виджеты в любом порядке. Виджет может быть файлом, сниппетом MODX или обычным HTML. +Панель управления — это страница, которая открывается при входе в менеджер. Логотип MODX в левом верхнем углу ведёт на неё же. -Каждой группе пользователей в MODX по умолчанию назначается панель управления. Это означает, что вы можете выдать разным пользователям разные панели через группу пользователей, к которой они принадлежат. +На панели может быть сколько угодно виджетов: блоков с содержимым. Виджет — это файл, сниппет MODX, обычный HTML или PHP-код. Виджеты можно располагать в любом порядке. -Если пользователь входит в две разные группы, он увидит панель своей основной группы. Её можно задать на экране редактирования пользователя. +Каждой группе пользователей назначается своя панель. Так разным пользователям достаются разные панели. + +Если пользователь состоит в двух группах, используется панель его основной группы. Основную группу задают на экране редактирования пользователя. + +## Штатные виджеты + +В MODX поставляется семь виджетов: + +| Виджет | Право | +| --- | --- | +| MODX News Feed | — | +| MODX Security Feed | — | +| Who's Online | — | +| Configuration Check | — | +| Buttons | — | +| Recently Edited Resources | `view_document` | +| Updates | `workspaces` | + +Последние два видны только пользователям с нужным правом, поэтому у обычного пользователя их на панели нет. ## Настраиваемые панели -У панелей есть параметр **Customizable** (настраиваемая). Если он включён (по умолчанию включён), MODX клонирует раскладку виджетов панели для каждого пользователя при первой загрузке. У каждого появляется личная копия панели, которую он может переставлять, дополнять виджетами или очищать без влияния на других. +У панели есть параметр **Customizable** (настраиваемая). Если он включён (по умолчанию включён), MODX клонирует раскладку виджетов панели для каждого пользователя при первой загрузке. У каждого появляется личная копия: можно менять порядок, добавлять и убирать виджеты, а также менять их размер, не затрагивая остальных. Если **Customizable** выключен, все пользователи видят одну и ту же раскладку и не могут менять её для себя. +У панели есть и второй параметр — **Hide Left-Hand Trees**: он прячет деревья слева, пока показана панель. + ### Как изменения шаблона распространяются на пользователей -Раскладка виджетов, которую вы настраиваете на странице управления панелями (Панель управления -> Панели управления -> Редактировать панель), служит **шаблоном** для настраиваемой панели. Когда вы добавляете или удаляете виджеты в шаблоне, изменения применяются ко всем пользователям, у которых уже есть личная копия этой панели: +Раскладка виджетов, которую вы настраиваете на странице управления панелями, служит **шаблоном** настраиваемой панели. Когда вы добавляете или удаляете виджеты в шаблоне, изменения применяются ко всем пользователям, у которых уже есть личная копия этой панели: - **Добавленные** в шаблон виджеты автоматически появятся у всех пользователей с личной копией панели. - **Удалённые** из шаблона виджеты исчезнут с личных панелей всех пользователей. @@ -28,36 +49,19 @@ translation: "building-sites/client-proofing/dashboards" Изменения, которые вы делаете прямо на странице панели пользователя (например, закрываете виджет кнопкой или добавляете виджет с самой панели), затрагивают только этого пользователя и не меняют шаблон. -## Настраиваемые панели - -У панелей есть параметр **Customizable** / «Настраиваемая». Если он включён (так по умолчанию), MODX при первой загрузке панели клонирует раскладку виджетов для каждого пользователя. У пользователя появляется личная копия: можно менять порядок, добавлять и убирать виджеты, не затрагивая остальных. - -Если **Customizable** выключен, все пользователи делят одну раскладку и не правят её лично. - -### Как изменения шаблона доходят до пользователей - -Раскладка виджетов на странице Dashboards → Update Dashboard — это **шаблон** настраиваемой панели. Добавление или удаление виджетов в шаблоне применяется ко всем, у кого уже есть личная копия: - -- **Добавленные** в шаблон виджеты появятся у всех пользователей этой панели. -- **Удалённые** из шаблона виджеты пропадут у всех личных копий. - -Личный порядок виджетов от правок шаблона не сбрасывается. - -Правки прямо на странице панели пользователя (кнопка закрытия виджета или добавление с самой панели) затрагивают только этого пользователя и не меняют шаблон. +Виджет, добавленный в шаблон, приходит к существующим пользователям со стандартным размером и в конце списка, а не с тем размером, который указан в шаблоне. -## Использование панелей +## Права -- [Редактирование панели управления](building-sites/client-proofing/dashboards/managing "Редактирование панели управления") -- [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups "Назначение панели управления группе пользователей") -- [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget "Создание виджета панели управления") -- [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types "Типы виджетов панели управления") +Страница менеджера с панелями и любые действия с виджетами требуют права **dashboards**. Сама панель показывается любому пользователю, которому разрешён вход в менеджер. ## Смотрите также -1. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) -2. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) -3. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) diff --git a/ru/building-sites/client-proofing/dashboards/managing.md b/ru/building-sites/client-proofing/dashboards/managing.md index 837a69604..d72544884 100644 --- a/ru/building-sites/client-proofing/dashboards/managing.md +++ b/ru/building-sites/client-proofing/dashboards/managing.md @@ -1,30 +1,30 @@ --- title: "Редактирование панели управления" translation: "building-sites/client-proofing/dashboards/managing" +description: "Редактирование панели управления в MODX: назначение и размещение виджетов, своя панель и порядок изменений шаблона." --- В этой статье описано, как редактировать панель управления, в том числе как назначать и размещать виджеты на этой панели. ## Редактирование панели управления -Откройте главную страницу панелей управления в верхнем меню: «Панель управления» -> «Панели управления». После загрузки на первой вкладке вы увидите таблицу с (скорее всего) одной панелью, «Default». Щёлкните по строке правой кнопкой мыши и выберите «Редактировать панель». Откроется страница редактирования панели. +Откройте главную страницу панелей управления: в верхнем меню это **Admin → Панели управления**. На первой вкладке вы увидите таблицу панелей, скорее всего только «Default». Щёлкните по строке правой кнопкой мыши и выберите **Редактировать**. Откроется страница редактирования панели. -Ниже полей имени и описания вы увидите таблицу виджетов, назначенных на панель. Перетаскивайте виджеты, чтобы изменить порядок. Добавляйте виджеты кнопкой «Place Widget». Удаляйте виджеты через контекстное меню по правому щелчку: +Ниже полей имени и описания вы увидите таблицу виджетов панели. Перетаскивайте виджеты, чтобы изменить порядок. Добавляйте виджеты кнопкой «Place Widget». Удаляйте виджеты через контекстное меню по правому щелчку: ![](dashboard-edit.png) -## Шаблон и личные изменения +Имя и описание панели «Default» изменить нельзя: это панель, которую видит пользователь, которому не назначили другую. -Изменения на этой странице обновляют **шаблон** панели. Для [настраиваемых панелей](building-sites/client-proofing/dashboards "Панели управления") изменения шаблона распространяются на всех пользователей с личной копией этой панели: +## Создание и удаление панели -- Если вы **добавите виджет** здесь, он появится на панели у всех существующих пользователей этой панели. -- Если вы **удалите виджет** здесь, он исчезнет с личных панелей всех пользователей. +На странице есть кнопка **Создать**, которая делает вашу собственную панель. В контекстном меню панели рядом с **Редактировать** есть **Дублировать** и **Удалить**. Дублирование копирует виджеты и их размещение — копию вы меняете как хотите. -Это отличается от изменений прямо на странице панели (например, закрытие виджета кнопкой или добавление виджета из вида панели). Такие правки затрагивают только текущего пользователя. +Панель «Default» удалить нельзя. Когда панель удаляют, назначенные ей группы возвращаются к «Default». -Если вы хотите применить изменение виджета ко всем пользователям, сделайте это на этой странице управления. Если нужно настроить только свою панель, меняйте её прямо на странице панели. +Таблицу панелей можно фильтровать по группе пользователей — так быстрее всего найти панель конкретной группы. -## Шаблон и личные правки +## Шаблон и личные изменения Изменения на этой странице обновляют **шаблон** панели. Для [настраиваемых панелей](building-sites/client-proofing/dashboards "Панели управления") правки шаблона доходят до всех пользователей с личной копией: @@ -33,14 +33,21 @@ translation: "building-sites/client-proofing/dashboards/managing" Это отличается от правок прямо на странице панели (кнопка закрытия виджета или добавление с панели). Такие правки касаются только текущего пользователя. -Чтобы изменить виджеты для всех, правьте эту страницу управления. Чтобы поправить только свою панель, меняйте её на самой странице Dashboard. +Чтобы изменить виджеты для всех, правьте эту страницу управления. Чтобы поправить только свою панель, меняйте её на самой странице панели. + +Виджет, добавленный в шаблон, приходит к существующим пользователям со стандартным размером и в конце списка. + +## Права + +Любое действие на этой странице требует права **dashboards**. ## Смотрите также -1. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) -2. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) -3. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) diff --git a/ru/building-sites/client-proofing/dashboards/usergroups.md b/ru/building-sites/client-proofing/dashboards/usergroups.md index db9e6f266..4b0a99428 100644 --- a/ru/building-sites/client-proofing/dashboards/usergroups.md +++ b/ru/building-sites/client-proofing/dashboards/usergroups.md @@ -1,29 +1,33 @@ --- title: "Назначение панели группе пользователей" translation: "building-sites/client-proofing/dashboards/usergroups" +description: "Назначение панели управления группе пользователей в MODX и то, как у участников группы появляется личная копия настраиваемой панели." --- -Как назначить Dashboard группе пользователей. +В этой статье описано, как назначить панель управления группе пользователей. -Найдите нужную User Group и откройте её на редактирование: **Меню → Access Controls**, ПКМ по группе в дереве, **Update User Group**. +Сначала найдите группу пользователей, которой вы хотите назначить панель, и откройте её на правку. Дерево групп пользователей живёт на странице **Access → ACLs**: щёлкните по группе в дереве правой кнопкой мыши и выберите **Edit User Group**. -В выпадающем списке **Dashboard** выберите панель. Все пользователи группы, у которых эта группа основная (Primary Group), будут видеть эту панель вместо Default. +Дальше нажмите на выпадающий список «Dashboard» и выберите панель, которую хотите назначить этой группе. Все пользователи группы, у которых она основная, будут открывать эту панель вместо «Default». ![](dashboard-assign.png) -## Настраиваемые панели и группы +Панель назначается в форме группы. Обратного экрана, где панель назначалась бы группам, нет. -Если у назначенной панели включено **Customizable**, при первом входе MODX создаёт личную копию раскладки виджетов для пользователя. Он может менять, добавлять и убирать виджеты на своей копии. На других членов группы это не влияет. +## Настраиваемые панели и группы пользователей -Когда администратор позже меняет шаблон панели (добавляет или убирает виджеты на странице Dashboards), изменения применяются ко всем личным копиям. Как шаблон распространяется, см. [Managing Your Dashboard](building-sites/client-proofing/dashboards/managing). +Если у назначенной панели включён параметр **Customizable** (настраиваемая), MODX при первой загрузке панели клонирует раскладку виджетов для каждого пользователя. Пользователь может переставлять, добавлять и убирать виджеты на своей копии, не затрагивая остальных участников группы. + +Когда администратор позже меняет шаблон панели (добавлением или удалением виджетов на странице управления панелями), правки применяются ко всем личным панелям существующих пользователей. Подробнее об этом — в статье [Редактирование панели управления](building-sites/client-proofing/dashboards/managing "Редактирование панели управления"). ## Смотрите также -1. [Управление панелью](building-sites/client-proofing/dashboards/managing) -2. [Назначение панели группе пользователей](building-sites/client-proofing/dashboards/usergroups) -3. [Создание виджета](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Типы виджетов](building-sites/client-proofing/dashboards/widget-types) - 1. [Тип File](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Тип HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Тип Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Тип Snippet](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) + 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) + 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) + 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) + 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/file.md b/ru/building-sites/client-proofing/dashboards/widget-types/file.md index 71d8c69c0..10b305652 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/file.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/file.md @@ -1,12 +1,14 @@ --- title: "Файлы" translation: "building-sites/client-proofing/dashboards/widget-types/file" +description: "Виджет панели управления типа «Файл» в MODX: способы вернуть содержимое виджета из файла." --- Тип виджета File Dashboard запускает файл из файловой системы. Результатом работы может быть: -- возврат результата работы файла отрендарив его в панели содержимого виджета. -- возврат имени класса, который расширяет `modDashboardWidgetInterface`, абстрактный класс, предоставляемый MODX, который имеет метод render(), который будет возвращать выходные данные для визуализации на панель содержимого виджета. +- возврат результата работы файла с отрисовкой его в панели содержимого виджета; +- вывод результата работы файла без `return`; +- возврат имени класса, который расширяет `modDashboardWidgetInterface` — абстрактный класс, предоставляемый MODX, у которого есть метод `render()`, возвращающий вывод для панели содержимого виджета. ## Использование @@ -18,16 +20,30 @@ translation: "building-sites/client-proofing/dashboards/widget-types/file" - `[[++assets_path]]` - `[[++manager_theme]]` -### Вывод результата +**Используйте абсолютный путь** +Относительный путь разрешается от рабочего каталога процесса PHP, а не от корня MODX, поэтому он не переносится между установками. Соберите путь из `[[++manager_path]]` и подобных. + +### Возврат результата -Существует два метода, при помощи которых можно вернуть результаты работы вашего файла. Первый - просто вернуть результат: +Первый способ — просто вернуть результат: ``` php resource, будут проблемы. +Обратите внимание, что на панели управления нет активного ресурса, поэтому у сниппета, который ссылается на `$modx->resource`, будут проблемы. ## Смотрите также diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/index.md b/ru/building-sites/client-proofing/dashboards/widget-types/index.md index 4ddfdd3e4..36e0651a1 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/index.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/index.md @@ -1,22 +1,26 @@ --- -title: "Типы Виджетов" +title: "Типы виджетов" translation: "building-sites/client-proofing/dashboards/widget-types" +description: "Типы виджетов панели управления в MODX и значение, под которым хранится каждый из них." --- -В этой статье перечислены различные типы доступных виджетов Dashboard. +Виджет панели управления хранит своё содержимое в одном из четырёх типов. Тип сохраняется вместе с виджетом, и его значение важно, когда вы пишете виджет сами. -1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) -2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) -3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) -4. [Тип виджета на приборной панели - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +| Тип | Что делает | Значение в базе | +| --- | --- | --- | +| [Файл](building-sites/client-proofing/dashboards/widget-types/file "Тип виджета панели управления - Файл") | Выполняет файл с диска. | `file` | +| [Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet "Тип виджета панели управления - Сниппет") | Выполняет сниппет MODX. | `snippet` | +| [HTML](building-sites/client-proofing/dashboards/widget-types/html "Тип виджета панели управления - HTML") | Показывает обычный HTML. | `html` | +| [Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php "Тип виджета панели управления - Inline PHP") | Выполняет PHP-код, как сниппет. | `php` | ## Смотрите также -1. [Управление вашей приборной панелью](building-sites/client-proofing/dashboards/managing) -2. [Назначение панели мониторинга для группы пользователей](building-sites/client-proofing/dashboards/usergroups) -3. [Создание виджета панели инструментов](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Типы виджетов на приборной панели](building-sites/client-proofing/dashboards/widget-types) - 1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Тип виджета на приборной панели - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) + 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) + 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) + 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) + 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md b/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md index dc13c943a..30899d17e 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md @@ -1,30 +1,36 @@ --- title: "Inline PHP" translation: "building-sites/client-proofing/dashboards/widget-types/inline-php" +description: "Виджет панели управления Inline PHP в MODX: PHP-код, который выполняется как сниппет, и правила, которых он должен держаться." --- -Виджет Inline PHP работает как и [виджет Snippet](building-sites/client-proofing/dashboards/widget-types/snippet "Тип виджета на приборной панели - сниппет"), за исключением того, что он запускает содержимое виджета, как будто это был Snippet. +Виджет Inline PHP работает почти так же, как [виджет-сниппет](building-sites/client-proofing/dashboards/widget-types/snippet "Тип виджета панели управления - Сниппет"), только выполняет содержимое виджета как сниппет. ## Использование -Просто поместите ваш PHP-код в панель содержимого и верните вывод вашего виджета. +Просто поместите PHP-код в панель содержимого и верните результат. -Например, это отобразит «Hello, World!»: +Например, так выведется «Hello, World!»: -```php +``` php resource в вашем виджете, так как нет активного ресурса для панели инструментов -- Не помещайте закрывающий тег PHP в конец кода! По какой-то причине он анализируется неправильно (по состоянию на MODX 2.2.8) +- Используйте `return`, а не `echo`. Напечатанное попадёт в вывод страницы, а не в содержимое виджета. +- Не используйте `$modx->resource` в виджете: у панели управления нет активного ресурса. +- Теги `` вырезаются перед выполнением кода, поэтому закрывающий тег не нужен. ## Смотрите также -1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) -2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) -3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) -4. [Тип виджета на приборной панели - сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) + 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) + 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) + 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) + 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md b/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md index b5fde2aa0..7dfe6f171 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md @@ -1,6 +1,7 @@ --- title: "Сниппет" translation: "building-sites/client-proofing/dashboards/widget-types/snippet" +description: "Виджет панели управления типа «Сниппет» в MODX: сниппет, который возвращает содержимое виджета." --- Тип виджета «Панель инструментов Snippet» запускает сниппет кода MODX и помещает возвращаемое значение в панель виджетов. diff --git a/ru/building-sites/client-proofing/form-customization/fc_new_tab.jpg b/ru/building-sites/client-proofing/form-customization/fc_new_tab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86dd98b7a7f2232eae114424dedf259e227c4e49 GIT binary patch literal 19054 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 Профиль -> Наборы -> Правила +> Профиль → Набор → Правила -Профиль - это набор Наборов, а Наборы - это набор Правил. Профили могут быть ограничены определенными группами пользователей. +**Профиль** — это набор наборов, и его можно привязать к группам пользователей. **Набор** — это набор правил, привязанный к странице менеджера. **Правило** — одно изменение, которое набор вносит в форму. -Набор представляет собой набор правил и привязан к определенному представлению. Обычно у вас есть Набор для страницы Ресурс / Создать и Набор для страницы Ресурс / Обновление. Наборы также могут быть привязаны к определенным [шаблонам](building-sites/elements/templates "Шаблоны") (то есть они загружаются, только когда ресурс использует этот шаблон). У них также может быть набор «Ограничение», который ограничивает выполнение набора ограничением, установленным в Ограничении. +Правила не правятся отдельно: они пересобираются из трёх сеток набора при каждом его сохранении. Смотрите [Правила настройки формы](building-sites/client-proofing/form-customization/rules "Правила настройки формы"). -Правило - это все варианты, применяемые в наборе. Правила скрыты от просмотра в MODX Revolution, но вместо этого отображаются в виде полей на странице «Редактирование набора». +## Как это хранится -Более подробную информацию о каждой части настройки формы можно найти на соответствующей странице каждой части: +Профиль хранит наборы, а набор — свои правила. Список полей и областей, которые можно менять, хранится в справочнике и заполняется при установке MODX. -1. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) -2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) - 1. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs) -3. [Шаблоны и темы менеджера](building-sites/client-proofing/custom-manager-themes) +## Какие формы можно настроить -### Какие формы я могу настроить? +Только страницы ресурса: **Create Resource** и **Edit Resource**. Страницы чанка, сниппета, пользователя или группы пользователей настройка форм не покрывает. -Страницы создания и обновления ресурса могут быть настроены в это время в настройке формы. +Набор привязывается к одному из трёх действий: + +| Действие | Набор действует на | +| --- | --- | +| Create Resource | Страницу создания ресурса. | +| Edit Resource | Страницу редактирования ресурса. | +| Create & Edit Resource | На обе страницы сразу. | + +В последнем случае набор покрывает обе страницы, а список полей и областей он предлагает взятым со страницы редактирования ресурса. ## Смотрите также -1. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) -2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) - 1. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs) -3. [Шаблоны и темы менеджера](building-sites/client-proofing/custom-manager-themes) +1. [Настройка менеджера](building-sites/client-proofing/form-customization) +2. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) +3. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) + 1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) + 2. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) +4. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) diff --git a/ru/building-sites/client-proofing/form-customization/profiles.md b/ru/building-sites/client-proofing/form-customization/profiles.md index a9d6bc0c7..51e426257 100644 --- a/ru/building-sites/client-proofing/form-customization/profiles.md +++ b/ru/building-sites/client-proofing/form-customization/profiles.md @@ -1,17 +1,23 @@ --- title: "Профили" translation: "building-sites/client-proofing/form-customization/profiles" +description: "Профиль настройки формы в MODX: набор наборов, привязанный к группам пользователей, которые их получают." --- -## Что такое профиль настройки формы? +## Что такое профиль настройки формы -Профиль - это набор [наборов настроек формы](building-sites/client-proofing/form-customization/sets "Наборы настроек формы") . Профиль может быть ограничен для загрузки только для определенных групп пользователей. Если группы пользователей не назначены, профиль будет запущен для всех пользователей. +Профиль — это набор [наборов настроек формы](building-sites/client-proofing/form-customization/sets "Наборы настроек формы"). Профиль можно ограничить так, чтобы он загружался только для определённых групп пользователей. Если группы пользователей не назначены, профиль будет запущен для всех пользователей. -Он также может быть помечен как «неактивный», что отключит его выполнение. +Его также можно пометить как «неактивный», что отключит его выполнение. + +**Сопоставляется только основная группа пользователя** +По умолчанию профиль сопоставляется с основной группой пользователя. Профиль, привязанный к вторичной группе, не действует, пока не включена настройка `form_customization_use_all_groups`. ## Смотрите также -1. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) -2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) - 1. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs) -3. [Шаблоны и темы менеджера](building-sites/client-proofing/custom-manager-themes) +1. [Настройка менеджера](building-sites/client-proofing/form-customization) +2. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) +3. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) + 1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) + 2. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) +4. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) diff --git a/ru/building-sites/client-proofing/form-customization/rules/field-default.md b/ru/building-sites/client-proofing/form-customization/rules/field-default.md index 05f0344fb..ce325eb0e 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/field-default.md +++ b/ru/building-sites/client-proofing/form-customization/rules/field-default.md @@ -1,22 +1,25 @@ --- -title: "Поле по-умолчанию" +title: "Значение поля по умолчанию" translation: "building-sites/client-proofing/form-customization/rules/field-default" +description: "Правило «Значение поля по умолчанию» набора настройки формы в MODX: как оно подставляет значение в поле формы." --- -## Правило по умолчанию для поля +## Что делает правило -Правило поля по умолчанию, если оно установлено, автоматически устанавливает значение поля по умолчанию. +Подставляет значение в поле формы менеджера. Значение появляется, когда форма открывается, и остаётся в поле, если пользователь сохранит форму, не меняя его. -Это будет работать только на «создавать» страницы, а **не** «обновлять» страницы. +Правило применяется на той странице, к которой привязан набор, — и на странице создания ресурса, и на странице редактирования. Чтобы оно действовало только при создании, привяжите набор к действию **Create Resource**, а не к **Create & Edit Resource**. -## Примеры +## Где задаётся -Пример правила установки категории по умолчанию для [сниппета](extending-modx/snippets "сниппет") для всех [пользователей](building-sites/client-proofing/security/users "пользователей") в отделе кадров группы пользователей будет выглядеть следующим образом: +Вкладка **Поля** набора, колонка **Default Value**. Поле со значением получает правило; пустая ячейка удаляет его. -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-fielddefault1.png) +## Шаблон нового ресурса + +На поле `template` правило задаёт шаблон, который получает новый ресурс. Это поле предлагается только набору, привязанному к действию **Create Resource**. ## Смотрите также -```php - [[getResources@section? &parents=`122` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/field-label.md b/ru/building-sites/client-proofing/form-customization/rules/field-label.md index 1c463ebd3..723a784b3 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/field-label.md +++ b/ru/building-sites/client-proofing/form-customization/rules/field-label.md @@ -1,20 +1,19 @@ --- -title: "Полевая Метка" +title: "Метка поля" translation: "building-sites/client-proofing/form-customization/rules/field-label" +description: "Правило «Метка поля» набора настройки формы в MODX: как оно переименовывает поле формы." --- -## Правило метки поля +## Что делает правило -Правило метки поля, если установлено, изменит метку поля на любое текстовое значение. +Заменяет метку поля формы текстом, который задали вы. Само поле сохраняет имя и значение, меняется только текст рядом с ним. -## Примеры +## Где задаётся -Пример правила изменения метки интротекста на «Комментарии» для [пользователей](building-sites/client-proofing/security/users "пользователей") в группе [пользователей](building-sites/client-proofing/security/user-groups "Группы пользователей") «Маркетинг» будет выглядеть следующим образом: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-fieldlabel.png) +Вкладка **Поля** набора, колонка **Label**. Поле со своей меткой получает правило; пустая ячейка оставляет штатную метку поля. ## Смотрите также -```php -[[getResources@section? &parents=`123` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/field-visible.md b/ru/building-sites/client-proofing/form-customization/rules/field-visible.md index a8853d0fa..014b23730 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/field-visible.md +++ b/ru/building-sites/client-proofing/form-customization/rules/field-visible.md @@ -1,20 +1,27 @@ --- -title: "Видимое поле" +title: "Видимость поля" translation: "building-sites/client-proofing/form-customization/rules/field-visible" +description: "Правило «Видимость поля» набора настройки формы в MODX: как оно прячет поле формы." --- -## Правило видимого поля +## Что делает правило -Правило видимости поля, если оно установлено, будет объявлять поле «видимым» или нет для пользователя. +Прячет поле формы менеджера. Поле не выводится вовсе, а значение ресурса в нём остаётся. -## Примеры +## Где задаётся -Пример правила сокрытия поля introtext от [пользователей](building-sites/client-proofing/security/users "пользователей") в группе [пользователей](building-sites/client-proofing/security/user-groups "Группы пользователей") «Отдел кадров» будет выглядеть так: +Вкладка **Поля** набора, колонка **Visible**. Снятая отметка у поля создаёт правило; поставленная обратно — удаляет его. -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-fieldvisible.png) +## К чему применяется + +К полям формы ресурса: + +`id`, `pagetitle`, `alias`, `longtitle`, `description`, `introtext`, `content`, `published`, `deleted`, `publishedon`, `pub_date`, `unpub_date`, `template`, `hidemenu`, `menutitle`, `link_attributes`, `menuindex`, `class_key`, `content_type`, `parent`, `content_dispo`, `isfolder`, `show_in_tree`, `hide_children_in_tree`, `alias_visible`, `uri_override`, `uri`, `richtext`, `cacheable`, `searchable`, `syncsite`. + +Список полей хранится в справочнике формы и заполняется при установке MODX. На базе, обновлённой с 2.x, список может быть короче. ## Смотрите также -```php -[[getResources@section? &parents=`124` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/index.md b/ru/building-sites/client-proofing/form-customization/rules/index.md index 93d6eac11..cd1221b6e 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/index.md +++ b/ru/building-sites/client-proofing/form-customization/rules/index.md @@ -1,16 +1,50 @@ --- title: "Правила настройки формы" -translation: "building-sites/client-proofing/form-customization/rules" +translation: "building-sites/client-proofing/form-customization/rules/index" +description: "Десять правил набора настройки формы в MODX: что делает каждое и в какой сетке набора оно задаётся." --- -## Что такое правило? +## Что такое правила -Правила в MODX Revolution - это просто общие правила, применимые к любому действию (страница менеджера). Они также могут быть привязаны к группам пользователей, где правило будет применяться только в том случае, если пользователь является частью этой группы пользователей. +Правила — это изменения, которые набор вносит в форму менеджера. Их десять, и каждое задаётся в одной из трёх сеток набора. -## Какие правила доступны? +| Правило | Что делает | Где задаётся | +| --- | --- | --- | +| [Видимость поля](building-sites/client-proofing/form-customization/rules/field-visible "Видимость поля") | Прячет поле формы. | Поля, **Visible** | +| [Метка поля](building-sites/client-proofing/form-customization/rules/field-label "Метка поля") | Переименовывает поле формы. | Поля, **Label** | +| [Значение поля по умолчанию](building-sites/client-proofing/form-customization/rules/field-default "Значение поля по умолчанию") | Подставляет значение в поле формы. | Поля, **Default Value** | +| [Видимость области](building-sites/client-proofing/form-customization/rules/tab-visible "Видимость области") | Прячет область формы. | Области, **Visible** | +| [Заголовок области](building-sites/client-proofing/form-customization/rules/tab-title "Заголовок области") | Переименовывает область формы. | Области, **Title** | +| [Новая область](building-sites/client-proofing/form-customization/rules/new-tab "Новая область") | Добавляет свою область в форму. | Области, **Create** | +| [Видимость TV](building-sites/client-proofing/form-customization/rules/tv-visible "Видимость TV") | Прячет переменную шаблона формы. | Переменные шаблона, **Visible** | +| [Заголовок TV](building-sites/client-proofing/form-customization/rules/tv-title "Заголовок TV") | Переименовывает переменную шаблона формы. | Переменные шаблона, **Label** | +| [Значение TV по умолчанию](building-sites/client-proofing/form-customization/rules/tv-default "Значение TV по умолчанию") | Задаёт значение по умолчанию для переменной шаблона. | Переменные шаблона, **Default Value** | +| [Перенос TV в другую область](building-sites/client-proofing/form-customization/rules/move-tv-to-tab "Перенос TV в другую область") | Переносит переменную шаблона в другую область. | Переменные шаблона, **Region** | -Доступные правила: +## Правила не правятся напрямую -```php -[[getResources@section? &parents=`133` &context=`revolution`]] -``` +В MODX 3 нет сетки правил. Правила пересобираются из трёх сеток набора при каждом его сохранении, поэтому меняете вы сетку, а не правило. + +Три сетки лежат на вкладках набора: + +- **Set Information and Fields** — сам набор и поля формы; +- **Regions** — области формы; +- **Template Variables** — переменные шаблона, назначенные шаблону набора. + +## Порядок применения правил + +Правила применяются в фиксированном порядке, чтобы одно правило не отменяло другое: + +1. значение поля по умолчанию; +2. новая область, затем видимость и заголовок областей; +3. метка и видимость полей; +4. значение по умолчанию, метка и видимость переменных шаблона; +5. перенос переменной шаблона в другую область. + +Перенос идёт последним намеренно: переменную шаблона можно перенести в область, которую тот же набор только что создал. + +## Смотрите также + +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md b/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md index c764c7c2a..7dd921c18 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md +++ b/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md @@ -1,33 +1,24 @@ --- -title: "Переместить TV на вкладку" +title: "Перенос TV в другую область" translation: "building-sites/client-proofing/form-customization/rules/move-tv-to-tab" +description: "Правило «Перенос TV в другую область» набора настройки формы в MODX: как оно переносит переменную шаблона." --- -## Правило перемещения TV на вкладку +## Что делает правило -Правило «Переместить TV на вкладку» переместит любой TV на указанную вами вкладку. +Переносит переменную шаблона формы менеджера в другую область. Переменная выводится в этой области вместо той, к которой принадлежала. -## использование +## Где задаётся -Укажите идентификатор вкладки для перехода в поле «имя» правила. Затем укажите идентификатор TV с префиксом «tv» в поле «значение». +Вкладка **Template Variables** набора, колонка **Region**. Впишите туда идентификатор области, в которую нужно перенести переменную. -Список доступных вкладок: +**Идентификатор не проверяется** +В ячейку попадает ровно то, что вы вписали. Опечатка не сделает ничего, и сообщения об этом не будет. Возьмите идентификатор из списка областей на странице [Настройка вкладок](building-sites/client-proofing/form-customization/tabs "Настройка вкладок") или из колонки **Region (ID)** вкладки **Regions** того же набора. -| ID | Описание | -| ---------------------- | ----------------------------------------------------------- | -| modx-resource-settings | Первая вкладка, или вкладка Создать / Редактировать ресурс. | -| modx-page-settings | Вторая вкладка или вкладка «Параметры страницы». | - -Вы также можете создать вкладку с помощью правила [Новая вкладка»](building-sites/client-proofing/form-customization/rules/new-tab "Новая вкладка") и перенести туда TV. - -## Примеры - -Пример правила для перемещения TV 1 на первую вкладку на странице создания ресурса будет выглядеть так: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/rule-tvmove.png) +Колонка **Region Rank** рядом задаёт порядок переменных внутри области. ## Смотрите также -```php -[[getResources@section? &parents=`1353` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/new-tab.md b/ru/building-sites/client-proofing/form-customization/rules/new-tab.md index e6e8478e6..ca87a118d 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/new-tab.md +++ b/ru/building-sites/client-proofing/form-customization/rules/new-tab.md @@ -1,41 +1,28 @@ --- -title: "Новая вкладка" +title: "Новая область" translation: "building-sites/client-proofing/form-customization/rules/new-tab" +description: "Правило «Новая область» набора настройки формы в MODX: как оно добавляет свою область в форму." --- -Следующее относится к более старым версиям MODX. Смотрите [вкладки Настройка через настройку формы](building-sites/client-proofing/form-customization/tabs) для получения инструкций по более новым версиям MODX. +## Что делает правило -## Правило новой вкладки +Добавляет в форму менеджера область собственного сочинения. Область появляется в форме отдельной вкладкой, рядом с областями формы ресурса. -Если установлено новое правило вкладки, на панели будет создана новая вкладка. +## Где задаётся -## Использование +Вкладка **Regions** набора. Нажмите **Создать**, чтобы добавить строку в сетку, и заполните два поля: -- Укажите идентификатор этой новой вкладки в поле «Имя». -- Укажите идентификатор вкладки в поле «Содержащая панель» -- Установите правило «Новая вкладка» -- Установите название новой вкладки в поле «Значение» +- **Region (ID)** — идентификатор области, например `my-new-tab`. Он должен быть уникален в пределах набора, и именно на него вы ссылаетесь, перенося переменную шаблона в область. +- **Title** — текст на вкладке. -### Доступные панели табов +Строку можно удалить снова пунктом **Delete** её контекстного меню. Удалить можно только область, созданную так; области самой формы удалить нельзя. -Вот идентификаторы для соответствующих панелей вкладок на различных страницах менеджера. +## Где появляется область -| id | Соответствующая страница | -| ------------------- | ------------------------------------------- | -| modx-resource-tabs | Страница редактирования / создания ресурса. | -| modx-chunk-tabs | Страница чанка. | -| modx-snippet-tabs | Страница сниппета. | -| modx-plugin-tabs | Страница плагинов. | -| modx-template-tabs | Страница шаблона. | -| modx-tv-tabs | Страница переменной шаблона. | -| modx-user-tabs | Страница пользователя. | -| modx-usergroup-tabs | Страница группы пользователей. | -| modx-context-tabs | Контекстная страница. | +Своя область добавляется в форму ресурса. Её нельзя добавить в форму другого элемента: страницы чанка, сниппета, пользователя или группы пользователей настройка форм не покрывает. -Панели вкладок на страницах, не относящихся к ресурсам, доступны только в версии 2.0.0-pl и выше +## Смотрите также -## Примеры - -Пример правила для создания новой вкладки на странице редактирования ресурса будет выглядеть так: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/rule-tabnew.png) +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/tab-title.md b/ru/building-sites/client-proofing/form-customization/rules/tab-title.md index 90c1a454d..3504bfbfb 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tab-title.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tab-title.md @@ -1,31 +1,21 @@ --- -title: "Название вкладки" +title: "Заголовок области" translation: "building-sites/client-proofing/form-customization/rules/tab-title" +description: "Правило «Заголовок области» набора настройки формы в MODX: как оно переименовывает область формы." --- -## Правило заголовка вкладки +## Что делает правило -Правило заголовка вкладки изменит название любой вкладки. +Заменяет заголовок области формы текстом, который задали вы. Область сохраняет своё место в форме, меняется только текст на её вкладке. -## Использование +## Где задаётся -Значения для Правила должны быть следующими: +Вкладка **Regions** набора, колонка **Title**. Область со своим заголовком получает правило; пустая ячейка оставляет штатный заголовок. -- **Имя** : идентификатор вкладки для изменения. -- **Содержащая панель** : Идентификатор вкладки для изменения. -- **Правило** : заголовок вкладки -- **Значение** : новый текст для изменения заголовка вкладки. - -Для получения списка вкладок, доступных для каждой страницы, см. [Страницы настройки формы](building-sites/client-proofing/form-customization "Страницы настройки формы") . - -## Примеры - -Пример правила изменения названия вкладки «Параметры страницы» для всех [пользователей](building-sites/client-proofing/security/users "пользователей") на «Пользовательские поля» будет выглядеть следующим образом: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-tabtitle.png) +Области формы всегда принадлежат панели ресурса. Своя область, созданная правилом [Новая область](building-sites/client-proofing/form-customization/rules/new-tab "Новая область"), получает заголовок из той же колонки. ## Смотрите также -```php -[[getResources@section? &parents=`300` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/tab-visible.md b/ru/building-sites/client-proofing/form-customization/rules/tab-visible.md index 9c06ff3ec..e8dda5670 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tab-visible.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tab-visible.md @@ -1,20 +1,19 @@ --- -title: "Видимая вкладка" +title: "Видимость области" translation: "building-sites/client-proofing/form-customization/rules/tab-visible" +description: "Правило «Видимость области» набора настройки формы в MODX: как оно прячет область формы." --- -## Правило видимой вкладки +## Что делает правило -Правило видимости вкладки, если установлено значение 0, скрывает вкладку от пользователя. +Прячет область формы менеджера. Область — это целая вкладка формы или её часть; список областей есть на странице [Настройка вкладок](building-sites/client-proofing/form-customization/tabs "Настройка вкладок"). -## Примеры +## Где задаётся -Пример правила скрытия вкладки «Параметры страницы» для всех [пользователей](building-sites/client-proofing/security/users "пользователей") будет выглядеть следующим образом: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-tabvisible.png) +Вкладка **Regions** набора, колонка **Visible**. Снятая отметка у области создаёт правило; поставленная обратно — удаляет его. ## Смотрите также -```php -[[getResources@section? &parents=`301` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-default.md b/ru/building-sites/client-proofing/form-customization/rules/tv-default.md index 5b8549dfb..d25fefead 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-default.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-default.md @@ -1,31 +1,24 @@ --- -title: "TV по умолчанию" +title: "Значение TV по умолчанию" translation: "building-sites/client-proofing/form-customization/rules/tv-default" +description: "Правило «Значение TV по умолчанию» набора настройки формы в MODX: как оно задаёт значение по умолчанию переменной шаблона." --- -## TV по умолчанию +## Что делает правило -Правило значения по умолчанию для TV, если оно установлено, устанавливает значение по умолчанию для TV. +Задаёт значение по умолчанию для переменной шаблона формы менеджера. Значение появляется, когда форма открывается. -Это работает только для действий «создать», а **не** «обновить». +Правило применяется на той странице, к которой привязан набор, — и на странице создания ресурса, и на странице редактирования. Чтобы оно действовало только при создании, привяжите набор к действию **Create Resource**, а не к **Create & Edit Resource**. -## Использование +## Где задаётся -Значения для Правила должны быть следующими: +Вкладка **Template Variables** набора, колонка **Default Value**. -- **Имя** : идентификатор TV с префиксом TV; например, для TV с идентификатором 23, «tv23» -- **Содержащая панель** : 'modx-panel-resource' -- **Правило** : «Значение ТВ по умолчанию» -- **Значение** : значение, которое вы хотите установить по умолчанию. - -## Примеры - -Пример правила установки значения по умолчанию для TV с идентификатором 23 «test»: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/fc-tvdefault.png) +**Пустая ячейка обнуляет значение** +Очищенная ячейка не возвращает исходное значение по умолчанию, а задаёт пустое. Чтобы вернуть исходное, впишите его в ячейку сами. ## Смотрите также -```php -[[getResources@section? &parents=`313` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-title.md b/ru/building-sites/client-proofing/form-customization/rules/tv-title.md index 3071fac11..b61ee4060 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-title.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-title.md @@ -1,20 +1,19 @@ --- -title: "Название ТВ" +title: "Заголовок TV" translation: "building-sites/client-proofing/form-customization/rules/tv-title" +description: "Правило «Заголовок TV» набора настройки формы в MODX: как оно переименовывает переменную шаблона формы." --- -## Заголовок TV правило +## Что делает правило -Правило заголовка TV изменит название TV. +Заменяет метку переменной шаблона формы текстом, который задали вы. Переменная сохраняет имя и значение, меняется только текст рядом с ней. -## Примеры +## Где задаётся -Пример правила установки метки на «Boo!» для TV с идентификатором 1 для всех [пользователи](building-sites/client-proofing/security/users "пользователей") будут выглядеть так: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/rule-tvlabel.png) +Вкладка **Template Variables** набора, колонка **Label**. Переменная со своей меткой получает правило; пустая ячейка оставляет штатную метку. ## Смотрите также -```php -[[getResources@section? &parents=`314` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md b/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md index 680bfe341..17001e209 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md @@ -1,20 +1,19 @@ --- -title: "TV Видимый" +title: "Видимость TV" translation: "building-sites/client-proofing/form-customization/rules/tv-visible" +description: "Правило «Видимость TV» набора настройки формы в MODX: как оно прячет переменную шаблона формы." --- -## TV Видимый правила +## Что делает правило -TV Видимый правила, если установлено значение 0, будет скрывать TV от пользователя. +Прячет переменную шаблона формы менеджера. Переменная не просто скрывается: её тип меняется на `hidden`, так что её не выводят и нельзя заполнить. -## Примеры +## Где задаётся -Пример правила сокрытия TV с идентификатором 1 для всех [пользователей](building-sites/client-proofing/security/users "пользователей") будет выглядеть так: - -![](/2.x/en/building-sites/client-proofing/form-customization/rules/rule-tvvisible.png) +Вкладка **Template Variables** набора, колонка **Visible**. Снятая отметка у переменной создаёт правило; поставленная обратно — удаляет его. ## Смотрите также -```php -[[getResources@section? &parents=`315` &context=`revolution`]] -``` +1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) +2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) +3. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) diff --git a/ru/building-sites/client-proofing/form-customization/sets.md b/ru/building-sites/client-proofing/form-customization/sets.md index 9f4c40680..b20c7cf62 100644 --- a/ru/building-sites/client-proofing/form-customization/sets.md +++ b/ru/building-sites/client-proofing/form-customization/sets.md @@ -1,53 +1,78 @@ --- title: "Наборы настроек формы" translation: "building-sites/client-proofing/form-customization/sets" +description: "Набор настройки формы в MODX: страница, к которой он применяется, шаблон и условие, которыми он ограничен, и три сетки правил, которые он держит." --- -## Что такое набор настроек формы? +## Что такое набор настроек формы -Набор настроек формы - это набор правил, которые выполняются для конкретной страницы (действия) в диспетчере. В настоящее время наборы могут применяться к страницам создания ресурса или обновления. Думайте о них как о способе сбора всех ваших «Когда загружается страница« Создание ресурса », все эти поля меняются». правила. Наборы также могут быть помечены как «неактивные», чтобы не загружаться. +Набор настроек формы — это набор правил, которые выполняются для конкретной страницы (действия) в менеджере. Думайте о них как о способе собрать все ваши «Когда загружается страница «Правка ресурса», все эти поля меняются». Наборы также можно помечать как «неактивные», чтобы не загружать. + +Набор привязывается к одному из трёх действий: **Create Resource**, **Edit Resource** или **Create & Edit Resource**. Смотрите [Настройка менеджера](building-sites/client-proofing/form-customization "Настройка менеджера"). ### Ограничение на шаблон -Вы можете выбрать шаблон, который ограничен для загрузки набора. Если Ресурс (или в Создать ресурс, шаблон родительского элемента или параметр "default_template") имеет это в качестве своего шаблона, этот набор будет работать. Не задание шаблона предполагает, что набор должен работать для всех ресурсов. +Вы можете выбрать шаблон, которым ограничен набор. Если у ресурса (а на странице создания — у родителя или в настройке `default_template`) этот шаблон, набор будет работать. Без заданного шаблона предполагается, что набор работает для всех ресурсов. -Кроме того, установка шаблона ограничивает список переменных шаблона, которые отображаются как редактируемые, переменными шаблона, назначенными этому шаблону. +Кроме того, заданный шаблон ограничивает список редактируемых переменных шаблона переменными, назначенными этому шаблону. ### Использование ограничений -Ограничение может быть установлено на множестве, чтобы ограничиться определенным значением. Например, если задать для параметра Constraint поле 'parent' и значение '123', этот набор будет применяться ко всем прямым дочерним элементам родительского элемента 123. Ограничение для поля 'class_key' и значения 'modWebLink' будет применять этот набор ко всем элементам WebLink. для страницы набора. +Ограничение задаётся на наборе и привязывает его к определённому значению. Например, ограничение по полю `parent` со значением `123` применит набор ко всем прямым детям ресурса 123. Ограничение по полю `class_key` со значением `MODX\Revolution\modWebLink` применит набор ко всем веб-ссылкам на странице набора. + +Заполнять нужно **оба** поля ограничения. Если заполнено только одно, набор не сохранится. + +Значением может быть и список через запятую: тогда правило сработает при любом из перечисленных значений. + +Значение сравнивается со значением поля ресурса как есть. В поле `class_key` лежит полное имя класса вместе с пространством имён. ## Создание набора правил -Правила можно настроить в наборе с помощью сеток и вкладок на странице редактирования набора. Когда вы закончите редактирование полей, используйте кнопку «Сохранить» в правом верхнем углу, чтобы сохранить набор. +Правила настраиваются в наборе с помощью сеток на странице редактирования набора. У страницы три вкладки: **Set Information and Fields**, **Regions** и **Template Variables**. Когда закончите, нажмите «Сохранить» в правом верхнем углу. + +Смена шаблона набора перезагружает страницу и пересобирает список переменных шаблона под новый шаблон. ### Регулировка полей -Поля находятся на первой вкладке на странице редактирования набора. Вы можете изменить видимость поля, метку, присвоенную полю, или значение по умолчанию. (Примечание. Изменения значений по умолчанию применяются только к страницам «Создать».) Чтобы вернуться к обычной метке или значению по умолчанию для поля, просто оставьте поле пустым. +Поля находятся на вкладке **Set Information and Fields**. Вы можете изменить видимость поля, метку, присвоенную полю, или значение по умолчанию. Чтобы вернуть обычную метку поля, просто оставьте ячейку пустой. -### Скрытие или переименование вкладок +Настраивать можно поля формы ресурса: `id`, `pagetitle`, `alias`, `longtitle`, `description`, `introtext`, `content`, `published`, `deleted`, `publishedon`, `pub_date`, `unpub_date`, `template`, `hidemenu`, `menutitle`, `link_attributes`, `menuindex`, `class_key`, `content_type`, `parent`, `content_dispo`, `isfolder`, `show_in_tree`, `hide_children_in_tree`, `alias_visible`, `uri_override`, `uri`, `richtext`, `cacheable`, `searchable`, `syncsite`. -Вкладки находятся на 2-й вкладке на странице редактирования набора. Вы можете изменить их видимость, а также их название. Вы также можете создавать новые вкладки для отображения на странице редактирования. +### Скрытие или переименование областей -При создании новой вкладки вам будут представлены поля ID и Title. Поле заголовка - это то, что будет отображаться в виде текста новой вкладки; тогда как идентификатор - это то, что используется при перемещении TV во вкладку. +Области находятся на вкладке **Regions**. Вы можете изменить их видимость, а также заголовок. Можно и создать свою область, которая появится на странице редактирования. -См. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs "Настройка вкладок с помощью настройки формы") для получения дополнительной информации. +Подробнее — на странице [Настройка вкладок](building-sites/client-proofing/form-customization/tabs "Настройка вкладок"). ### Корректировка переменных шаблона -TVs находятся на 3-й вкладке на странице редактирования настроек. Вы можете настроить метку, значение по умолчанию, видимость или вкладку, на которой они находятся. +Переменные шаблона находятся на вкладке **Template Variables**. Вы можете настроить метку, значение по умолчанию, видимость и область, в которой они лежат. -Если вы хотите изменить вкладку, на которой находится TV, просто измените поле вкладки на идентификатор вкладки, на которую вы хотите переместить ее. Столбец «Ранжирование вкладок» позволяет настроить порядок, в котором TV помещается на вкладку, в отношении других TVов, перемещаемых в эту вкладку. +Чтобы изменить область переменной шаблона, впишите в поле Region идентификатор нужной области. Колонка «Region Rank» задаёт порядок переменной внутри области относительно других переменных, переносимых туда же. + +Правила применяются в фиксированном порядке, и перенос переменной идёт последним — переменную можно перенести в область, которую тот же набор только что создал. Смотрите [Правила настройки формы](building-sites/client-proofing/form-customization/rules "Правила настройки формы"). ## Редактирование наборов через XML -Наборы можно экспортировать в файлы XML, щелкнув правой кнопкой мыши Набор на странице редактирования профиля. MODX экспортирует набор в файл XML и предложит вам загрузить его. Оттуда вы можете редактировать файл XML напрямую, а когда закончите, «импортировать» его обратно через кнопку в сетке «Наборы». Это может быть полезно, если вы не хотите использовать пользовательский интерфейс или хотите иметь общие наборы, которые вы используете на нескольких сайтах. +Наборы можно экспортировать в файлы XML, щёлкнув правой кнопкой мыши по набору на странице редактирования профиля. MODX экспортирует набор в файл XML и предложит его загрузить. Оттуда можно править XML напрямую, а затем «импортировать» его обратно кнопкой в сетке «Наборы». Это удобно, если вы не хотите пользоваться интерфейсом или хотите иметь общие наборы для нескольких сайтов. + +Импорт набора из XML создаст **новый** набор, а не переопределит существующие. После импорта можно деактивировать прежние наборы. + +**Правила переменных шаблона через импорт не проходят** +Импортер записывает правила переменной шаблона под её голым идентификатором, а всё, что их читает, ищет идентификатор с префиксом `tv`. Правила переменных шаблона импортированного набора приходится задавать заново вручную в сетках набора. + +## API раздела + +Пакет может работать с разделом через действия коннектора. Все они требуют права `customize_forms`: -Импорт набора из XML создаст **новый** набор, а не переопределит существующие. После импорта набора из XML вы можете деактивировать любые старые наборы. +- `Security/Forms/Profile/Activate`, `ActivateMultiple`, `Create`, `Deactivate`, `DeactivateMultiple`, `Duplicate`, `GetList`, `Remove`, `RemoveMultiple`, `Update`, `UpdateFromGrid`; +- `Security/Forms/Set/Activate`, `ActivateMultiple`, `Create`, `Deactivate`, `DeactivateMultiple`, `Duplicate`, `Export`, `GetList`, `Import`, `Remove`, `RemoveMultiple`, `Update`, `UpdateFromGrid`. ## Смотрите также -1. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) -2. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) - 1. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs) -3. [Шаблоны и темы менеджера](building-sites/client-proofing/custom-manager-themes) +1. [Настройка менеджера](building-sites/client-proofing/form-customization) +2. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) +3. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) + 1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) + 2. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) +4. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) diff --git a/ru/building-sites/client-proofing/form-customization/tabs.md b/ru/building-sites/client-proofing/form-customization/tabs.md index 481e17a1f..2d7da5977 100644 --- a/ru/building-sites/client-proofing/form-customization/tabs.md +++ b/ru/building-sites/client-proofing/form-customization/tabs.md @@ -1,41 +1,54 @@ --- title: "Настройка вкладок" translation: "building-sites/client-proofing/form-customization/tabs" +description: "Области формы ресурса в MODX, которые настройка форм может спрятать или переименовать, и как добавить свою область." --- Когда вы используете настройку форм для настройки форм в менеджере MODX, вы можете либо разрешить / запретить доступ к определенным полям, либо разрешить / запретить доступ ко всем вкладкам или *частям* вкладок. -**Если вкладка не является вкладкой** При настройке правил настройки формы в разделе « **Безопасность» -> «Настройка формы»** , а затем при редактировании набора поведения существует список «вкладок», но этот список не соответствует непосредственно знакомому «документу». , «Настройки», «Переменные шаблона» и «Группы ресурсов». Скорее, идентификаторы вкладок, перечисленные здесь, относятся ко всем вкладкам или *частям* вкладок. +**Если область — не вкладка** При настройке правил в разделе **Admin → Form Customization**, а затем при редактировании набора, существует список «Областей», но он не соответствует непосредственно знакомым «Документ», «Настройки», «Переменные шаблона» и «Ресурсные группы». Идентификаторы областей, перечисленные здесь, относятся ко всем вкладкам или *частям* вкладок. -## Tab Regions +## Области формы Это различные области вкладок, видимость которых можно переключать. -| ID | Название вкладки по умолчанию | Описание | -| ---------------------------------- | ----------------------------- | ---------------- | -| modx-resource-settings | Документ | Основная вкладка | -| modx-resource-main-left | | -| modx-resource-main-right | | -| modx-page-settings | настройки | Основная вкладка | -| modx-page-settings-left | | -| modx-page-settings-right | | -| modx-page-settings-right-box-left | | -| modx-page-settings-right-box-right | | -| modx-panel-resource-tv | Переменные шаблона | Основная вкладка | -| modx-resource-access-permissions | Ресурсные группы | Основная вкладка | +| ID | Заголовок области по умолчанию | Описание | +| --- | --- | --- | +| modx-resource-settings | Документ | Основная вкладка | +| modx-resource-main-left | | | +| modx-resource-content-above | | | +| modx-resource-content-below | | | +| modx-resource-main-right | | | +| modx-resource-main-right-top | | | +| modx-resource-main-right-middle | | | +| modx-resource-main-right-bottom | | | +| modx-page-settings | Настройки | Основная вкладка | +| modx-page-settings-left | | | +| modx-page-settings-right | | | +| modx-page-settings-box-left | | | +| modx-page-settings-box-right | | | +| modx-panel-resource-tv | Переменные шаблона | Основная вкладка | +| modx-resource-access-permissions | Ресурсные группы | Основная вкладка | + +Набор, привязанный к действию **Create Resource**, предлагает на две области меньше: `modx-resource-content-above` и `modx-resource-content-below`. + +Список областей хранится в справочнике и заполняется при установке MODX. На базе, обновлённой с 2.x, список может быть короче. ## Добавление новых вкладок -Добавить новую вкладку довольно просто. Отредактируйте свой Набор и откройте вкладку Регионы. Нажмите кнопку «Создать новую вкладку», присвойте ей идентификатор, например «my-new-tab», и описание. +Добавить новую вкладку довольно просто. Отредактируйте свой набор и откройте вкладку **Regions**. Нажмите **Создать**, задайте области идентификатор, например `my-new-tab`, и **Title**. -![](/2.x/en/building-sites/client-proofing/form-customization/fc_new_tab.jpg) +![](fc_new_tab.jpg) -Каждый раз, когда вам нужно обратиться к области вкладки, например, при перемещении переменных шаблона на новую вкладку, используйте идентификатор, который вы ей дали. +Каждый раз, когда вам нужно обратиться к области, например при переносе переменных шаблона на новую вкладку, используйте идентификатор, который вы ей дали. + +Идентификатор должен быть уникален в пределах набора. Область, созданная так, удаляется снова пунктом **Delete** её контекстного меню; области самой формы удалить нельзя. ## Смотрите также -1. [Настройка менеджера с помощью плагинов](_legacy/administering-your-site/customizing-the-manager-via-plugins) +1. [Настройка менеджера](building-sites/client-proofing/form-customization) 2. [Профили настройки формы](building-sites/client-proofing/form-customization/profiles) 3. [Наборы настроек формы](building-sites/client-proofing/form-customization/sets) - 1. [Настройка вкладок с помощью настройки формы](building-sites/client-proofing/form-customization/tabs) -4. [Шаблоны и темы менеджера](building-sites/client-proofing/custom-manager-themes) + 1. [Правила настройки формы](building-sites/client-proofing/form-customization/rules) + 2. [Настройка вкладок](building-sites/client-proofing/form-customization/tabs) +4. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) diff --git a/ru/building-sites/client-proofing/index.md b/ru/building-sites/client-proofing/index.md index 2bef54f9c..54cec2aaa 100644 --- a/ru/building-sites/client-proofing/index.md +++ b/ru/building-sites/client-proofing/index.md @@ -1,8 +1,34 @@ --- title: "Настройка системы управления для клиента" translation: "building-sites/client-proofing" +description: "Упростить менеджер MODX для клиента: вид менеджера и страницы входа, дашборды, формы менеджера и права доступа к нему." --- -Система управления MODX - это очень мощный административный интерфейс, и когда вы создаете сайт для клиента, скорее всего, вы захотите немного упростить административный интерфейс для него. +Система управления MODX — это очень мощный административный интерфейс, и когда вы создаёте сайт для клиента, скорее всего, захотите немного его притихнуть. -Для этого есть несколько инструментов. \ No newline at end of file +## Вид менеджера + +- [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) — переопределить файлы менеджера своей темой. +- [Настройка входа в Менеджер](building-sites/client-proofing/manager-login) — логотип, фон, блок справки и язык страницы входа. +- Настройка `manager_logo` ставит ваш логотип в левую панель менеджера. + +## Дашборды + +[Дашборды](building-sites/client-proofing/dashboards) — виджеты на странице, которую видит пользователь после входа, и кто какие видит. + +## Формы менеджера + +[Настройка форм](building-sites/client-proofing/form-customization) — профили, которые скрывают поля, переименовывают вкладки и меняют значения, и наборы правил, которые в них входят. + +## Доступ к менеджеру + +[Безопасность](building-sites/client-proofing/security) — политики, права, группы пользователей, роли и группы ресурсов, которые определяют, что может делать пользователь. + +## Смотрите также + +1. [Настройка системы управления для клиента](building-sites/client-proofing) +2. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) +3. [Настройка входа в Менеджер](building-sites/client-proofing/manager-login) +4. [Дашборды](building-sites/client-proofing/dashboards) +5. [Настройка форм](building-sites/client-proofing/form-customization) +6. [Безопасность (ACL)](building-sites/client-proofing/security) diff --git a/ru/building-sites/client-proofing/manager-login.md b/ru/building-sites/client-proofing/manager-login.md index 80ca1718f..6ce2fd9a1 100644 --- a/ru/building-sites/client-proofing/manager-login.md +++ b/ru/building-sites/client-proofing/manager-login.md @@ -1,6 +1,7 @@ --- title: Настройка входа в Менеджер translation: "building-sites/client-proofing/manager-login" +description: "Страница входа в менеджер MODX: логотип, фоновое изображение, блок справки, язык и настройки, которые их меняют." --- В MODX 3 внешний вид страницы входа в Менеджер настраивается проще. @@ -9,7 +10,14 @@ translation: "building-sites/client-proofing/manager-login" По умолчанию используется логотип MODX из `/manager/templates/default/images/modx-logo-color.svg`. -Чтобы поставить другой логотип, укажите URL изображения в системной настройке `login_logo`. Подойдёт локальный файл или полный внешний URL. Ширина ограничена 192 пикселями (или 384 на дисплеях 2x). +Чтобы поставить другой логотип, укажите URL изображения в системной настройке `login_logo`. Подойдёт локальный файл или полный внешний URL. Ширина ограничена 192 CSS-пикселями. + +Логотип используется и в письмах Менеджера — в стандартном шаблоне `email/default.tpl`. + +**Своей теме нужен свой логотип** +Логотип по умолчанию читается из каталога темы, без отката на `default`. В теме без `images/modx-logo-color.svg` на странице входа будет битый логотип. + +Favicon страницы задаётся отдельно, настройкой `manager_favicon_url`. ## Фоновое изображение @@ -31,12 +39,38 @@ translation: "building-sites/client-proofing/manager-login" $modx->controller->setPlaceholder('background', '/full/url/to/image.jpg'); ``` +Событие `OnManagerLoginFormPrerender` делает то же самое, но его вывод вставляется перед формой. + ## Блок справки На странице входа есть блок помощи, но по умолчанию он выключен. Включите системную настройку `login_help_button`. Внизу панели входа появится ссылка Help. -Текст блока лежит в лексиконе. Откройте **Система → Лексиконы**. Namespace: `core`, topic: `login`, нужный язык. Ключи: `login_help_button_text`, `login_help_text`, `login_help_title`. Правьте значение двойным кликом. +Текст блока лежит в лексиконе. Откройте **Admin → Лексиконы**. Namespace: `core`, topic: `login`, нужный язык. Ключи: `login_help_button_text`, `login_help_text`, `login_help_title`. Правьте значение двойным кликом. + +Текст приветствия выбирается по времени суток из ключей `login_greeting_morning`, `login_greeting_afternoon`, `login_greeting_evening` и `login_greeting_night` той же темы. + +## Язык + +Язык страницы входа выбирается прямо на ней. Это не настройка `manager_language`: в MODX 3 такую настройку удаляют при обновлении, а язык живёт в сессии. Страница входа берёт язык из запроса, затем из сессии, затем из заголовка `Accept-Language` браузера, иначе использует `en`. + +## Другие настройки + +| Настройка | Что меняет | +| --- | --- | +| `allow_manager_login_forgot_password` | Показывать ли блок сброса забытого пароля. | +| `manager_login_url_alternate` | Адрес, куда отправляется неавторизованный пользователь, вместо страницы входа. | +| `manager_direction` | Направление текста, `rtl` для языка справа налево. | +| `compress_css` | Подключать ли на странице входа минифицированный стиль. | +| `password_min_length` | Минимальная длина пароля, в подсказке под полем. | +| `session_cookie_lifetime` | Время жизни сессии, в подписи к чекбоксу «запомнить меня». | ## Вход без пароля -При необходимости включите [вход по magic link](building-sites/client-proofing/security/passwordless-login) вместо логина и пароля. +При необходимости включите [вход по magic link](building-sites/client-proofing/security/passwordless-login) вместо логина и пароля. С настройкой `passwordless_activated` форма показывает только поле для адреса почты. Срок действия ссылки задаёт настройка `passwordless_expiration`, по умолчанию 3600 секунд. + +## Смотрите также + +1. [Настройка системы управления для клиента](building-sites/client-proofing) +2. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) +3. [Настройка входа в Менеджер](building-sites/client-proofing/manager-login) +4. [Вход по magic link](building-sites/client-proofing/security/passwordless-login) diff --git a/ru/building-sites/client-proofing/security/drag-resource-into-group1.png b/ru/building-sites/client-proofing/security/drag-resource-into-group1.png new file mode 100644 index 0000000000000000000000000000000000000000..deb1a5e0075044b0f865952ce03469fbac065434 GIT binary patch literal 20409 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 literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/index.md b/ru/building-sites/client-proofing/security/index.md index 69735636f..8ef270bdc 100644 --- a/ru/building-sites/client-proofing/security/index.md +++ b/ru/building-sites/client-proofing/security/index.md @@ -1,38 +1,105 @@ --- title: "Безопасность (ACLs)" translation: "building-sites/client-proofing/security" +description: "Модель безопасности MODX: группы, политики и разрешения, и как список контроля доступа их связывает." --- ## Безопасность в MODX Revolution -Безопасность в MODX Revolution строится на Attribute-Based Access Control (ABAC). +Безопасность в MODX Revolution построена на списках. Права выдаются группам пользователей и привязываются к объекту с указанием минимальной роли. -У каждого пользователя есть объект [User](building-sites/client-proofing/security/users). Его можно включить в любое число [User Groups](building-sites/client-proofing/security/user-groups). Группам задают атрибуты через [Access Control Lists](building-sites/client-proofing/security/policies/acls) (ACL). Названия ACL зависят от того, куда их применяют, но принцип один: в списке лежат [Permissions](building-sites/client-proofing/security/policies/permissions). Эти разрешения открывают доступ к разделам и действиям в MODX. +Каждый пользователь в MODX — это объект [User](building-sites/client-proofing/security/users "Пользователи"), который может состоять в любом числе [групп пользователей](building-sites/client-proofing/security/user-groups "Группы пользователей"). Каждой группе пользователей назначаются атрибуты через [списки контроля доступа](building-sites/client-proofing/security/policies/acls "ACL") (ACL). У этих ACL разные названия в зависимости от того, к чему они применены, но у всех есть одно общее свойство — они содержат список [разрешений](building-sites/client-proofing/security/policies/permissions "Разрешения"). Эти разрешения открывают доступ к разным разделам и действиям MODX. -Обычно у ACL есть: +У ACL обычно есть следующее: -- **Principal**: кто получает права. По умолчанию это User Group. -- **Target**: к чему применяется ACL, например Context или Resource Group. -- **Access Policy**: список Permissions по этой ACL. -- **Authority**: минимальный уровень полномочий для использования ACL (см. [Roles](building-sites/client-proofing/security/roles)). +- **Principal** — объект, получающий права доступа. В MODX по умолчанию это группа пользователей. +- **Target** — объект, к которому они применяются, например контекст или группа ресурсов. +- **Access Policy** — список разрешений, которые даёт этот ACL. +- **Authority** — минимальный уровень authority, нужный для использования этого ACL (см. [Роли](building-sites/client-proofing/security/roles "Роли")). -В MODX доступ **allow/deny**: по умолчанию всё открыто. После назначения ACL на объект (Context или Resource Group) туда попадают только те, у кого есть нужные Permissions. +Проверку ACL пользователь проходит, когда authority его роли **не больше** authority самого ACL: политики выдаются группе, а роль — это просто число, с которым сравнивается порог. -### Видео-туториал по безопасности +Доступ в MODX **по разрешению**: по умолчанию он открыт. Как только к объекту — контексту или группе ресурсов — применён ACL, этот объект доступен только тем, у кого есть подходящие разрешения. -На Sample Site MODX показано, как: +### Права страницы -- ограничить RSS для Directors и выше -- ограничить Blog только для Staff -- сделать «secure» Context только для Directors и выше -- ограничить часть категорий элементов только для администраторов +Странице списков контроля доступа нужно право `access_permissions`. + +## Что создаётся при установке + +MODX 3 создаёт при установке: + +| Кто | Что | +| --- | --- | +| Анонимный пользователь | Политика **Load Only** на контексте `web`, с authority 9999. | +| Группа `Administrator` | Политика **Administrator** на контекстах `web` и `mgr`, с authority 0 — это роль Super User. | + +Анонимный пользователь — не группа: это ACL с principal `0`. Группы «Anonymous» в базе нет, а в дереве групп он показан как псевдоузел «(Anonymous)». + +Роль **Member** имеет authority 9999, поэтому она не проходит проверку ACL с authority 0. Роль **Super User** проходит. + +## Видеоурок по безопасности + +Демонстрирует применение понятий на тестовом сайте MODX: + +- Ограничить RSS-ленту для директоров и выше +- Ограничить блог только для сотрудников +- Создать защищённый контекст для директоров и выше +- Ограничить некоторые категории элементов администраторами ![](understanding-revo-acls.jpg) -### Пример: доступ к Context +### Пример: доступ к контексту -Создайте Context `test` и назначьте ему ACL. Откройте Context, вкладка **Access Permissions**. Дайте группе (например `HR Dept`) явный доступ: выберите User Group, политику `Administrator` и нужный Authority (например `9999` для Member): +Хороший пример — создать контекст 'test' и назначить ему ACL. Это делается в форме контекста, на вкладке 'Access Permissions'. Там можно дать группе пользователей (например, 'HR Dept') явный доступ к этому контексту: выбрать группу, политику 'Administrator' и указать требуемый Authority (например, 9999 для 'Member'): ![](sec-ugctx1.png) -Context `test` станет доступен пользователям, которые в группе `HR Dept` с ролью Member или с более сильным [Authority](building-sites/client-proofing/security/roles). +Это ограничит контекст 'test' пользователями, которые являются Member (или имеют [роль](building-sites/client-proofing/security/roles "Роли") с большим authority) группы 'HR Dept'. + +## События + +Поведение аутентификации и учётных записей меняется плагином. События раздела: + +| Событие | Когда срабатывает | +| --- | --- | +| OnManagerLogin, OnWebLogin | После того, как пользователь вошёл. | +| OnManagerAuthentication, OnWebAuthentication | Пока проверяются данные пользователя. | +| OnUserNotFound | Когда вход называет несуществующего пользователя. | +| OnManagerLogout, OnWebLogout | После того, как пользователь вышел. | +| OnBeforeManagerLogout, OnBeforeWebLogout | Перед выходом пользователя. | +| OnUserBeforeSave, OnUserSave | До и после сохранения пользователя. | +| OnUserBeforeRemove, OnUserRemove | До и после удаления пользователя. | +| OnUserFormSave, OnBeforeUserFormSave | До и после сохранения пользователя из формы менеджера. | +| OnUserChangePassword | После того, как пользователь сменил пароль. | +| OnUserActivate, OnBeforeUserActivate | После и до активации пользователя. | +| OnUserDeactivate, OnBeforeUserDeactivate | После и до деактивации пользователя. | +| OnUserBeforeAddToGroup, OnUserAddToGroup | До и после добавления пользователя в группу. | +| OnUserBeforeRemoveFromGroup, OnUserRemoveFromGroup | До и после удаления пользователя из группы. | +| OnUserGroupBeforeSave, OnUserGroupSave | До и после сохранения группы. | +| OnUserGroupBeforeRemove, OnUserGroupRemove | До и после удаления группы. | +| OnResourceGroupBeforeSave, OnResourceGroupSave | До и после сохранения группы ресурсов. | +| OnBeforeResourceGroupRemove, OnResourceGroupRemove | До и после удаления группы ресурсов. | +| OnResourceAddToResourceGroup, OnResourceRemoveFromResourceGroup | Когда ресурс добавляют в группу ресурсов или убирают из неё. | + +## Смотрите также + +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/passwordless-login/index.md b/ru/building-sites/client-proofing/security/passwordless-login/index.md index 24889a8d1..653b94631 100644 --- a/ru/building-sites/client-proofing/security/passwordless-login/index.md +++ b/ru/building-sites/client-proofing/security/passwordless-login/index.md @@ -2,6 +2,7 @@ title: "Вход без пароля" translation: "building-sites/client-proofing/security/passwordless-login" sortorder: 0 +description: "Вход в MODX по волшебной ссылке вместо пароля: как включить, сколько живёт ссылка и что при этом не меняется." --- MODX3 имеет новую функцию под названием "Вход без пароля", которая может быть активирована с помощью системных настроек. После активации этой функции вам больше не нужно вводить пароль и имя пользователя для входа. Вместо этого вы просто вводите адрес электронной почты своей учетной записи, и система отправит вам электронное письмо со ссылкой для одноразового входа. Нажав на эту ссылку, вы сразу же войдете в менеджер. @@ -10,7 +11,7 @@ MODX3 имеет новую функцию под названием "Вход Потребность в надежном пароле часто заставляет людей выбирать универсальные псевдозащищенные пароли, повторно используя проверенную надежную фразу и, возможно, просто добавляя число к услуге. Как администратор сайта, вы не должны поощрять своих пользователей делать небезопасные вещи. Это устраняет риск незащищенного пароля от вашей установки MODX, но, конечно, для ваших пользователей нужна защищенная учетная запись электронной почты. Но это также относится и к традиционному входу в систему по имени пользователя и паролю, потому что здесь также есть самообслуживание паролем, где вы можете сбросить пароль по электронной почте. -Кроме того, если вход без пароля включен, пароли больше не сохраняются в базе данных MODX. Тогда больше не будет теоретического риска кражи паролей в результате взлома базы данных (независимо от любого шифрования). +Пароль пользователя всё равно остаётся в базе: при каждом входе по ссылке в поле `password` пишется хеш временного пароля. Выигрыш в том, что пользователю не нужно придумывать, запоминать и переиспользовать пароль, а не в том, что пароля в базе нет. ## Как включить пароль без логина @@ -26,6 +27,31 @@ MODX3 имеет новую функцию под названием "Вход Вы можете настроить срок действия ссылки для входа в систему через системный параметр `passwordless_expiration`. По умолчанию оно установлено на 3600 секунд, что должно быть достаточно для всех, чтобы войти в систему. Если вы параноик, вы можете легко установить на более низкое значение, например, 600 разрешить использование ссылки только на 10 минут. Срок действия также будет указан в самом электронном письме. -## Дополнительные замечания +## Ссылка работает один раз + +Ссылка работает только один раз: запись удаляется из реестра, как только её использовали. Токен ссылки подписан хешем пароля пользователя, поэтому ссылка перестаёт работать, как только пароль сменился. + +## Дополнительные примечания Имейте в виду, что _не будет сообщения об ошибке_, если вы введете неизвестный адрес электронной почты во время входа в систему. Это хорошо известное и предполагаемое поведение для предотвращения попыток перечисления пользователей. + +## Смотрите также + +1. [Пользователи](building-sites/client-proofing/security/users) +2. [Группы пользователей](building-sites/client-proofing/security/user-groups) +3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +4. [Роли](building-sites/client-proofing/security/roles) +5. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/acl-ecat1.png b/ru/building-sites/client-proofing/security/policies/acl-ecat1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cede2e1e7b30f7116e00105691ac51381bab0a GIT binary patch literal 10164 zcmZv?1ymeC*DX2(8FbL#g9L&EcNkoPyJnE!ZUY(IA;E&X1Pd12-66O`2*Du)88ig< zNAi9DyYIexd)BH|r@HE#s@13V-c#KX>Z)=$nBXun08fZ8sz#mGTw0`8baU6qV!a^`B^0*f71Y zvN9H)veHsGZlI=#)kv=q7_Qs-3}EH17v^D%1IT4vp3CzsWQr7-tYcN07FNFaUHdh&sw-5_x3VlRvp0&4a-9kA) zFn`1TA!nWz{aL@XGi&Oo5Wt$(cl+&{0)F(F5Ne9$aeG+y>Ap*+H_tQSB*K1erl2pG*P`)_miP1P7vHd) zqdJK$(~wN-i{#C#KCR!$GbZHvac;lNi$-s?lB;-oBb=98Jrz!!GXvj)H48<&QuiA@ zEA%Dph~{j{mLuJc^)k<9$DI4@S5YHD?}+>oNlV;)787$#f&5_}o$_>3D?4u8yw z+}}G&$hIrg=`)6V-39zdd06m{)sj|^JARYEiSL&ggGXyG?$@T2OkV6)$jey91YGyJ zP)?p2s|KS@e_uRBn;;*~YKT|$gT7``Tod|<`O+4`JwG1<*h|q}+mA@jw&xN3B4ekb z8(VMU8-O&gmSt|wLWowO`)CqMsowsPFl#Xf4`tV9&71BQe70rP~Hc)r$@go{X zLl&LV@W=#VmbU{})DN2vWmTYlS&23ORHCvuMYB@Y@iLGPR)@TWw|TxXs`Hkb6fZ5e zt%PgtBZcQnnfdW`GFJv@3M!qy%U73cDX!GfWK|S}D*WLo{hwo<=?NK3a=doa`LE83 z+-y$LGhVLL9(;UO&!y2P+D?jsVPDpIn)LFJ|5I_=%9_dj>DYHZ!Ct04b({C?b2TSc zetU%`w9PJ?Xb%`my3h<=@QX=)OgkfZNF0NE zxW%HlKO>g-XCe?wE|fiqSL2nZN48X8PbVQxt2H0`Rhxi9G2uQKT|IqgXMANlmLk8J z3U-iO^hyiu$0)w|=jWB3kY60ZOKl@BoZZmNL2+iNqD8Rl^GIO z)1_YQjW}@E-=Vi|t(`m@bXj0^KGuwXsM@cn0>!Slw1QYivvWvhYJPtQ7Q5Y?WVurB zQvz8hXRBmTZG4V4y;kp=S#7nP)-EoNj`pN%XVSxlOh{8D-8KMD) z71*JQ3HU7GPvDbS8nRzPtPnTJAW(cPRmUdB{ad%|zCD_EY3r@N)R>ObXl1_|!8?Kg zS)mhmHd3Wv;*Nua`Fw-epV9do{m};F6rLM7ZLxM-&BPT+1<;ser9WNG(u#kgnxuQm zFsKH;)D#}o);7Ozn8DbC9nZ0UvQg}srl(Z)ckwq23>l#F*z-1IA#w}XY4*Z5OKpOn z4F38%xghzFZ$F~;x;d9bzpxusAqz5?9fw)fg+aMqo^Ml;GT^>xtkf$4r4QAjC5Mqq znnjm?>5-3?u~`(bexK~Jo9w~y+*?3f8qAvMxxv*SQD8fKP0cu9+Oz~#jXe%rF%C`8 z=J2p#LKr6m6IPo3o-nN%>e(~dQYU=5$GI&^pVLeEVeLyC(I(pX?EJIWV1gF{_DJkr zWzxP8RQl$*sCkx#}bS zPKg_8v!2{tTfdoyiF6pN+b(RtUZxQp*wq2r$PRccKuySU$lml14fc(WOq zI#4~bsx>7-1%W4dJ~jL{)&9e0P*`+a6NKOFd7NBu$6L(MaH%E|h*o z>feGKQO*uM6ndo8pDVDA7lLx1SzBB8o1L7U)$fhR?OdOpzB}lp^E>FB+e|YLvP9iD zJ9uJIQ|CPO!1B=!*Pw2se&3Ym!`mM{BaD4TjZJDrR#}XhvOj%VC;#o#Om#qjk{2i3 z+auQ^C5s}CDo#R2nX^9sBUm89%h-nb@IE`6E0el-=X9{qm`MXgHbAX-gJdvAjtI+3 zzJIH?3ZwEJ{*OpJcm23JGf~A zpVP*>ax7ppiK~Ue+rQf_;6AIuMH>1dQ>EhT8@NEM?@LL(& z8HggH6^0`pXpMBI3I;s2BdG%=o+|R=wXFCj!-X8NV*}s#q7D9~PsAS$ zL_(Mw(-fN{Y}0;j5V=GODtsksokn%XCMlqah?fsnAsGs`P$#AjesQskMSwNSsSsgG zslSu1;0lLvgeTqZbjW)hfPxT#-Bb-T4K%-tCyyx8Kxv>+k37wi=DyswPAJ$Fo{`>h zYGT(GEyyMi69}9iJmSGEEYuT=je~u5dFf0=E*6)_mVh^EDNZczcN$SKX~cV2sPD2P zh%%G6jKm3UWdgeEj;$x5B*hj||7JK8=o_1=3zEW^LLjI}?W=%FL$Su^7Q4Tb7edi|-)W zl{$rnE(6QOe^>N{7x#0mt?(N=27pG-wxcm?0_c;)>M5MbE8QD4!6YtqB&F&4rs&+@ ztsXYhnwMpOxR&Kv|CceePi)DVD$gWaBqX|3W3~HLk!!Hzsu;VvFF~c5*(AyrbQM6+!Y2 zYU*8LMt+kdh?W_GQXtJn1b1oD`t)-4hOr24Gz&K(LximiO%~fiqSSPTqN}#Q^Nf9u z2sVP=4R>*lP5sccwLR%Xn=!3HhRglU3h0|T+BJAJHeU{*+i2+P!bsaUyPv-Js1a)t zjF{+Fuorvc@spM$8satLw;s~SnV>L6P8~#)G*DRQQmj`_!G{EmL~-dpTVR>TA1cs0 z@(DxJsEXD?pHEQ64bR_vhTi=i`g(QsRc0>?8z=Zr?=Q73;UUk!?PVw<(W{$uyORku zD$DkAb8mqTPYkK|MGtne03PQJ;3=r~o6<P78vaR$~6_1@Ls=uyy$>#aS>5@b9%7FZ)>C zoF(E)x>7Qe7IE?MFXN8q<&5^9Hoyh5V3CktDmmMwh-&qF z$}3V66K&S?rXwF3us+#^T+=LEq)7THt!YjyLh#JIG<2UcQ{w_Z37``|XW~Vm+IA4) z_g3^TmqGzLg4ro~9L2j|qcBIAa|(_rP|M!0Syb)FAF zLa#54jfGM7A6W(~$Js2AH7i>oE~Um?=2B znvh@1Oe3N80n##|ml=G$C*_il?g}d`xZc_r7Q;rAk@>h{zfGjhRKk85rDb<|BW4QA zX6u@otgBkb2gX!ym8-a%Q&!23%+anE`VIQ|00q+fA++TBlo5!j*NAl!GKk3=4_=(v z(pbXT*;?fl9@+5$I){PWhIiNzA8!un4%^~CqIyfUPcMoeoA@5tSo>e-v^M-m@3Je$ zp#evM0uk$pAbTVwh3P{{*7T?_o0q%pTFOFT%(!V6(iMHk^4)UFgVS~ zdCWLaRx?{sAGr!pBGL8a4KG1N^>BT;fjd^39XoLZ%obm^DGl^aekTZ?whu@Hft7*3 z&JeR1MdL5PPgv0SAIihi(cv&`4n)$xEkZ6r{=9$l?HkbnO$=QY%8cak)2OF$7HHRo zf$-h0j$B|)Fk}el*E^({4W6!@xiUS|*)T-l-`_X6zU$K+Mn=ZNO0-#|StOwcC~_NG zINBNXiB`qYgAsu==taoEG-)98U=v7g2!$k2;K>F#!C~eQn%#BT|E~#lg9#rUD*Daa zR%T-=A1CE3`Rytet`v#yt`EQ^fR}e+w~fx!R@cm2tG*Ai9-X$fU#b=M@ix~nH*Y3hUU(PttJ0WLcV|Ad zO>C6Y?_qZ7>zxS;@|k0RJEPy9ib%_)Lfj=g-4UAwBOioGcwVW)K=XJCAkPRu0uM!ximlWwQveS5cN-uC%}HW@@S&{3ZlEu zIVvl%7~Wcz_vX+}gzi_uT!xAgKbQ<#=4IUtevL$2YSciT?`%+F6eM4Kx7wF)*$HyB z-);bhAq${#ZoOm}FquARGm#KcXSu9~{d{d#Yj-eDC3Y8c^%4ASOqkR4s{D6v%K7?9 zs&eTL+Kox~Eim8@m;le&_WRa6d0A@!?OTJ^=!B0;1QFAhE`_b*Q|{;S&X0-t$cMZ* z@<2GOY8<{^D?^)@6qO+;%z)m$nea*xxJSizA%%&PIIzVXSkK%Gs#r&>8T{Os z;F_t%K!E{!{Zl?>&zBqS%<(^7-)t}k2xMq;-kY9@b&@*?fPLLoDxg96f!PNNAeOxChamCR9UllQ@qEVi$|A#)>=m9J(uA1Ww!M7egProTemFxSw~3O z(bI{N+xwZ%n0j}7%MI42b6%Nj!p-9ggmIw!TA_Q0Z=X1qkqRo1=1M?H0CnoB(_&KF9D z7fH`T-!4Pd^;@w&QV#5Vxt`GLJ1h#Rnpk=h5ki5IF&SZXy^YUAMNReow0G-Ig8w3P zCs}L!Zjqb}YCJiW76^xZee9xfe!QZaEO+*0;b^@%X*=$`?E(HC9c(Rj{=#^bLm5oL zVW3pxWeY^Ep<_3+D}(CG05A1bfFR;RW(oWVd;v?OMa@L`I(cD;nqxR6^Vm&?^yc4b ztzMQ)r1bpHjOy&=Y6%}Bn$?yQ5Tat{f#S@SvBE<3Ob?~>>S~Y(3;O}m)E%m7Eq`^(d)&1fS6l; zi}6wu1FCxF1^VT{vhS%u!@zRh*RHlO!lUSqhXVheLysRdbST~}S$Ayl23v_C9xDF3 zdoBER?A+qJ+TR`Csf%O%eSB)}--PJuIY%EYHX3K90e%Lit0f!kigVVdvtCubJu4~3 zZAdX)Z7T-XBA^bJTNOCW!w&+-NKvR?a+ibgEk{@Bm%(9l|KL3Q|Kx&E_J7o%9LA0^ ziv(Uqhct76r+T8FSYsARG~=Ji3C8=&943Fc4Q6* zXP;{K@b(`A4knuqdW54;-=tH28aOpDkU z14j9GPOLG9tMlh<25VP3Lwq_CLCKaJTeXFRVJqG>&5AgeE7p!y_I3Qn8JrHA-Btsp zOF4?AksL)GN|$PIe5r`NL{_#qiDsv}?;!H)%Goco zGt{1sFzBtUCRU_`6NS9g-W8vpFTV>?N+oJqYsL%iOgz?tffPqQ)T7(?uCETrA?Lo7 zl{>sXuR%_&wYT0zq}w$+likS_*6y?arZQcQ@w5kB{s`ldeeP_h@sB<-PRU#P&+;X= z```_DeLmSZy?f*PQ||3^l|Hp`8(Ilg*8=z0^T!(dRGA|qs74%LQ0!KPV6fh^RVY9Fu)aFgB( zO@ncA>Tgh%nY?Z^?>+QWZUvm$sOHwK{k1az!~OK;CERM}cvktGqRCa-j1iWnQx%JG z`a`P}M*;9%_LNGZ`UvOyKp$6VNl0dAGV2QH$~g;;r<=dw1i=zB@QEyvzGmX7-pwP5G^P~0&SRc)$EyESk@IHPJp@@4f*xXYqoJ2ahgSk!K=Uc#Eq;;S6`*YrR0%9siwM(@!+62OjJS$n~ zg_o?d)T7BG<3GH8_`Rke&VJv?N7o$KMElrSqG%vg-<9L;E#L^=JEox08jF=E>@bDJ z)rW!Ffg9>lQ#~uBPX}DvC3H>e2&fl3`Q~X+j?I!bcb-I=B^_1b2P7$xFdM~-#6SZm zKgzc8bT!h4A1+d4Zi~WYZa{(XMvAg}>$Pi)!~3_LOr6z*soyZB1&wuVyXr3y#^LiR zPgEd)I@^OMBq$diI{DIgnt$#ZY5EiWj^~WBqO2qhKB0ou^YOFfz$I@nnFi5ZWX2t0 z)xcXH>xQHCP8TaR^W=+?;(4BqNyG*BoVl?lb}K#jA_1!PoHXL^6Ulq2{c{KFx+tW} zCbLM|u}mXy*hS+q8{hZkI!uy8P>-^_>bHdkqXjy2$6Nhec zFaG9)jnN^+7aw4W!u6-zPbVafjG{g`bYwJ$bv~yXrS7aA$r<@p7eJlv(fY-lwU2%L zmwFF7?ZS@wvj^Q!#8a+K9=iP35soOX67SG<`vxAPGtQ5uJDDXnM7P&W5A>pw0EQK* zJa%r|I~nMqyAL|rAJ<-N5_{lt`Q^W3O=7{tH6(Zp-kvye|F5g(5x8280vscyFSa%} z0#9qZ_39n3o({U=kYz;JNU)7DJkKpr7$MtlJ%f<0*R$qYL)xAvUpzn2L&n}Hdwf`< zIiSjB8Z(Af{afN2q@wP+AgWY#?&7PDjb#C`blL&6)ox-0u;6aBXO%9J%>$+Ud2yCm zXD1Uk*x=>k$D`ZWyGiF^WZe3U9Ao%32HlIHzr{3u#5=!jhjSRf5LidD1t;ry`FhbvBbD}He#L1)f{y?J$y zY$Wa5IXd)dTvpbELLvm5ui>sZ_e~2KdkD*C^3el`D;$8fnz{7!7tva;xkm-ujpO75 z(*nXmGFjTbAuX>Lf&P|aWPcl-U?CLC--3iQ*3ksqazX#A1U#L8s{;YwOqUv+0hNgK z$70a@e#3q%5TJ?(GG-@f6UPGFLEDjr0B(XL|J&PrKvjUIVj0O|ZR`k)!7b2*9KK+B zEy@NNBrWFo$YuAT(PmnVtt>so4R9flujWV^ir2exZTq+R!L>HS77C;(tY;k+jPYCB zr@MuSS4+3uHStFynJ$Su#YG8#&7zwIe2-p090Ki ztwF>gevtXWdC8Du;BkaS_r=&Nrs%xom~@i2EqzHX*CS)RtC+)-ybWZt=4~af){aqy z{R?~UlVjBUSRd)v7#&gs2R{g^#s#pO$P|ZosgTo7e2_9Uyei?XPy?bVg*`m@52Gx% zmvu|J50#MlGea>2j6ybV1_V^bdczfginH`J{sBS@b7BUkNlo9E+8LC9`=*G%%T9!Rq-bqpc{Jw5FMeio>{2;+s;oFI!&M49jp_suUqv$RAR z-$Zz+q=2yZXK6{X|Dbt++bdp?A>z)R+Kj_Yg808N~ztO{~|o(Y=aMHM(4gl?@M ze8DRZOkD`fJpR3ol#iz1tnG=q_n^7S*=_Do<4Sv|Qss=BB1I(Jxq<*>hXCA%YDztvl_t zl_292ZEq3w)X^o*+Ds6}X7|6uA>uhNd~<$JOBQzj$MkgzbKsrO|I4DKpu&i`DF?%E7>V$4API8~HUI0o!6~77x&UaI?B^|>FrZSe5G{2HNPdwY zbdCO9!n4-BIN3*#TE}#gf)DH~jDV3MIBV0ts_f@>35pslKk6^8uG(~@$?^WFoP@c0 z){+-qGAaQj(Q)Up8Eg-(1yanYTS_2VZi4Z6{UicOM+mRC!ELNn2$X=JzX5jyefHF*E^R>BY)QXW3~Fd_R494S8@Z%bGvESNJp{tXK((+ z+uMswdqEyOFmu3f?$Zrgbn>~JAD_wUxRp~z`kS)jV-*_v

5*c^~NK;h7CNACK;I zb)rz0yO7E6KiQHkx>1wFq$^&bbbo-o$2{VOS`WgbB8L=CSD~twQ$w8Qg|qDfXq&_s_k%*7TaxSn6MYoT1oXd4kC6 zlSP#%m$sEk-Ljpf;^&K>Uk}?0JXmW2e|=T*VtzY<>}e^`!_vkzp!P%^X~tS%C!WeQ zfHhmvXxaI1k~!zI$biTH?X$4J0FAKEOb_4kW)W%WV*6cf8A!Py&Q__Ar#I)t)FC|* zZoBSn6}n{$4*cZNw|{SnQ-V0$1al@aWi*J^+;%T-JKk2UIAx|kJ3-G?9aFYt8r5{W x+JZyCv4f?h?rlcsrgaNR06STr@!%uYv&J~0ej~T5r?2q<3a?dVDy2+<{~wn$mD~UT literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/policies/acl-rg1.png b/ru/building-sites/client-proofing/security/policies/acl-rg1.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3fa8342ab27ac38a3adc6db55a9b538399ce2d GIT binary patch literal 11246 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 literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/policies/acls.md b/ru/building-sites/client-proofing/security/policies/acls.md index 78daf86d9..d9ae7e997 100644 --- a/ru/building-sites/client-proofing/security/policies/acls.md +++ b/ru/building-sites/client-proofing/security/policies/acls.md @@ -1,6 +1,7 @@ --- title: "ACL (Список контроля доступа)" translation: "building-sites/client-proofing/security/policies/acls" +description: "Списки контроля доступа MODX: пять видов ACL, что группа получает с одним из них и как сравнивается роль." --- ## Что такое ACL (список контроля доступа)? @@ -9,7 +10,17 @@ ACL, или список контроля доступа (Access Control List), ## Использование -В MODX ACL можно применить к любому modAccessibleObject. В первую очередь MODX Revolution 2.0 позволяет использовать ACL для ресурсов и контекстов. +В MODX 3 есть пять видов ACL. Каждый задаётся на своей вкладке группы пользователей: + +| Вид | Что ограничивает | +| --- | --- | +| Context ACL | Доступ к контексту. | +| Resource Group ACL | Доступ к ресурсам группы ресурсов. | +| Element Category ACL | Доступ к элементам категории и к полям ресурса. | +| Media Source ACL | Доступ к файлам медиа-источника. | +| Namespace ACL | Доступ к элементам пространства имён. | + +Первые два описаны ниже. ### ACL контекста diff --git a/ru/building-sites/client-proofing/security/policies/index.md b/ru/building-sites/client-proofing/security/policies/index.md index 7e76147bc..8e9bb49cd 100644 --- a/ru/building-sites/client-proofing/security/policies/index.md +++ b/ru/building-sites/client-proofing/security/policies/index.md @@ -1,25 +1,35 @@ --- title: "Политики" translation: "building-sites/client-proofing/security/policies" +description: "Политики доступа MODX: двенадцать штатных и шаблон, который определяет, что может содержать политика." --- ## Что такое политика доступа? Политика доступа - это набор [Разрешений](building-sites/client-proofing/security/policies/permissions "Разрешения") содержащий одно или несколько Разрешений, определённых в панели управления. По умолчанию в MODX определены следующие политики доступа: -- **Administrator**: Политика администрирования контекста со всеми разрешениями по умолчанию. -- **Content Editor**: Политика администрирования контекста с ограниченными разрешениями, относящимися к редактированию контента, но без разрешений на публикацию (`publish_document` / `unpublish_document`). -- **Context**: Стандартная политика контекста, которую можно применять при создании списков ACL для получения базового доступа в контексте (read/write и view\_unpublished). -- **Element**: Политика элемента MODX со всеми атрибутами. -- **Load Only**: Минимальная политика с разрешением на загрузку объекта. -- **Load, List and View**: Разрешает загрузку чтение и просмотри. -- **Media Source Admin**: Политика администрирования медиа источника. -- **Media Source User**: Политика пользователя медиа источника, с базовым просмотром и использованием - но без редактирования. -- **Object**: Политика объекта со всеми разрешениями. -- **Resource**: Политика ресурсов MODX со всеми атрибутами. +| Политика | Что это | Шаблон политики | +| --- | --- | --- | +| Administrator | Политика администрирования контекста со всеми разрешениями по умолчанию. | AdministratorTemplate | +| Content Editor | Политика администрирования контекста с ограниченными разрешениями, относящимися к редактированию контента, но без разрешений на публикацию (`publish_document` / `unpublish_document`). | AdministratorTemplate | +| Context | Стандартная политика контекста, которую можно применять при создании списков ACL для получения базового доступа в контексте (read/write и view\_unpublished). | ContextTemplate | +| Developer | Политика администрирования контекста со всеми разрешениями администратора, кроме административных и относящихся к безопасности. | AdministratorTemplate | +| Element | Политика элемента MODX со всеми атрибутами. | ElementTemplate | +| Hidden Namespace | Прячет пространство имён из списков. Даёт `load` и `view`, запрещает `list`. | NamespaceTemplate | +| Load Only | Минимальная политика с разрешением на загрузку объекта. | ObjectTemplate | +| Load, List and View | Разрешает загрузку, чтение и просмотр. | ObjectTemplate | +| Media Source Admin | Политика администрирования медиа источника. | MediaSourceTemplate | +| Media Source User | Политика пользователя медиа источника, с базовым просмотром и использованием - но без редактирования. | MediaSourceTemplate | +| Object | Политика объекта со всеми разрешениями. | ObjectTemplate | +| Resource | Политика ресурсов MODX со всеми атрибутами. | ResourceTemplate | -Если вы настраиваете любую из вышеуказанных политик доступа по умолчанию, продублируйте и переименуйте их перед настройкой! -Если вы этого не сделаете, при обновлении версии MODX все настройки будут утеряны, поскольку они будут переопределены сценарием установки. +Шаблон политики определяет, какие разрешения она вообще может содержать, — это список чекбоксов, который вы получаете при создании политики. Смотрите [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates "Шаблоны политик"). + +Если вы настраиваете любую из вышеуказанных политик доступа по умолчанию, продублируйте и переименуйте их перед настройкой! Сценарий установки пересоздаёт штатные политики при каждом обновлении, поэтому ваши правки в них могут пропасть. + +## Права страницы + +Странице политик нужно право `policy_view` — увидеть список, `policy_new` и `policy_save` — создать политику, `policy_edit` — изменить, `policy_delete` — удалить. Для шаблонов нужны `policy_template_view`, `policy_template_new`, `policy_template_save`, `policy_template_edit` и `policy_template_delete`. ## Создание и редактирование @@ -90,6 +100,6 @@ translation: "building-sites/client-proofing/security/policies" 4. [Ограничение Элементов от пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) 7. [Закалка MODX Revolution](getting-started/maintenance/securing-modx) -8. [Стандарты безопасности](administering-your-site/security/security-standards) +8. [Стандарты безопасности](building-sites/client-proofing/security) 9. [Поиск проблем в безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Сбрость пароля пользователя в ручную](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md b/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md index be6ce3d10..867e44fb2 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md @@ -1,6 +1,7 @@ --- title: "Политика Администратора" translation: "building-sites/client-proofing/security/policies/permissions/administrator-policy" +description: "Политика администратора MODX и полный список её разрешений." --- ## Политика Администратора @@ -9,119 +10,199 @@ translation: "building-sites/client-proofing/security/policies/permissions/admin ## Разрешения по умолчанию -| название | Описание доступа | -| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| about | О странице. | -| access_permissions | Любые связанные с разрешением доступа страницы и действия. | -| action_ok | -| actions | Страница [действий](extending-modx/menus/actions "Действия и меню") . | -| change_password | Пользователь может изменить свой пароль пользователя. | -| change_profile | Пользователь может изменить свой профиль. | -| Content_Types | Страница [типов контента](building-sites/resources/content-types "Типы контента") . | -| create | Базовый «создать» доступ к объектам. | -| credits | Просмотрите страницу «Кредиты». | -| customize_forms | Просмотр и управление [настройкой](building-sites/client-proofing/form-customization "Настройка менеджера") страницы [менеджера](building-sites/client-proofing/form-customization "Настройка менеджера") . | -| database | Страница Информация о системе | -| database_truncate | Возможность усекать таблицу базы данных. | -| delete_category | Удалить или удалить любые Категории. | -| delete_chunk | Удалить или удалить любые [чанки](building-sites/elements/chunks "Куски") . | -| delete_context | Удалить или удалить любые [контексты](building-sites/contexts "Контексты") . | -| delete_document | Удалить или удалить любые [Ресурсы](building-sites/resources "Ресурсы") . | -| delete_eventlog | Очистить журнал событий. | -| delete_plugin | Удалить или удалить любые [плагины](extending-modx/plugins "Плагины") . | -| delete_snippet | Удалить или удалить любые [сниппеты](extending-modx/snippets "обрывки") . | -| delete_template | Удалить или удалить любые [шаблоны](building-sites/elements/templates "Шаблоны") . | -| delete_tv | Удалить или удалить любые [переменные шаблона](building-sites/elements/template-variables "Переменные шаблона") . | -| delete_role | Удалить или удалить любые [роли](building-sites/client-proofing/security/roles "Роли") . | -| delete_user | Удалить или удалить любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | -| edit_category | Для редактирования любых категорий. | -| edit_chunk | Для редактирования любых [чанков](building-sites/elements/chunks "Куски") . | -| edit_context | Для редактирования любых [контекстов](building-sites/contexts "Контексты") . | -| edit_document | Для редактирования любых [ресурсов](building-sites/resources "Ресурсы") . | -| edit_locked | Позволяет пользователю отменять блокировку и редактировать заблокированный ресурс. | -| edit_parser | -| edit_plugin | Для редактирования любых [плагинов](extending-modx/plugins "Плагины") . | -| edit_role | Редактировать любые [роли](building-sites/client-proofing/security/roles "Роли") . | -| edit_snippet | Для редактирования любых [сниппетов](extending-modx/snippets "обрывки") . | -| edit_template | Для редактирования любых [шаблонов](building-sites/elements/templates "Шаблоны") . | -| edit_tv | Для редактирования любых [переменных шаблона](building-sites/elements/template-variables "Переменные шаблона") . | -| edit_user | Для редактирования любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | -| element_tree | Возможность просмотра дерева элементов на левой панели. | -| empty_cache | Очистить кеш сайта. | -| export_static | Для экспорта сайта в статический HTML. | -| file_manager | Использовать файловый менеджер, в том числе создание / удаление файлов. | -| file_tree | Для просмотра дерева файлов на левой панели. | -| flush_sessions | Может сбрасывать сеансы по всему сайту. | -| frames | Чтобы использовать интерфейс диспетчера MODX на всех. | -| help | Для просмотра страницы справки. | -| home | Для просмотра страницы приветствия. | -| import_static | Для просмотра или использования страниц импорта. | -| languages | Редактировать или просматривать лексикон Языки. | -| lexicons | Для редактирования или просмотра лексиконов и [интернационализации](extending-modx/internationalization "интернационализация") . | -| list | Базовое разрешение «перечислить» любой объект. Список означает получить коллекцию объектов. | -| load | Базовое разрешение «загрузить» любой объект или иметь возможность вернуть его как экземпляр вообще. | -| logout | Чтобы можно было выйти из системы как пользователь. | -| logs | Для просмотра журналов, таких как ошибки и журналы менеджера. | -| menus | Для редактирования или сохранения любых топовых пунктов меню. | -| messages | Для отправки или просмотра любых личных сообщений. | -| namespaces | Для редактирования или просмотра [пространств имен](extending-modx/namespaces "Пространства имен") . | -| new_category | Создать новую категорию. | -| new_chunk | Создать новый [чанк](building-sites/elements/chunks "Куски") . | -| new_context | Создать новый [контекст](building-sites/contexts "Контексты") . | -| new_document | Для создания новых [ресурсов](building-sites/resources "Ресурсы") . | -| new_document_in_root | Создавать [ресурс](building-sites/resources "Ресурсы") в корне сайта. Заменяет удалённую настройку `udperms_allowroot`. | -| new_plugin | Создать новый [плагин](extending-modx/plugins "Плагины") . | -| new_role | Создать новую [роль](building-sites/client-proofing/security/roles "Роли") . | -| new_snippet | Создать новый [сниппет](extending-modx/snippets "обрывки") . | -| new_template | Создать новый [шаблон](building-sites/elements/templates "Шаблоны") . | -| new_tv | Создать новую [переменную шаблона](building-sites/elements/template-variables "Переменные шаблона") . | -| new_user | Создать нового [пользователя](building-sites/client-proofing/security/users "пользователей") . | -| packages | Использовать любые транспортные пакеты в системе [управления](extending-modx/transport-packages "Управление пакетами") пакетами. | -| property_sets | Для просмотра и редактирования [свойств и наборов свойств](building-sites/properties-and-property-sets "Свойства и наборы свойств") . | -| провайдеры | Для просмотра и редактирования [провайдеров](building-sites/extras/providers "Провайдеры") по всему сайту. | -| publish_document | Опубликовать или отменить публикацию любого ресурса. В UI менеджера проверка идёт на контексте **`mgr`** через `hasPermission('publish_document')`. Выдача только на другом контексте кнопки публикации не откроет. См. [ACL](building-sites/client-proofing/security/policies/acls#publikaciya-v-menedzhere-i-neskolko-grupp). | -| purge_deleted | Чтобы очистить корзину. | -| remove | Основное разрешение на удаление любого объекта. | -| remove_locks | Удалить все существующие блокировки по всему сайту. | -| resource_tree | Для просмотра дерева ресурсов в левой навигационной панели. | -| save | Базовое разрешение на сохранение любого объекта. | -| save_category | Чтобы сохранить любые категории. | -| save_chunk | Чтобы сохранить любые [куски](building-sites/elements/chunks "Куски") . | -| save_context | Сохранить любой [контекст](building-sites/contexts "Контексты") . | -| save_document | Чтобы сохранить любые [ресурсы](building-sites/resources "Ресурсы") . | -| save_plugin | Чтобы сохранить любые [плагины](extending-modx/plugins "Плагины") . | -| save_role | Чтобы сохранить любые [роли](building-sites/client-proofing/security/roles "Роли") . | -| save_snippet | Чтобы сохранить любые [сниппеты](extending-modx/snippets "обрывки") . | -| save_template | Сохранить любые [шаблоны](building-sites/elements/templates "Шаблоны") . | -| save_tv | Сохранить любые [переменные шаблона](building-sites/elements/template-variables "Переменные шаблона") . | -| save_user | Сохранить любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | -| search | Чтобы использовать страницу поиска. | -| settings | Для просмотра и редактирования любых настроек системы. | -| steal_locks | Чтобы «украсть» блокировки, переопределяя текущую блокировку документа. | -| unlock_element_properties | Чтобы иметь возможность редактировать свойства по умолчанию для любого элемента. | -| view | Базовое разрешение на «просмотр» любого объекта. | -| view_category | Для просмотра любых категорий. | -| view_chunk | Для просмотра любых [чанков](building-sites/elements/chunks "Куски") . | -| view_context | Для просмотра любых [контекстов](building-sites/contexts "Контексты") . | -| view_document | Для просмотра любых [ресурсов](building-sites/resources "Ресурсы") . | -| view_eventlog | Для просмотра журнала событий. | -| view_offline | -| view_plugin | Для просмотра любых [плагинов](extending-modx/plugins "Плагины") . | -| view_role | Для просмотра любых [ролей](building-sites/client-proofing/security/roles "Роли") . | -| view_snippet | Для просмотра любых [сниппетов](extending-modx/snippets "обрывки") . | -| view_template | Для просмотра любых [шаблонов](building-sites/elements/templates "Шаблоны") . | -| view_tv | Для просмотра любых [переменных шаблона](building-sites/elements/template-variables "Переменные шаблона") . | -| view_unpublished | Для просмотра любых неопубликованных [ресурсов](building-sites/resources "Ресурсы") . | -| view_user | Для просмотра любой [пользователь](building-sites/client-proofing/security/users "пользователей") . | -| workspaces | Использовать [управление пакетами](extending-modx/transport-packages "Управление пакетами") . | +| название | Описание доступа | +| --- | --- | +| about | О странице. | +| access_permissions | Любые связанные с разрешением доступа страницы и действия. | +| actions | Страница [действий](extending-modx/menus/actions "Действия и меню") . | +| change_password | Пользователь может изменить свой пароль пользователя. | +| change_profile | Пользователь может изменить свой профиль. | +| charsets | Видеть список кодировок. | +| class_map | Видеть список классов в карте классов. | +| components | Видеть меню «Пакеты». | +| content_types | Страница «Типы содержимого». | +| countries | Смотреть список стран. | +| create | Базовый «создать» доступ к объектам. | +| credits | Просмотрите страницу «Кредиты». | +| customize_forms | Просмотр и управление [настройкой](building-sites/client-proofing/form-customization "Настройка менеджера") страницы [менеджера](building-sites/client-proofing/form-customization "Настройка менеджера") . | +| dashboards | Просмотр и управление панелями. Пункт в верхнем меню — «Панели управления». | +| database | Страница Информация о системе | +| database_truncate | Возможность усекать таблицу базы данных. | +| delete_category | Удалить или удалить любые Категории. | +| delete_chunk | Удалить или удалить любые [чанки](building-sites/elements/chunks "Куски") . | +| delete_context | Удалить или удалить любые [контексты](building-sites/contexts "Контексты") . | +| delete_document | Удалить или удалить любые [Ресурсы](building-sites/resources "Ресурсы") . | +| delete_eventlog | Очистить журнал событий. | +| delete_plugin | Удалить или удалить любые [плагины](extending-modx/plugins "Плагины") . | +| delete_propertyset | Отключать и удалять наборы параметров. | +| delete_role | Удалить или удалить любые [роли](building-sites/client-proofing/security/roles "Роли") . | +| delete_snippet | Удалить или удалить любые [сниппеты](extending-modx/snippets "обрывки") . | +| delete_static_resource | Для удаления или отключения статического ресурса требуется разрешение "delete_document". | +| delete_symlink | Для удаления или отключения символической ссылки требуется разрешение "delete_document". | +| delete_template | Удалить или удалить любые [шаблоны](building-sites/elements/templates "Шаблоны") . | +| delete_tv | Удалить или удалить любые [переменные шаблона](building-sites/elements/template-variables "Переменные шаблона") . | +| delete_user | Удалить или удалить любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | +| delete_weblink | Для удаления или отключения ссылки требуется разрешение "delete_document". | +| directory_chmod | Изменять права доступа (chmod) к каталогам. | +| directory_create | Создавать каталоги в файловой системе. | +| directory_list | Видеть список подкаталогов для каталога в файловой системе. | +| directory_remove | Удалять папки в файловой системе. | +| directory_update | Переименовывать каталоги в файловой системе. | +| edit_category | Для редактирования любых категорий. | +| edit_chunk | Для редактирования любых [чанков](building-sites/elements/chunks "Куски") . | +| edit_context | Для редактирования любых [контекстов](building-sites/contexts "Контексты") . | +| edit_document | Для редактирования любых [ресурсов](building-sites/resources "Ресурсы") . | +| edit_locked | Позволяет пользователю отменять блокировку и редактировать заблокированный ресурс. | +| edit_plugin | Для редактирования любых [плагинов](extending-modx/plugins "Плагины") . | +| edit_propertyset | Редактировать наборы параметров. | +| edit_role | Редактировать любые [роли](building-sites/client-proofing/security/roles "Роли") . | +| edit_snippet | Для редактирования любых [сниппетов](extending-modx/snippets "обрывки") . | +| edit_static_resource | Для редактирования статических ресурсов требуется разрешение "edit_document". | +| edit_symlink | Для редактирования символических ссылок требуется разрешение "edit_document". | +| edit_template | Для редактирования любых [шаблонов](building-sites/elements/templates "Шаблоны") . | +| edit_tv | Для редактирования любых [переменных шаблона](building-sites/elements/template-variables "Переменные шаблона") . | +| edit_user | Для редактирования любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | +| edit_weblink | Для редактирования ссылок требуется разрешение "edit_document". | +| element_tree | Возможность просмотра дерева элементов на левой панели. | +| empty_cache | Очистить кеш сайта. | +| error_log_erase | Очищать журнал ошибок. | +| error_log_view | Просматривать журнал ошибок. | +| events | Видеть Системные события. | +| export_static | Для экспорта сайта в статический HTML. | +| file_create | Создавать файлы. | +| file_list | Видеть список файлов в папках. | +| file_manager | Использовать файловый менеджер, в том числе создание / удаление файлов. | +| file_remove | Удалять файлы в файловой системе. | +| file_tree | Для просмотра дерева файлов на левой панели. | +| file_unpack | Распаковать zip-архивы. | +| file_update | Редактирование содержимого физических файлов. ВНИМАНИЕ: дает возможность выполнить произвольный код на сервере. | +| file_upload | Загружать файлы в папку. | +| file_view | Просматривать содержимое файла. | +| flush_sessions | Может сбрасывать сеансы по всему сайту. | +| frames | Чтобы использовать интерфейс диспетчера MODX на всех. | +| help | Для просмотра страницы справки. | +| home | Для просмотра страницы приветствия. | +| language | Переключать текущий язык в панели управления. | +| languages | Редактировать или просматривать лексикон Языки. | +| lexicons | Для редактирования или просмотра лексиконов и [интернационализации](extending-modx/internationalization "интернационализация") . | +| list | Базовое разрешение «перечислить» любой объект. Список означает получить коллекцию объектов. | +| load | Базовое разрешение «загрузить» любой объект или иметь возможность вернуть его как экземпляр вообще. | +| logout | Чтобы можно было выйти из системы как пользователь. | +| menu_reports | Показывать в главном меню пункт «Отчёты». | +| menu_security | Показывать в главном меню пункт «Безопасность», не используется. | +| menu_site | Показывать в главном меню пункт «Содержимое». | +| menu_support | Показывать в главном меню пункт «Поддержка», не используется. | +| menu_system | Показывать в главном меню пункт «Система», не используется. | +| menu_tools | Показывать в главном меню пункт «Управление». | +| menu_trash | Показывать в главном меню пункт «Корзина». | +| menu_user | Показывать в главном меню пункт «Пользователь». | +| menus | Для редактирования или сохранения любых топовых пунктов меню. | +| messages | Для отправки или просмотра любых личных сообщений. | +| mgr_log_erase | Очищать журнал системы управления. | +| mgr_log_view | Видеть журнал системы управления. | +| namespaces | Для редактирования или просмотра [пространств имен](extending-modx/namespaces "Пространства имен") . | +| new_category | Создать новую категорию. | +| new_chunk | Создать новый [чанк](building-sites/elements/chunks "Куски") . | +| new_context | Создать новый [контекст](building-sites/contexts "Контексты") . | +| new_document | Для создания новых [ресурсов](building-sites/resources "Ресурсы") . | +| new_document_in_root | Создавать [ресурс](building-sites/resources "Ресурсы") в корне сайта. Заменяет удалённую настройку `udperms_allowroot`. | +| new_plugin | Создать новый [плагин](extending-modx/plugins "Плагины") . | +| new_propertyset | Создавать наборы параметров. | +| new_role | Создать новую [роль](building-sites/client-proofing/security/roles "Роли") . | +| new_snippet | Создать новый [сниппет](extending-modx/snippets "обрывки") . | +| new_static_resource | Создавать статичные ресурсы. | +| new_symlink | Создавать символические ссылки. | +| new_template | Создать новый [шаблон](building-sites/elements/templates "Шаблоны") . | +| new_tv | Создать новую [переменную шаблона](building-sites/elements/template-variables "Переменные шаблона") . | +| new_user | Создать нового [пользователя](building-sites/client-proofing/security/users "пользователей") . | +| new_weblink | Создавать новые веб-ссылки. | +| packages | Использовать любые транспортные пакеты в системе [управления](extending-modx/transport-packages "Управление пакетами") пакетами. | +| policy_delete | Удалять политики доступа. | +| policy_edit | Редактирование политик доступа. ВНИМАНИЕ: в сочетании с разрешением policy_save, предоставляет возможность повышения привилегий, включая права, связанные с безопасностью. | +| policy_new | Создавать новые политики доступа. | +| policy_save | Сохранять политики доступа. | +| policy_template_delete | Удалять шаблоны политик доступа. | +| policy_template_edit | Редактировать шаблоны политик доступа. | +| policy_template_new | Создавать шаблоны политик доступа. | +| policy_template_save | Сохранять шаблоны политик доступа. | +| policy_template_view | Просматривать шаблоны политик доступа. | +| policy_view | Просматривать политики доступа. | +| property_sets | Для просмотра и редактирования [свойств и наборов свойств](building-sites/properties-and-property-sets "Свойства и наборы свойств") . | +| providers | Смотреть и изменять поставщиков пакетов. | +| publish_document | Опубликовать или отменить публикацию любого ресурса. В UI менеджера проверка идёт на контексте **`mgr`** через `hasPermission('publish_document')`. Выдача только на другом контексте кнопки публикации не откроет. См. [ACL](building-sites/client-proofing/security/policies/acls#публикация-в-менеджере-и-несколько-групп). | +| purge_deleted | Чтобы очистить корзину. | +| remove | Основное разрешение на удаление любого объекта. | +| remove_locks | Удалить все существующие блокировки по всему сайту. | +| resource_duplicate | Создавать копию Ресурса. | +| resource_quick_create | Использовать «Быстро создать Ресурс» в дереве ресурсов слева. | +| resource_quick_update | Использовать «Быстро редактировать ресурс» в контекстном меню. | +| resource_tree | Для просмотра дерева ресурсов в левой навигационной панели. | +| resourcegroup_delete | Удалять Группы ресурсов. | +| resourcegroup_edit | Редактировать Группы ресурсов. | +| resourcegroup_new | Создавать новые Группы ресурсов. | +| resourcegroup_resource_edit | Редактировать Ресурсы в Группе ресурсов. | +| resourcegroup_resource_list | Просматривать Ресурсы в Группе ресурсов. | +| resourcegroup_save | Сохранять Группы ресурсов. | +| resourcegroup_view | Просматривать Группы ресурсов. | +| save | Базовое разрешение на сохранение любого объекта. | +| save_category | Чтобы сохранить любые категории. | +| save_chunk | Чтобы сохранить любые [куски](building-sites/elements/chunks "Куски") . | +| save_context | Сохранить любой [контекст](building-sites/contexts "Контексты") . | +| save_document | Чтобы сохранить любые [ресурсы](building-sites/resources "Ресурсы") . | +| save_plugin | Чтобы сохранить любые [плагины](extending-modx/plugins "Плагины") . | +| save_propertyset | Сохранять Наборы параметров. | +| save_role | Чтобы сохранить любые [роли](building-sites/client-proofing/security/roles "Роли") . | +| save_snippet | Чтобы сохранить любые [сниппеты](extending-modx/snippets "обрывки") . | +| save_template | Сохранить любые [шаблоны](building-sites/elements/templates "Шаблоны") . | +| save_tv | Сохранить любые [переменные шаблона](building-sites/elements/template-variables "Переменные шаблона") . | +| save_user | Сохранить любого [пользователя](building-sites/client-proofing/security/users "пользователей") . | +| search | Чтобы использовать страницу поиска. | +| set_sudo | Сделать любого пользователя Суперпользователем. | +| settings | Для просмотра и редактирования любых настроек системы. | +| source_delete | Удалять Источник файлов. | +| source_edit | Редактировать Источник файлов. | +| source_save | Создавать и сохранять Источник файлов. | +| source_view | Видеть Источник файлов. | +| sources | Управлять Источниками файлов и Типами источников файлов. | +| steal_locks | Чтобы «украсть» блокировки, переопределяя текущую блокировку документа. | +| tree_show_element_ids | Показывать ID в Дереве элементов. | +| tree_show_resource_ids | Показывать ID в Дереве ресурсов. | +| undelete_document | Возможность отменять удаление Ресурсов. | +| unlock_element_properties | Чтобы иметь возможность редактировать свойства по умолчанию для любого элемента. | +| unpublish_document | Отменять публикацию ресурсов. | +| usergroup_delete | Удалять Группы пользователей. | +| usergroup_edit | Редактирование групп пользователей. ВНИМАНИЕ: раскрывает настройки UserGroup, которые могут переопределить параметры системы, связанные с безопасностью, такие как загружаемые типы файлов и учетные данные API. | +| usergroup_new | Создавать новые Группы пользователей. | +| usergroup_save | Сохранять Группы пользователей. | +| usergroup_user_edit | Редактировать Пользователей в Группе пользователей. | +| usergroup_user_list | Видеть список Пользователей в Группе пользователей. | +| usergroup_view | Просматривать Группы пользователей. | +| view | Базовое разрешение на «просмотр» любого объекта. | +| view_category | Для просмотра любых категорий. | +| view_chunk | Для просмотра любых [чанков](building-sites/elements/chunks "Куски") . | +| view_context | Для просмотра любых [контекстов](building-sites/contexts "Контексты") . | +| view_document | Для просмотра любых [ресурсов](building-sites/resources "Ресурсы") . | +| view_element | Получать список Элементов или Классов элементов. | +| view_eventlog | Для просмотра журнала событий. | +| view_offline | Просматривать сайт, если он находится режиме офлайна. | +| view_plugin | Для просмотра любых [плагинов](extending-modx/plugins "Плагины") . | +| view_propertyset | Просматривать Наборы параметров. | +| view_role | Для просмотра любых [ролей](building-sites/client-proofing/security/roles "Роли") . | +| view_snippet | Для просмотра любых [сниппетов](extending-modx/snippets "обрывки") . | +| view_sysinfo | Просматривать страницу информации о системе. | +| view_template | Для просмотра любых [шаблонов](building-sites/elements/templates "Шаблоны") . | +| view_tv | Для просмотра любых [переменных шаблона](building-sites/elements/template-variables "Переменные шаблона") . | +| view_unpublished | Для просмотра любых неопубликованных [ресурсов](building-sites/resources "Ресурсы") . | +| view_user | Для просмотра любой [пользователь](building-sites/client-proofing/security/users "пользователей") . | +| workspaces | Использовать [управление пакетами](extending-modx/transport-packages "Управление пакетами") . | ## Пользовательские разрешения Если вы создали свои собственные действия и пункты меню [страницу настраиваемого менеджера](extending-modx/custom-manager-pages "Пользовательский менеджер страниц Учебникl"), то вы можете определить настраиваемые элементы разрешений при создании элемента меню (Система -> Действия -> Создать меню), который соответствует разрешения перечислены здесь. -![](/2.x/en/building-sites/client-proofing/security/policies/permissions/modx+custom+permission.jpg) +![](modx+custom+permission.jpg) ## Смотрите также 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) +2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) \ No newline at end of file diff --git a/ru/building-sites/client-proofing/security/policies/permissions/index.md b/ru/building-sites/client-proofing/security/policies/permissions/index.md index 91bdaebd0..86354b60b 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/index.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/index.md @@ -1,6 +1,7 @@ --- title: "Разрешения" translation: "building-sites/client-proofing/security/policies/permissions" +description: "Разрешения MODX: что такое одно разрешение и как политики группируют их." --- ## Что такое Разрешения? @@ -39,7 +40,7 @@ translation: "building-sites/client-proofing/security/policies/permissions" 4. [Ограничение Элементов от пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) 7. [Закалка MODX Revolution](getting-started/maintenance/securing-modx) -8. [Стандарты безопасности](administering-your-site/security/security-standards) +8. [Стандарты безопасности](building-sites/client-proofing/security) 9. [Поиск проблем в безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Сбрость пароля пользователя в ручную](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/permissions/modx+custom+permission.jpg b/ru/building-sites/client-proofing/security/policies/permissions/modx+custom+permission.jpg new file mode 100644 index 0000000000000000000000000000000000000000..507f39fd4a61f383f5936c7bebd0c505ef6833b8 GIT binary patch literal 25206 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md b/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md index 433725a14..fd04f3eac 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md @@ -1,6 +1,7 @@ --- title: "Ресурсная политика" translation: "building-sites/client-proofing/security/policies/permissions/resource-policy" +description: "Ресурсная политика MODX и список её разрешений." --- ## Ресурсная политика @@ -12,6 +13,7 @@ translation: "building-sites/client-proofing/security/policies/permissions/resou | Имя | |------| | add\_children | +| copy | | create | | delete | | list | diff --git a/ru/building-sites/client-proofing/security/policies/policy1-perm.png b/ru/building-sites/client-proofing/security/policies/policy1-perm.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a669f66e641dde608ef4d541a81d433e155a26 GIT binary patch literal 13444 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 Resource Groups. Слева увидите список групп ресурсов, справа дерево ресурсов. +Откройте иконка замка в меню пользователя → **Resource Groups**. Слева увидите список групп ресурсов, справа дерево ресурсов. Перетащите ресурсы из правого дерева прямо в группы ресурсов в левом: diff --git a/ru/building-sites/client-proofing/security/resource_groups_edit.jpg b/ru/building-sites/client-proofing/security/resource_groups_edit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d180414a92721d9e999deb1c3f162ebc9a11b76 GIT binary patch literal 26116 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 z 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 Q6%-&Xp&(u%Y8deU0HQM4z5oCK literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/security-tutorials/access+controls.png b/ru/building-sites/client-proofing/security/security-tutorials/access+controls.png new file mode 100644 index 0000000000000000000000000000000000000000..f232d3bcc94122d4f00629da0c85eb3fac59802f GIT binary patch literal 15834 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 literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/security-tutorials/context-access.png b/ru/building-sites/client-proofing/security/security-tutorials/context-access.png new file mode 100644 index 0000000000000000000000000000000000000000..6223371427db4f45e508827697dc9ecd7b7b61f6 GIT binary patch literal 56948 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

7&*B1 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 literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/security-tutorials/create-resource-group.png b/ru/building-sites/client-proofing/security/security-tutorials/create-resource-group.png new file mode 100644 index 0000000000000000000000000000000000000000..c51fa072bb9dfc3b6a1f5369c4a08fd89d8069c0 GIT binary patch literal 64583 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 Users -> New User (кнопка) +1. Создайте нового пользователя: иконка замка в меню пользователя → **Users** -> New User (кнопка) 2. Задайте уникальные username, password и email. -3. Перед сохранением откройте вкладку **Access Permissions** и нажмите **Add User Group to User** +3. Перед сохранением откройте вкладку **Access Permissions** и нажмите ****Add User to Group**** 1. **User Group:**`Administrator` 2. **Role:**`Super User` -4. Сохраните пользователя. (Позже можно вернуться в Security -> Manage Users и правым кликом обновить свойства.) +4. Сохраните пользователя. (Позже можно вернуться в иконка замка в меню пользователя → **Users** и правым кликом обновить свойства.) 5. Проверьте вход в менеджер из другого браузера. ## Почему нельзя добавить ещё одного Administrator с другой [ролью](building-sites/client-proofing/security/roles "Roles"), например "Member"? -Попробуйте. При входе под другим именем только с ролью "Member" доступ отклонят. Почему? Дело в [Context Access](building-sites/contexts "Contexts") и [Access Policies](building-sites/client-proofing/security/policies "Policies"). Они быстро усложняются. Откройте Security -> Access Controls, правым кликом по группе Administrator выберите Update User Group, затем вкладку **Context Access**. Увидите примерно такое: +Попробуйте. При входе под другим именем только с ролью "Member" доступ отклонят. Почему? Дело в [Context Access](building-sites/contexts "Contexts") и [Access Policies](building-sites/client-proofing/security/policies "Policies"). Они быстро усложняются. Откройте иконка замка в меню пользователя → **Access Control Lists**, правым кликом по группе Administrator выберите Update User Group, затем вкладку **Context Access**. Увидите примерно такое: ![](user-group-perms.jpg) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index 4f30b4afb..67742ad33 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -1,6 +1,7 @@ --- title: "Доступ пользователя к Менеджеру" translation: "building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access" +description: "Дать пользователю MODX права менеджера: группа, роли и политика, которые это делают." --- ## Задача diff --git a/ru/building-sites/client-proofing/security/security-tutorials/index.md b/ru/building-sites/client-proofing/security/security-tutorials/index.md index f12189eac..373cd490e 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/index.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/index.md @@ -1,6 +1,7 @@ --- title: "Учебники по безопасности" translation: "building-sites/client-proofing/security/security-tutorials" +description: "Учебники раздела безопасности MODX: страницы только для участников, менеджеры, анонимный пользователь и доступ к элементам." --- ## Учебники по безопасности diff --git a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index ecd118e62..aa5eb9ca8 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -1,6 +1,7 @@ --- title: "Страницы только для участников" translation: "building-sites/client-proofing/security/security-tutorials/making-member-only-pages" +description: "Защитить страницы сайта на MODX так, чтобы их видели только участники группы." --- ## Введение @@ -11,20 +12,20 @@ translation: "building-sites/client-proofing/security/security-tutorials/making- Если вы уже ориентируетесь, ниже краткий список. Он проведёт по схеме или напомнит порядок. Если нужны подробности и примеры, прокрутите к соответствующим подразделам. -1. Создайте Resource Group (Security -> Resource Groups -> Create Resource Group) +1. Создайте Resource Group (иконка замка в меню пользователя → **Resource Groups** -> Create Resource Group) 2. Привяжите ресурс «только для участников» к Resource Group. (Через редактирование ресурса или перетаскиванием из дерева ресурсов вправо) -3. Создайте User Group (Security -> Access Controls -> User Groups -> New User Group) +3. Создайте User Group (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> New User Group) 4. На вкладке Resource Group Access добавьте запись (context: web, minimum role: Member (9999), access policy: Resource) -5. Добавьте пользователей в группу с ролью Member. (Security -> Manage Users) -6. Сбросьте права (Security -> Flush Permissions) и проверьте в другом браузере (не просто в другом окне: в другом браузере) +5. Добавьте пользователей в группу с ролью Member. (иконка замка в меню пользователя → **Users**) +6. Сбросьте права (**Flush Your Permissions**) и проверьте в другом браузере (не просто в другом окне: в другом браузере) -## Access Wizard (2.2.2 и новее) +## Access Wizard В MODX 2.2.2 есть access wizard, который упрощает процесс. Пошаговое объяснение по-прежнему верно, но wizard сокращает шаги. Имеет смысл прочитать оба варианта, чтобы лучше понять, как части системы безопасности MODX связаны. ### 1. Создайте Resource Group -Откройте Security -> Resource Groups и нажмите Create Resource Group. Появится окно примерно такое: ![](create-resource-group.png) +Откройте иконка замка в меню пользователя → **Resource Groups** и нажмите Create Resource Group. Появится окно примерно такое: ![](create-resource-group.png) Разберём секции: @@ -41,11 +42,11 @@ translation: "building-sites/client-proofing/security/security-tutorials/making- ### 2. Добавьте ресурсы в Resource Group -Укажите MODX, какие ресурсы защищать. Оставайтесь на странице из шага 1 (Security > Resource Groups). Справа откройте контекст web, чтобы видеть страницы сайта. Перетащите их из правой колонки в группу ресурсов. Либо откройте каждый ресурс, вкладку Resource Groups и отметьте **Access** в строке "Protected". +Укажите MODX, какие ресурсы защищать. Оставайтесь на странице из шага 1 (иконка замка в меню пользователя → **Resource Groups**). Справа откройте контекст web, чтобы видеть страницы сайта. Перетащите их из правой колонки в группу ресурсов. Либо откройте каждый ресурс, вкладку Resource Groups и отметьте **Access** в строке "Protected". ### 3. Добавьте пользователей в User Group -Со страницей Resource Group закончили. Откройте Security > Access Controls. На вкладке Users Groups виден список групп. Правым кликом по группе "Protected" выберите "Add User to Group". В "Name" выберите пользователя. В Role пока поставьте "Member". Роли задают, что пользователь может внутри группы, но для урока такая тонкость не нужна. Нажмите Save. +Со страницей Resource Group закончили. Откройте иконка замка в меню пользователя → **Access Control Lists**. На вкладке Users Groups виден список групп. Правым кликом по группе "Protected" выберите "Add User to Group". В "Name" выберите пользователя. В Role пока поставьте "Member". Роли задают, что пользователь может внутри группы, но для урока такая тонкость не нужна. Нажмите Save. Важно: как только вы защитили ресурс, (1) назначив его в одну или несколько групп ресурсов и (2) связав группу ресурсов с группой пользователей через access control, эти страницы перестанут показываться пользователям вне связи с группой ресурсов. Поведение по умолчанию: страница 404. Если нужен ответ 401, группе anonymous нужно разрешение "load" на группу ресурсов. Подробнее в другом уроке. Сейчас ваша страница ещё не видна: вы ещё не добавили её в группу пользователей. @@ -53,7 +54,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/making- ### 4. Добавьте Context Access группе пользователей -Откройте Security > Access Controls. Правым кликом по защищённой группе выберите "Update user group". Вкладка Context Access. Нажмите "Add Context". Появится диалог как ниже. Разберём: ![](context-access.png) +Откройте иконка замка в меню пользователя → **Access Control Lists**. Правым кликом по защищённой группе выберите "Update user group". Вкладка Context Access. Нажмите "Add Context". Появится диалог как ниже. Разберём: ![](context-access.png) | Section | Explanation | Tutorial Default | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | @@ -61,63 +62,16 @@ translation: "building-sites/client-proofing/security/security-tutorials/making- | Minimum Role | К каким ролям применяется правило. Если ко всем в группе, выберите "Member - 9999". Здесь как раз та тонкая настройка, о которой речь выше. | Member - 9999 | | Access Policy | Какие разрешения получают пользователи. Разные политики дают группам разные возможности. | Administrator | -Сделайте одно правило: "web", "Member - 9999" и "Load, List and View". Если нужен вход в менеджер MODX, добавьте второе правило для mgr: "mgr", "Member - 9999" и "Administrator". Тогда у всех этих пользователей будет admin-доступ. Чтобы сузить права, вместо этого выберите "Content Editor" или "Developer". Либо создайте свою политику в Security > Access Policies, если нужно точно задать, что можно и чего нельзя. +Сделайте одно правило: "web", "Member - 9999" и "Load, List and View". Если нужен вход в менеджер MODX, добавьте второе правило для mgr: "mgr", "Member - 9999" и "Administrator". Тогда у всех этих пользователей будет admin-доступ. Чтобы сузить права, вместо этого выберите "Content Editor" или "Developer". Либо создайте свою политику в иконка замка в меню пользователя → **Access Control Lists** → вкладка **Policies**, если нужно точно задать, что можно и чего нельзя. Пользователи в группе, ресурсы в группе ресурсов, группа видит контекст. Почти готово. ### 5. Flush Permissions -Чтобы увидеть изменения, сбросьте, что видят и делают отдельные пользователи. Откройте Security > Flush Permissions. На front-end проверяйте в другом браузере. Около 90% проблем идут от проверки не в другом браузере или от пропуска flush. Не ленитесь открыть второй браузер. Готово: страницы только для участников настроены. +Чтобы увидеть изменения, сбросьте, что видят и делают отдельные пользователи. Откройте **Flush Your Permissions**. На front-end проверяйте в другом браузере. Около 90% проблем идут от проверки не в другом браузере или от пропуска flush. Не ленитесь открыть второй браузер. Готово: страницы только для участников настроены. Иногда нужно очистить кэш сайта, особенно для контекста mgr: элементы и ресурсы могут кэшировать права. -## Пошаговое объяснение (до 2.2.2) - -Если wizard вам меньше подходит или вы хотите понимать, что происходит при каждом праве и access entry, этот раздел полезен. С 2.2.2 в MODX есть Access Wizard, и с него можно начать. - -### 1. Создайте Resource Group - -[Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") это набор ресурсов, который вы связываете с группами пользователей и записями access list. Создав группу, вы легко относите страницы к видимости только для определённых групп или ролей внутри групп. - -Чтобы создать группу, откройте Security -> Resource Groups и нажмите Create Resource Group. В окне введите имя. В уроке ожидается имя "Protected". - -### 2. Привяжите ресурс «только для участников» к Resource Group - -Группа есть. Добавьте в неё ресурсы. Способов два. - -Первый: Security -> Resource Groups и перетащите ресурсы из правого дерева в левые группы ("Protected"). Второй: откройте ресурс и отметьте **Access** на вкладке Resource Groups. - -### 3. Создайте User Group - -Ресурсы в группе. Решите, кто их увидит. Для этого создайте новую группу пользователей. - -Откройте Security -> Access Controls. На вкладке User Groups (по умолчанию) нажмите New User Group. Задайте имя группы и отправьте форму. - -### 4. Добавьте доступ к Resource Group - -Перейдите на вкладку "Resource Group Access". Здесь задают, к каким группам ресурсов есть доступ у группы пользователей. Три из четырёх полей похожи на Context Access: Context, Minimum Role и Access Policy. Четвёртое: Resource Group. Как ясно из имени, это группа ресурсов, к которой есть доступ. - -Настройки: - -- Resource Group: как вы назвали, например "Protected" -- Context: web -- Minimum role: Member (9999) -- Access Policy: Resource - -Важно: как только вы защитили ресурс, (1) назначив его в одну или несколько групп ресурсов и (2) связав группу ресурсов с группой пользователей через access control, эти страницы перестанут показываться пользователям вне связи с группой ресурсов. Поведение по умолчанию: страница 404. Если нужен ответ 401, группе anonymous нужно разрешение "load" на группу ресурсов. Подробнее в другом уроке. Сейчас страница ещё не видна: вы ещё не добавили её в группу пользователей. - -### 5. Добавьте пользователей в группу - -Добавьте пользователей в группу: через редактирование пользователя или вернувшись на вкладку Users. Спросят User Group и Role. Мы исходили из роли Member с authority 9999, её и используйте. - -Если регистрация идёт через websignup snippet, убедитесь, что он сам кладёт пользователей в нужную группу. - -### 6. Flush permissions - -Когда настройки готовы, выполните flush permissions (Security -> Flush Permissions), иначе эффекта не будет. На front-end проверяйте целиком в другом браузере. Не другая вкладка и не другое окно: там всё ещё учтут вход в Manager. - -Иногда также нужно очистить кэш сайта, особенно для контекста mgr: элементы и ресурсы могут кэшировать права. - ## Всё ещё не работает? Пройдите шаги по порядку и убедитесь, что flush permissions выполнен. Если всё кажется верным, проверьте ещё раз и спросите на Forums. Если урок кажется неточным или вводящим в заблуждение, напишите в теме форума (ссылка ниже), что исправить. diff --git a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md index e73663e68..de1fe0c88 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md @@ -1,17 +1,21 @@ --- title: "Ещё про группу Anonymous" translation: "building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group" +description: "Кто такой анонимный пользователь в MODX и как дать посетителю доступ, отличный от обычного." --- ## Кто такой Anonymous? -Любой посетитель сайта без входа относится к [User Group](building-sites/client-proofing/security/user-groups "User Groups") Anonymous. +Любой посетитель сайта без входа — это анонимный пользователь. -Чтобы править группу, откройте верхнее меню **Security → Access Controls**, вкладка User Groups. Кликните правой кнопкой имя Anonymous и выберите **Update User Group**. ![](access+controls.png) +**Анонимный пользователь — не группа пользователей** +В базе нет группы «Anonymous». Анонимный пользователь — это список контроля доступа с principal `0`, а в дереве групп он показан псевдоузлом «(Anonymous)». Этот узел можно править так же, как любую группу, но меняете вы при этом доступ анонимного пользователя, а не группы. + +Чтобы его открыть, пройдите по пути **иконка замка в меню пользователя → Access Control Lists**, вкладка **User Groups & Users**. Кликните правой кнопкой по записи «(Anonymous)» и выберите **Update User Group**. ![](access+controls.png) ## Что может Anonymous? -По умолчанию Anonymous получает Load Only во всех [Context](building-sites/contexts "Contexts"), кроме `mgr`. Без Load Only запрос к Context вернёт 404 Page Not Found. +По умолчанию анонимный пользователь получает Load Only во всех [Context](building-sites/contexts "Contexts"), кроме `mgr`. Без Load Only запрос к Context вернёт 404 Page Not Found. ![](user+group_+anonymous.png) @@ -30,3 +34,24 @@ Load Only не означает, что ресурс можно View (см. ни Нажмите **Add Resource Group**, выберите защищённую Resource Group, Context (не `mgr`) и Access Policy Load Only. Сохраните. View по ресурсам в этой группе всё ещё закрыт. Доступен только Load и ответ 401. Кастомную Unauthorized-страницу задайте через [Unauthorized Page System Setting](building-sites/settings/unauthorized_page "unauthorized_page"). + +## Смотрите также + +1. [Пользователи](building-sites/client-proofing/security/users) +2. [Группы пользователей](building-sites/client-proofing/security/user-groups) +3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +4. [Роли](building-sites/client-proofing/security/roles) +5. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md index 3dd86feeb..412e80927 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md @@ -1,14 +1,13 @@ --- title: "Ограничение Element для пользователей" translation: "building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users" +description: "Скрыть элемент MODX от пользователей, которым нельзя его править, через доступ к его категории." --- -## Введение +## Кратко Урок показывает, как скрыть любой Element (Template, Snippet и т. д.) в менеджере MODX. Для этого используют Element Category ACL: они защищают Elements в Categories от просмотра. Пользователи группы Editors увидят элементы. Пользователи вне группы их не увидят. -### Кратко - 1. Создайте Category или возьмите существующую 2. Поместите Element, который нужно защитить, в эту Category 3. Создайте User Group или выберите существующую @@ -28,7 +27,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric ### 3. Создайте User Group -Откройте Security -> Access Controls в верхнем меню, вкладка "User Groups". Создайте новую группу или выберите существующую. Правым кликом по группе выберите "Update User Group". +Откройте иконка замка в меню пользователя → **Access Control Lists** в верхнем меню, вкладка "User Groups". Создайте новую группу или выберите существующую. Правым кликом по группе выберите "Update User Group". В Revolution 2.3.x пункт Access Control Lists лежит в меню Admin (значок шестерёнки). @@ -53,7 +52,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric ### 6. Flush Permissions -В верхнем меню: "Security -> Flush Permissions". В Revolution 2.3.x это Manage -> Logout All Users. +В верхнем меню: "**Flush Your Permissions**". В Revolution 2.3.x это иконка замка в меню пользователя → **Logout All Users**. Всех заставят войти снова. Element Category теперь защищена от пользователей вне группы Editors. @@ -61,7 +60,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric Иногда нужно скрыть элементы от всех, кто не в группе Administrator. Положите элементы в категорию как выше, но привяжите её к группе Administrator: -- Откройте редактирование группы Administrator (Security -> Access Controls -> User Groups -> правый клик по "Administrator" -> Update User Group). В Revolution 2.3.x это Access Control Lists в меню Admin (шестерёнка). +- Откройте редактирование группы Administrator (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> правый клик по "Administrator" -> Update User Group). В Revolution 2.3.x это Access Control Lists в меню Admin (шестерёнка). - Откройте вкладку Element Category Access - Добавьте ACL через "Add Category": - Category: ваша Category из шагов выше @@ -71,7 +70,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric - Нажмите "Save" в диалоге - Нажмите "Save" справа вверху -- В верхнем меню: Security -> Flush All Sessions. В Revolution 2.3.x это Manage -> Logout All Users. +- В верхнем меню: **Logout All Users**. В Revolution 2.3.x это иконка замка в меню пользователя → **Logout All Users**. Теперь Elements видит только admin Super User. @@ -79,7 +78,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric Допустим, вы ограничили Template способом выше. Другой User Group без доступа к Template всё же должна править (но не создавать) Resources с этим Template и видеть TV шаблона. Сейчас вторая группа (назовём её Editors) видит Resource, в combobox Template показывает ID, но TV не видит. Нужна ещё одна ACL для группы Editors, чтобы загружались Template и связанные TV. -- Откройте редактирование группы Editors (Security -> Access Controls -> User Groups -> правый клик по "Editors" -> Update User Group) +- Откройте редактирование группы Editors (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> правый клик по "Editors" -> Update User Group) - Откройте вкладку Element Category Access - Добавьте ACL через "Add Category": - Category: ваша Category из шагов выше @@ -89,7 +88,7 @@ translation: "building-sites/client-proofing/security/security-tutorials/restric - Нажмите "Save" в диалоге - Нажмите "Save" справа вверху -- Пользователи Editors должны выйти и войти снова, либо Security -> Flush Sessions в верхнем меню +- Пользователи Editors должны выйти и войти снова, либо **Logout All Users** в верхнем меню Готово. Editors увидят и будут править TV для Template в защищённой Category. Пользователи вне Editors их не увидят. diff --git a/ru/building-sites/client-proofing/security/security-tutorials/screen+shot+2012-10-19+at+11.43.46+pm.png b/ru/building-sites/client-proofing/security/security-tutorials/screen+shot+2012-10-19+at+11.43.46+pm.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2515deef3257d7ee9bf28050112af70b241101 GIT binary patch literal 55534 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

  • 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
    O>cI)B3WOEMJ2$?CMd@t5+En;Rd< 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 Dp#h&i literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/security-tutorials/user+group_+anonymous.png b/ru/building-sites/client-proofing/security/security-tutorials/user+group_+anonymous.png new file mode 100644 index 0000000000000000000000000000000000000000..7c88a74caf1dd0263a2e82dc20d1a766142ccf1e GIT binary patch literal 31097 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ⅈ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 OrlPExOp%mn;Qs;wWX|pY literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/security-tutorials/user-group-perms.jpg b/ru/building-sites/client-proofing/security/security-tutorials/user-group-perms.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ec378edb896bd49574a685eb9062ce88aba3443 GIT binary patch literal 62685 zcmdqJ1z23mvM@Th1qi|2li)hIyUXAn++Bi02*KUm2lwDX65QQ2xRYQZXx@~r7w&%OWq?)Q52^wg@Zs;;iC>h9IE;K%%r&w!^g64DX?C@3g^6yyT@SONqBprN21 zGc+Va5)2&7V}gf;g@HqWM?gS;hlfW%L_tD8L`H;%M?ytHMnQS<2DjMn&Gzf_D z$OrS24-N$p9uejLIQ{4ZU?4(;z;MGrQ2?MZpkOedeslv!08juZIEboHfZr256f7J9 zA`CPV@{dIT;;)MP>fdW0zoFpI=F$lc$uD!s`1PU&^^Ke~ZdO^|yQ=q}zaJB);`w5} z_^~kcsQ&v;CV19`*t63uZcQMYs58vmO%A^!N zPknb&w=MINu^0Nu$-IhRPlwx@4r`1~GlVtw`k8>@VvNnZhuf*eDLe5>;IO&pNDYbh z)fe-Puahgzm)7hvUI@B&kqJM!0bSZcjIBEjbJ~k2$rm3lDmfW?u5AETO{W#jNyPH3 zGhOl3%(BK8CRtS8*3WuSj*-3BH!GW_Tp6%lwtaSofz#=Nn)cBKC~3yk*Sg;*N6)ow z_l{Q_(&F21;y(faDlfj@2F!PGRYe@xFN%^hjc99%vkudrJn%XLQkW z4gjd2EAAjX1prLv{mm~e031mW<0Xp;VO3xwh#gl0pq9_e={s|v{h>gK0I(1;EwU<< zP;nl_YWP`wM+dZkYp}JrDySZ8{q@$n-T#;60R%0DgxHI;RhU{T8{Ex4d|e~K#RMu zyZNOHe8q@ygW_OSbY2~tK$vlTp1MGy4btV7;%dYxsJ8?Q^4RXwPIvCo@^6>T$zzcr#f?Clj2V z59OgfSy#zsd>?6=(PLwg4QIsaMS{K?@pUQFni9g^DY1d4h<$vyJ=X{}5ODh%i4mOG zzr{fa&1s*sn)NPoCvr)9Q*Y(y-nfDLiiIb0*taJO1|exTQZ_zKczv>Mea`o-)-DS# z0dD0+<2AkOWl`kGdb~eC>(k|ZlASEm$gL`%u<3p8s=MX}bCRR?-8ajNnzNdsiW36i zH|=em_xD?@FnHC~HQzhUnQGiP+tBxbSb-NAm+HaMFIDpgMebPm#6YSSVc zzou^#8i$x(<(pz&Z{6sI+lyxo0%sr2lf|8u86p61KLFBa;IXj-ITfTv7lpN5{`}}! zZ9h$bQGFaQkr zx@`L@@%sAm=6n6sWpmFw!1%elZe)*d&9_v0Ssgm%>NC#*0027Ccg>|~cHv0j(|Sc3 z0PsWr(oul>iibZ`2t83Gv6!G& zlmSAwUe%9qVjvgkoYg(nWL|LH!LslQ09Wb14Dw8=JzQ-QYE4ly_7VKCP zMK@Mj^;x-a0qcxkPXhojK^4mzf}G4 z86Eu`Wbx06I$kKt0<%dW4LQlS(GYzRP<@32oo-C5haaB#b?FU4=3u<(*$+6jz7Wlr zt6$QG+nIcXkUe=2>i9)Q;?boSc?6-8m4cP&Vq+WKzW)fIu?&t9EoWnst}2G`0i!=- zUNIF)bi^3G@CGhqLE3>je;4%mltfSicY)~LcHh$IVs96r`MPXtYm{N^BM*G_gJ1Sz zFYewV@U2%y?+$C289?~1?b{vQJ?xdvNSdyWe5ypYcuW!#Eq!{dXKXw<+ zyAID^c`=R|)d zNAu11k6dV?Z_~eyIZdbu0igY9wEeO2>WWn%^-x^~G3d+fsZX_teC@l4;rg;jbK+LvZn4><$VvJDew@)j%$)}`0&$)03zTu;IUP>*jLZ**cS0DDyJ_X zhVr)NQuvf2TH$;)?>z{KrF>kHB)5zA*`|+L{fP&-l=F!Dl@M@!c^=1E*hG`23f0Zv z56do$#t(qtmq#T%NT4md^pYWi`?vJFStum^Q@_rMo*Fco+I)sY4(SacF2Ov1c-LY& z)6!BuV1mz*d-!J9VFeNy5C;f8zkAdjDNb@nmu&$L(RcI%Bw{GdV|qLlHgKBSB2NIu zvi|B{%ht=BpN{dH6C1lm>8#nrpvdI%QKg)SZ-N6#@9k z_IupM0x zzX27KIDeV;G4qFrLCB=6#f#`uKJKW>PMbT)Bc_fTN+Lx`H(&V<7N^x-YHJt3?Z6AJ zv_MvcY&CwSkb!*G&%eOm5!JJ={(yjr9rT0j%?KfTFKC!Q?93oWgNA{HgGczeF@t^z zVZpGF6X}0sg>H~Z#SYsJQ;>n&z?n_A@?9muni;wAr;xBkQAn)jAQ&%%XxDm=_1W$0 z9xrA|au#)wdZ-&&f2}C~#9i0OdTpcsLBC;nc4Gfv^Y$au&=xdf{_A!G7&(~dEYBpq zcmvcYsLfu5PtMd}GDDic8j3P|kBJi+X4+?w^2<$OvWKP% zYUd|0OQ7tSCCBwIqkaZ}89Qx5Fae+o_FfRj0HAnm`D*}>Qd-P?pK0@jd*hb~=(ZyimKZRWC_yYhb0J@}hb1@8a zjn+0Y0N^zyE1_-ZNg>I~W1pvTmLo|tb z=Kot20DxWBt)C-fNd|y!F7C7Z8~PC-g$xb;g@*>kZj-$BOF}+c7!W zl5YSsZ-3NpFi`*i>NfzAn0SKHqqyBk&hX4(J?kWJTEgQ!0H(?=nQI*qols^q>`?nB z+>X1zsrI4m&ss{1PBQ?gg9{Ju&j8Oh5(6#()bnzfsVb^jAP^SRH-7pU2I#MoQvgtV z?XLhZga98#0d8jwSd|s;N6EaNn*;qY9fhsB9|3T^{_xFfW*6950`8CPLOI*OiH8b3 zl07D^NdKp)dpP31?jR)&0B*?pf}r=k5CHJZ9|`mZ>u*)C&9mo#P)O{c8f#kf{0;pG z2tq8&2{9fVG#oSx0u1bLzW>v*&)_jIv9O=w;IgujkyEk&IfN+Km6(M^UQtntiYx#2 zqymKq^8;W}(yuDxHCitlSCX)!=N7A~+gF&7aw&DT+`yjp_UUjK2wWEwYGtJ2^nPik z^viQA!%3>q;_(5-Y2Az=f%o-XM|FuUDq5;OASYRydao)~%_#HA>B2R0<)lp6J!&?c z;!~IHmJD7sJrHf9;p<%4yiYfVl zMYQzOn*-E@Sj$4wTdj7_b2_UU_!aoTO9XJP%`>afEgS1m=A$cS1I)br4Dgkx?<_J*{GOEnTTlI?uY|FvF-S> zWxoMI zLxcJ`ZGNFH0iC^c;53muj5!J86&e^ZLW;HvsicqxL%5U%^HopL`VPoR$FUU5x6Bdy zOwCX^EEcOevy;!LRF&o(f5YS;5`!Pb?l4CjDC(F!^5+%suwD?iHsFaG3E%tHShyx< zK5kK`QI2^KYfxVMH)OTJT5e)bTr^@`dKimReqo9uQU+^a%VNP`S7aNFz2tHKHWbDr zZJmVGYV4eX)t%?QQR z@-Yv}&lI$yFubT?V3Iyg^4ofvDQV?R#eDEJ-7b~p1gTQkK5D|64gqUI-tyuHfNFP` zb5|*yyqovywP1)eqh`ejOTh`@@Qd4^F&bD}rz}13km|K=G*BL;L9^VJNql!j{4TguA`hr|sVM z+5ZlJX9U_7QePiSVZS|Ra=(gpzY0t&z={}S9T25{lEA7oAkqcI{v2aLA0HPaga6Vb zCvaZR-1k8!u=ha6HqE%uTETWMc!W+G7KC(}Z&S*`Zsvp*BWogDa>GVaFjE00Lj#3$;eG%GW$ycUkw)OHuX<(hX& z#~{1SMOnL-<4K#sqER)9V!Ns~c@fDNR=W8XW<|?j^0#d6#oh5#{jr!fOP+CiH;x!Z zJq>m=G)7S%#OX0aOG~q@LH$W?royN9Z*!&`rU;DXEF)P8*?Uv|38dKPy*h)&v87K~ zm`T2gY*+Ja%uNfJmjNY?f?^85uCIxxbyJ7rz%ela2 zl4@Gn2X1+rtFJRTS3q+JSEt=y*7{MKY?@?j2lJMt<2-^9YejZxq(Go;aXaS18|f>< z8uwr=Rdv)N-q3A^sf1Q(@*c3P1hvNpR(i2RdxCkVmd4k(d3CqUlf!m9u6FdR_LzJb zmtOCt!V5P}F-t@9QfGEwNKEo}+xrskH>rmyVXNsBR=6Eha(IAUC9&cWv>c`-VLof6(r)0FWftJa;t>&IE4$T&SwP+`!lH0;qURSQO5 z$H|G9Rvai>y}6hJf|4?)4}uPI%M<>ka5?f@1V55S4S5`#(k(UleKh)JI5c6=7^N*N z?tcYDt8ticypL7mEa0mB6Bz<+OTtJ~t3DHMc+bYE`!8U7U85J#dX_Ah}{!sikLk5!LAPi*ZkVBmM)Cs*pfX8$iF|9@B|DPPPgC8(GE&CI)W z&-VjAohv3-Xjb<7o5E6g_N*g+q8N^R>{oT+fJ(zncc zgl8YpaF$fL!^t?7tTZTkyIcsnV=^KR^CTD}-bOaMS<4A5*-f8%YsTQk61NHsH{#6? z^-Q>5E2xwt_Rm;{Vb)8(r+tQ>heKn;i|TaP{Z*MwSgFRu1B2L2#F2`c`Z-3}W@%nS zqGDNJsX=Xegfg}>BIVQfG&V>3mwWY+@=s%xfa=R(1U+&bgEOGSP;!y?dTB>m*w|u* zix~rnxbu09q3KaWaJu%`A6=3x()B{+JG>N2*;GXmQCme(7nWQ&!#?xKvQJsZTJ7Zd zKahtKn7tj@K(rfOY9z!IPO_emcp0!sr}dhip@dIqr(P){IM|PI+2A$Hg5QbOaKG$P>P1^x$2^x$RBsdXsP`Hmg7iqMq6pzWQz@2rbucKc}ST3%+|N7M{+_VVyir4pYL1;VKc z1{XlgX`cysq70?uOOARnH4CS)WMZGkLVW{E$1A^;%0zj2oQ0lsE7@cPonBUQs@~;X zG~z0b7RkzDD_4EA!0r>cIvKY?q_P{dU7D59AsNaDD|IaUpcPHqLN{lApZe>2e%Oo+ zKcd%I@bXEoF-yv@`Ekv*hPda^MVtpayAA3MPf3J|mzZpkfEHOIZ{^u9yk( zJW;VXb#d2wF%x75?CGGGNuZ8Qa$anns5qrqP?*Hy6^e=#`3%A(^+;ck(F>9COaNMd zo2G_&pYNxH-lfI#yY`CFnA(8om(iGQzs$-i?>{CUrxGLy&mR?#jQ1{vPAz53| zY6DX|lSxG0yYHjMRa&gKL{r3AD5no3O^$8kEU@B2JTw?bnrWs_|7-Dj@`$ zkC&cOl}>Y0U{Y!Cmk22)CkJr5Qzi#ugNlmJHOLi+-f=l$t@o=0{}&)O2->@~6=UcV zQ7idxz5Rm;kWB@d_0O)no_MHDK-Mjm&RQ_%Pk+>9#6|h}RQ*Q)KBj1ys@Ltz-@$`=2i?4C`MZM~8OP9p0 zHWTi-o0@ZG6v99WpLMZL7@wD%CgvQJSXdNJ1GB;w1nSvvXia!AoL^!v=tgd98Jq?E zO}ydxcREyNXIj`PXBx)>sR$d3Qr(0+FAK-(5E?5Pk7wkK!VFA=r=SdRyo80$WKJ;& zbC-}4RU?sx>Tj({ssorxnI2JuE*X%CoIp0lU^T-PbtgwCEWM{i`i2l#qW^7nQ`D_$A zLF+B`49mT*qSwjnG7)IHu1|FP?N$gIUFv%G#}(<{_ZKv!+j85bw*+^@W*PR)p6)#S zO$)=#?=omSg$2cnFHmXN!3zpf6w9>Mqxe=tyEBPPyY;S6{n{CA+QDvyKQ&TtJ~%(g zcwRT8rmp?CdKtxXMi=LrYKPYrHzn-+T+ja4zdv^!{nkzJJ!${Xl_UBgYX0cP;lG*P z-eJToaV}h}|DKP6&8Pn3{O0qbWpbOQNLK#vtw09vznzIYv9=n_kl#KlIep>g!}ULv zjc%T3>jBY(_uoD&M<4Z_(dFHnc^dx!-5veQJ%vWj~E-ZQUv)hS^Ezere!-MRB@?ZrVj*Do=%|2Qm^(MYU;DSdhNH& zJ)UYTZQ9)}H%sY_p{w2Cq(qLwZRy|)jMA}8+K9tQW8Pe@&FUJucrfdb&Q6s68)6BC zyOoCuCvf*Zd5|d5f@uZ?sP6JP6fv^&3HSVRS&o_|1PXI8XQWKd?&>HeCM2E8vxRkuL58%S2x!Uc zO)S2f5t&!nwz8o%U@eH|O9pIc;5o!b#@+UlwoChDC)3$`ah(6J%PhP@bLs08A_$ z{x&qElKj7hrtw;_TP)yvluCyAxV&&L{}>P?a@X(5=po4B^mHxtAWwOl8(sEd5v+Hc zv?wbc@0SV*gf(5#Z(Dw5f-yJThip@%_r%rWC-_f-M9E|NO<4a52uPE;8wI5+?=0r< ztrbmK%VfM8vNDQ-m|~;wE^?&?y^@j%M_$7NHdwBpW5jo$aIYwdDwsMRH$!MmV8B9 zE37(c94oa}U_Z&ZPZS_Y5#uTr!&B>5GxGy*w>9glH+6Wn-|v9UzwHqgpIsbgEQMtG z^6UoyPUnWNvPtl`|6$mk{K9$Gyb$6cMqu8ELVmI_%$BaQ)iUhXm6i&E$h!27sB%S? z7CqtTtMsF0G1fS(o3GO~Yvx&SwzXP8hh?HtPR?=zqKq1c&n%~w*_#bAhQg_^?PQW{ z^48<8?5;hqxSJ3Yhk(I9yrq~vW zq&%{$j7iPoXp3d^FB+BTG3b8$>_`c^c&CG*0u4)g=lHyEyy`F=K{jgP+|qa`eC(1k`x$W!%JcrrTnX0# zGPiCzBx;;+0{qx&)mh}sI)or{ntV~Ph#Bj$Tef5&MWmb=yWdE~J&DFIPv!i(ry4L_ zwyaHTyMBUfTqVC5d!XmHzvpLpj18Qax_1Q(+9H$xOKw=E!i=IaNm73Itk=Ih z%kMDd2Vn2`^0!WSnoq20W&K2j&B%s^B~M3~()6!BI5|&&EZ@EGKrQkk?$KOGu`0a8 zVKw1rY`LCp7!SuAbU87L1LaeFKB7HSe#CB+3$a6kP-4E-rk5tZq&A3rfN8vx-R&XD4|a*=>YpWVIN6kzCxZt z#Z;)QL(6d&_YUXpbLDF4#cv%j+)*LV7Yin1Js^@T%@xs+&-II$!J$OsDkSL~*O!$- zDd=&vrRiOir5Q+~!7!FmnOMy0Hhfn%?CFJpM2+QmMAX)IscXuZ=4uMsR2cJ2b4FB< z;_*V(8}v;kP{x<$5mVy`q!p*2ZyZ>#n;`Ev%uT4XntDKi%vJ5bg{j;P@2|GRI2A25MpMus3ZLc%sakhCPdE!NE1jjPoSGUHX$II)9mEqR6|NR+&|n@Q%C2>) zKSb00TJUkF1fqXm@J-YB_X37YzkbK#wS5|hDMi)z{T3bp7jGN0uf`-kmQyBdsFERN zx@kO4{0Xn3;q^<8Efq?R%`!<8bjwC0X>uy5hx7{SZ_~jmVN-+BZ67}^Sp?HKX1dmY z=<1$vG(7NnMnyiiSR`o#$~ONl^Y`F4x-p;l@>|>l2s-?6{<@2}n!AKyPSS+3;*uen}>v#rt>^MTBx|0 zzi42!Qe^1PV-X@(hg5|-;aLYDA|GF?OFyVlj1BNEH)B^(!e{NgI zXFnm#x^5BH>aDUP<>*duS`VALTw0nImsCT0U5EM-GA}Z1pxMn2z=1*Mrn~@FV`Xc% zYil_tE@rz+W5QACX5^sl1S!Vw0=cyAfNtH6;rW+L<$}uEzWW}A@y*dfnP;n%ZW?U3 ze3ELqG?v2ab-Y!eWJ;t`NlM=MZ$E=bEvq8Ci!33IFVym-ql|>_dWvg7TT)r@*RlC< zF(axrvuyE^hxEsv5hU9re7oA4K+J5Cr&QvZhhN(25UPKY6j6lyCY;+1nQkA-1dk^8+4jzP8Y1CP|9^79r%g)eJ-*%{^%MXF z0}Ty}42KL4fQNy+K=b&H6UH-Ga!i)kiKi5-!pb1WxcFSdH+eO+SY(t!A}U6oI@g)m zlwRe3r4m(j3OIFs+a>nf`yNPwFb{j+VMB`2Wd3?~b@=tIIyagPuNIhunqEa|kObbb z!Uu}1xkU>LYq8#z*T`|la)@0a0d=lbpQ`&$-UIrxior#HTE}su_`USZ^Mvh+MI> z*#ujqp{$M0IqJ<9Mv3rLmL{Y3@D=igVV&{}j}d}gl=reEnKbuRBwRc`L=LEQU%4Pq zl0Hj%db5v1L3jz;rnh0Qv@4Vf1}=s?)G3Q&xy!uFi$-5bu@f+3;AX)8m zp&tN|k9SEL&=aQYPNt)n1c)gObvwlaVplv~9{4<>`*aBKXtm>-Rtnv{zzJq8;r`+s z<=Pfv>buLlP4xKbxomBy3IhL!;_)<05sUd2b)(RT`IM303xE7`2VgdchTS)8QxH+LRMw`-1DJT3PMWdfwQL z`Rpd(8=-^KG}ZGBl2L`&+@2a6f5)9HbCAgRR%-I>*2-xIu_xS* zV3*~hf*%F_f=8my=iYGQP}AHyHCg#8EX@ww!iz^x}?-9~&G^b(XkPX9ST19oukl5!rvPh_t^^{_zo zfT5_ti^d+p2szdLX8`Q8=tDfS30geV%uo#54()cY{72yX@0kA*0JR?rL>-)#*t(Yg z_w@f4-A}x-ym+kzoOlqA>bJHLCW^sv^n02U4od)i zq4bxUNlmLE>-lUGThs2zg42-cqWXH<0@g+~pSR*y z7cMR(vXoES3;8amKpw7^-&pyB-#%3R0E`82%6lDIyS($aQ6XX^V1+Za9jy|_q2&sV zmk@|(`2yscY(M-S_(tI!FQXSz)ZUOwR+vv>Slf3e!uXeT4_oP!`Ib*`G!ne9j=DGy z=5=>gKs8P7`Azke;7%%19al=|9GIqJAoX1!xDeTC+1J9BthbdWAy)+k6FI!tSF%h5T(-&D=GKNGPY=_myEbM^~5BivV|F#wyJ^I zJ1p2ZD3X*(XyX|Uso#^K3RK-c@7~qbpOhrK!ER>m zJNN;RdH-CiES2@C{iGFlW=X8Jj%@<_oPMHNwG%;ciAGxDZ$4zQvx7+d!Oq0~gqI^C9lA1EK0d(kp6SoG6sVfdRBv;B+Xg`&J>Kn5?Xrx8ig;OYFJa>mhB z<8rr`pCe~A7dd12k?{mKEZubP`AZg`*Ugp}Gaf4&Zao84I6D>ZDt{tx|F*m;eDPdl zQ)K*X`J-~@xTQ9y9zQ`mg)!rYaLAE~#tjz`IER)<#MBfZY^Sy_A9nP8c8505a1?<1 zrk7prUE%$6p&hrv-a}MvU2d9K-F1;0$1ocw=Cp}TP)*KL@w}u7j^~6`>_qwd%H6Xy zl{pr(iVBwH&;qi)gJh|$GprbHb{l86s!BX8GR%$SJL%X9rxn9$92~)uhmy1zq?dmA z0bKgy)_n+`Ho|$W+9uW&tj~cX4Ur^iWl)X?8X{46J&5@_lWCpw6Fb~xs{LE0){>FZ zH3F4rx%jaCktdAYE{90vk?$J(@zrmxr||YhUXt)&R^a05!h7T@p<{7Bm1{XjMf||& z=;2fPk{Az+rxSDjTQ}1QMfY9v6BW?g?t*6)4OA?Ua`ZP2+;W~G!a_p<{DsJV1LWcR z5L607|5%y&1HdWk>Vx&bE4Z_7SCtp?XO7=kC9{$riT)<&PXHWz+^(L^{=R@8+^p}lkPC`B)z+3 zoKV*#oqc5eOU=tz1cgq6k{@IvG3u zv)tWFRb<==BlKb9Y$3z&=Gn1|PeRPqXuvnTE_UrF;WV$~Qtp8^(44pg)*F+h>UUX7 zUv~1+WpIA73I4J~YGCz;J}Jek+E6qw_@^CId%eL`U( z?E?z$g4br<2k{>OS0K8y$~~EbZ z4>59iWQt?RBzGk~!40b-Ro|d>n&!?;lx5vD(P{547lHEZ^ua|5zNCz?du*j~FxCfU zl1qkB)b@AadV8tLntenREfkX~0n@HCNeQvqYWVuGjhgAE2?eg>jd#ccteG}&O7cip2>7)mX5?1OJX-KK<366^f6fl1rFmo#tL zZLKq7`!R(wr@qhqxTnm!EhC0RWrioM<#U+*U9J zuD?^v$gsyb!~KhOP*413+>7@o#N$rD~Pyr3b=ENR;D z$>r6f!`?j*qPcPD+=Z(47Ydcl3Clb;;%t|Xx62%J13WC4;EpMI%+%}rx7L)MAJF=c za!15JnM;>YgbWbjdd7JS66S`D$#CIRGE3 z#KNI+qE`Vm^4r4G)G4j0UN_%@R}+dML5?6h94+OtuSMd93DTlJ0Nq;G`9w+~M-zQ) zt8*kV#QjIabX#BA888>=ST?jSQ+e3vg47FZj59~;xP z-3YggBs-)lB@t976LPk#OMP*;jJxm%zNwA+2?L4rv=iKQj;&$zLeg}Kt=xAxZeG@@ zaKBF_=-Z$ww=FCj89cjqQLAG&$<-9c1K2+noVhvq9*v-Lk$qzKp`G&6?EQ<|^xu7V zA7+Fl9TUIiABzvTTsNBm4hmwWWid`@8nk&CmLr*%V<9S;YcD(6mHoW)9@1A2?45`Be@XUN+>E0wBOdXD|EL)-=gqLdYrQp$&xgM8pJque z_Jsp2^^B#fgxD{OBr#zbe5CV7JWD3}h}=^)!3wc!wV7WWsgOT0K~4QMQ|aAbvtG**+gPSL%&)sEnOf*$*F$AzWc|~ z1=rci=Cp&E5C?}D>;3#odlA;b$&CBr?nxUUU^~lL+s4+qs^P@i$D_>HdYhp!Te&~~ zoX4HYYwPW`fA`M9l2Qv;z3@|f1y3K(WXeeImC^!uI;0ssUAs^)Mm1L_1v?^-69nVDKQ>WgH=Q;wx*ywhp%8Nn zYYIwMF>>@48|UdrDe?h>LRnsshFAd&VlB#E;Fn-T*SG6&(iqVV#U`P3Ux z8)peDP_iB{kPRURPtr6;Dr50YY~F|mEX|^7Ixb;7yB{g!OaR9U%&IIoF(7Ac8Iz-2 z-D*W;*3>Hsk_qC(7!y~|iphR$^`@|;AG_3;PWv={G-aYJ-F%o`(QYOmZl|(nQS6xr zU@|m!C087Ov^C2GP-<=L)jp+7+suF^q*IzP`0{wK9*S_SVg$O_l%%xqO(H8PyMNY7 znZzu+5>yQ0tp9D8F_pdOJ5`&Fa7kRHJxzC;3d>huRU30o>^gZ1rdi7haZ+c^}Ycp`62bAnOm}-sS<&)0gs6zeG>4r~jhxu8`E?g(d#zs^jI|wdkTC z=kN3E?fTbdzyl3=n^CnxUwlOou8btG3>6FHox>WyYeyU!(Er zm^hX;Dq)r1Kpl>!v!?FL(AZ?wn(2)C8F-G?VJy-&R3N(5FM#r5LqYuKw&?8wfd zxn~c!BC}T$h=DfoVz-E6d3BmxhJlK0izR%+xoV@<`5TeQHp5d5C07g{~QZtn;ci`Q#la#7B%EPdubh0&-;5Y_^3dNK|y|M8vhQ#a<^SKV(ZeRP~mxHUWWo5D` z2XNvEL8u3n8%?2edP&bt#gU>5ImATHDF+#g7AhG8$FGPo7r{v~R&84o zioD?-z?f4n9Li^wrL|2{BZ>m?6$L<$l)-G%N26KDR zQ2v3w?R>_e>ymDR_o{4D)sb#|FR9+00mgOP?{2wwGf@8L{=h4Pg~zW`Q8&Cb`FKUg^m# zTV9t_m)}UBm^LL>Po~v-sv~97up;ig*f>Ke)A1oDRol9#@W#U0SIiup;NIb6Y2il1 zzIo9&H#j0hl`NZwD{b+hcaQSq3LXkP=WHdFZ@~se7YUT;wn;mt<>lZa^f>txb0*w%x{*#ea>`)!tkKuEH z70=I5-hIS99Lm;qNHcyO!yDPNvGgrNdaz|oaOOQR%9Yj)7FAtc?VQvuFz2uiv*(hM z4TgHMbwAr{8u0#xa`K4%5T?DU6OdBrv{r-};a<(=A=V@q}tFk!!I zbBhKpimOt*vZ9D#TW;sZ#)g$J@P&TvC(_B;6Xk|FuC~B@b zYOwY514UlG(5r3IYO6IMwmz||9nS%JTg7}nr@16TbAjsHScGvbiCKik>!{HaHRsXx zguY|~^|(4nbUg z#C>{$`Sybf@fY>m7%^HOg;l6})HlpGQ~UGjAb-ej>MOh}|HO3VT%! z#sE35v9)cFOvwpND5s=er(VSf?Ggxl*jfQ|p?xfHlo#?7y)E);`o|zqu^+E)&!j_~ zWyNO)aml*UF1=$N)6^s*rqkRDO4mE7)1a@^C}HLKg!8v5%PkVdTW%v6sT9Te;)lqG`;TreKkG3y;1i zH}yKX1e?wc7KSJ()VY8;?tH%5ZPYS8ye{0ND3yYZG#iJ->WFJw4<7sc zhQQfFAB0q)eSJ#fB1!|oQoz`NVII^u58juoWNlq^pzjz^ow$&DBd~jE&(6cGwcd2A z`lH;^MTc~P+fo@LC;f{}M>!S)u6Q&`iy=BCEx~C)$J8@uUKy(# zEznL?xhy@$uIpp5W3HBVwVvoONbW_8WIU;1krG*n*e1tAXo;smju}@Z z3Py?C$h+b&wyu}NoM-V=6?1EazHxO$jP=ubWD?_xNW_xAq8)gQ(Kcoq$6bI~#q2{Z z_L<=0Cu!ms`26gY^WyIxx$7CJ((9))Jp&@VGuR{z$HMZQPpIOqiFQdCS_Uff((rlT zRU<$cgeS8p~yMOWaOK=n9bxfbBwq?Qajo-G5 zkbhD2`F8!}UXdP;{l&zv zQIcofn{dItZQ#^Z6JOWBO<392c405zt$T0CgJ|$XWtFtw2b?<28(uXfhT;;5mb-J) zu8J)E+&hN<$ZzmTjgge?Ox+p376XiQwg}NzJ;l5ZHC2oy6m8QxS4VuFyouz(GBHB0 z1-w^4oTf(pFzbT&WG!x&cQaKLlDLDid8oF5I*>m~p6IGsxWRlC5&1kJww%4r1g5FA z(v_&C%(Ydo)WhX10rL&-_avRtHLI2%fbfjb4KW^lC!`;MQ-*~1vSF4bri`!=r54lKX~vg zMIU*;X%YKjv&H_pIHgHeuX-wzCCMxfSr>tEsMO2={sLj_hVrj&`3iQ+htc{>=wVNI zowh+ULq~hs<`11M~5%tQMVHJO%aNN*Eih*3|Ga>gN_)D`e-9$A86|fQKzQ#5Chlp#PLmn7FVZP$-x8finvowOF!IcHZGDj z6{u)?S+>DGb??uJqLQmXdwzJ>EB71dF3uQTQq`JlBnTOdBX=Ev`b@^C5jm^}$P7cn z`oUV|VR6qx5|~bnEsl``bTsyP*92ANFREyXX+GBZMt?#-a~} z7L{HrMv-JbXJaie#8echyE${u1$wsG4$rYmFLL7A)ILf+kx{facKe1u$0n8SJ2Nn)vx{W*rCd^e&*W&fI-~jrqvz8zFk#$x&$Tnxa?vY$MUC}b6R{wm|lHN z#+cH$+&d8pZ0$>O9m#SZdEN$W3XJ=hxL_lPn5Rb=2cw(MC`5AYO-MOZmAU;W$)Dr7 zD;J(P$AmVU5=_LOtY15t!cb>Kha8oBYl&5kSIB^kSdMlnFaB-yV z#oeuXi!^_vJRm2|Xg$w^6c$*W`lLmQ>0u!}2r}o~2va^k5y#t#Py9Zu|Eag;Bz)?w z&$#^7TaySYx6<94)4>OvOWAK{IAktLfFw0UIFH_}q4@|SuX52kv~e%LuXm^Ku9*ETMnJRh-luPWf91nw{I0qg z@L4sLp#F#IW|RM@y>!YJ8?)76(SZH^o0go*`Qn^0*OUO(QJuSHMyu~1f1v{+9Sczb zugdWs&NLbCw@bHa8h&jm`ZvzMQ?VS+I;yX9yZ>9czUI`5f=J31_k-S>miNc-LM{U= z*cd$He^XiD)cR{j)v2vkIXKh5p=wGEj@s`oGisHNc}#OY+5Rg0+2kSBpIH8r#Q#oI z&Ggyt9SE}{N%-SI7XB3UNE*4O?Q<%!#)!M`r<%*VA&ieqNNys0dEgJRC@8YK5&}hF zn@abp=C5A#CS0T%#d)2b7-a#0i+52OgmUauabDN~#%dCKrdu`qL{A%>&jYmn)&uqi zmpe^n2YTpTS9N`DtjI2OG;Eyd3F|d24S(|?;+cW{l!|t(w*97yxIX#ao`*h^0>6lm zMlPbx^o}jY538+HX#Q|Onmncsy1u_(QVt~(Hg_zq`Ob4ZnXw|eyK^R1$0Zn3{Dhex|jIvB_>0;av zU{0fDU-V1WCPq~E-Y55Vl2>%a#Aa#5; zd8;veavmVrEdDO+woy%Hbpdq}`%Z+eS=>KKNLqoh)J)gGmq?z)jhK92Fzl@&0S2CC z*a#jcgfDK5R^PE&rmCWm5pnS4NNDUlc44Xuxiyb!JN^v@ccMOx6M5rn)y~aYT>;7n z`vCeHD~iVUcT1%&o}5M7R})=3O*M+UTj_lxH&P993yZSU*4BAJ?y*>0PRPNzoAu-U zw0r#i&Nuky)thg1&fNjcyBQAERZ)y9PY->LS#!DP85E6#eviVzyH(dPM24M%^Qx|` zZf2X3bKe=d>)Ac>_0?@_v=R5X#m~HcmBcPIYl6qm&g39V7HCz z2i*X?zZtOsE6VlnXmdau z02QZ-=*g*xOAk2kbzUum1FAf;Vf?okaw1$m0rNV}i7{v|@Ziyc65k*Oe%^GawN6)0 zgK@~qoFb#AJ#F`=_KQnjrN;}1$^Q|S5M731P=_+eZ)|Gh1@V?~R;nPZ1Vb82@ermH zE>rBthC1>#xhIRP)i|W^eQe^b+4W(dpbU6S-(hK~Fsue2V+7+GD1=G%zSW2WugkJJT4<5PVhW$kG`i-2Tz-(;EWpFpD@R!^SZ(dw|G*4|TR%;eKFo6>1j2ATO?NSs! z56XIwKrVtR^;Y25q*|s&W@SAqXpHt$C{)JGv(FRo$?*bnq>^_TMb`T^c+ciD&^Fku zeneJHpFJx7IIAQ@7o88#S8Gbx2wYcjjlmVu_~viV*}MYb5f>Hp?je1Tav>(bSzW$3?C81Hqt(gy+S8PCFu6cCP@MGvx6O%nV-YLzxOz z;&N71be_wc2-gIy8Pwa&pyvpX8}WW`!eV3v8_G_1-qaG*MimI2TierWa zZNKx7WXH8*tV3EVocj*WGtCfB50bTFm^dKmv_fd(OxS<`)JHUnCN%PJ@fSG%C{dE*0m7_7_w!fUDf*wPn=SQ?=b~hR>1r}kI$WhF&WWr^L4>FoJ zbLJg8BHC8j*g2K~GphRR`)(WseSg66++uDH2i-F9x-U==i6yBPrQ`KEL|m_%Ixa?f zRzww%c^5|vhTP1NOB`*@e8{YQuM-&L`^a=iDdY<@R!*8Z3s(*paJl zD2+-|QNAhl2zrXaw4<90AXD8|FCk6XA;=3RL?h9S5H?=(y>J)Bt-BwqKeGP1ebNIi zy`g(tGtA}vMrCPw3ph{OE*s}&hdpw0j}($i3S+5sLVPAfEwcZ7U6R&pmZ&|5Luw1C z%-&EIj22}yi!{Lf_{7KAMG~-1&r?xaicCCT-9T!5Ld~#j2S0FB7NG+MT^%xo9W>K6 zGJ|p6)R0xzpO8$ zc9@Xx37a&Y1pp0zs6aj0u(FErPqmqg&SxCs#08e4d6pyZUif!s%0wf6$W^9`_zDqB z^-kl~3It9s_&yT1!Sk{wuse$Y4ihD^gy`l+8_@YMoV=i?msMDk-j(g?W3!Mi`AX++Vq2TOW^DX_GlGm^-k zfOpzb8m0v53J;v5yuLZ6-w0;idsk2+&52lZAu#G_aV$ZJCzmXygrz)OyAEqZo7Xd< zh`roLfD$ZobV1=DFbp6TVeWYH-?!%cHsH&l0jkAQwE#2VeRYOqPS*+Bx8J`*iq&g% zn_Fmr-FEuB;~O|_@+x?f=O@6-J$9B)W{u__0ENqwe!GXC0Nmg5lkoL<_*HDc=gqZW zzw~tYD*L978%P@v^_%j0g-h42%y1ts{?W3#Clx76*!j9|=h1%x{w^y+R*$m$UEtd& zvpj!c6u&^96;_s~^KZcW@1O@x{0A*PJ1Bo5{uRrsJ~+!`XE^v>dJnu0@EmBM&Aa)2Di?O7z?c5-74-$h?(N^|A*SV3qbGxPFF46!;x;S(pmOycw z`~)rh9DIUWWI_kD3s@o+7g-A;J8lw%149d1MsNQ-2w;c<%w=8`Vu$R90~hGW$I11z$vfr@jLPVMW&Fb*qGcw>Afhqbo7`>8l%%+6F{dDnxtJX^cck?e3~Ur%ST1JAA}%!- z4{{;Na&bP?_<28sI5uA+D2_DHISlBx7Xjm%4(kRq!2%;@WIh1ehKHZkib?hhfp3{) z`Hl5~^qwD404z1hIf%*4L3KohCT~NbZ6#I7xoLV0A|FF;1Eea>P9>j79!zf9 zQVA1KD>Pp1bs^D?9;PG;T^WF-5Lc1DfCGh95DauI&w&*}hs3c6eu!QIE zxF2ZWNB3mLu0NiK@W}ckBl-6Qbu*yu`ji~@*@!dNad?XMXn07p(We|mTNzUO-hxjt<3UF zn-N0P5eRL=5`PFZgUmp^J;v*1O0PLZJqgEIMt#kV`jcjXF)Mi%dOXp&Z!8F!fNZcv z3njn|6cG{L<}+tOM$g7Dcb92NTUARLMgau8hRT_OyYwc64a%|szYf%V^-lF2xl;3m zzI^}qza@BNoj8}Lc$|Nvhe4(Ga|gk@Zg?LZ-YfsrRsRLjf>)>x5^)34Erh>so%M=b zaYU=FIz`T1DI&s`oL;90v=Sd#jlhNygXinKeAyP$-^M?^x4byxV^8n&ofzA8GJ5KI zotgS?#A-OPJCnWRHw$1IW=@INO$SLpnfZfb>x{2Dz4e!vqtR3EzZaW0*w)n$a)L8- z`u4FGA{mHR+sGDun~R!c=C9bShXd4=etaCHE<>gIa|Op0_7Q)+8Q^GQ?Wr9(7ST3Y z78nnQ{*qsc1|^n-<57VaETfh$IA#hnHX0;kNU;cb{C)maT!=LthQ7zVz9m^SfYCrP z$$#kdg;q|~LW-y#l;zq>u3@F(yXl0NP}U7;P?ZlV;CkAYVgLOZmG8uv;7>q$h;K1e zbPilpNa9VEt_kQgQDyU-Ueh{;h&gz7*E8qaTwhp1AU@&(=ppl0QD(cHlnm79q+85- zS~EU9c{%#|80AW>@(iOW+UFcZ+C6DfXaJt*ncH{|LGC5qdxV27;aF>Bl0q@5^Gan_69){hom2P(G3sjxTkui57~#P-`ztnU^meR2 z$>4S2)Dbkl`#f$bH&UK_^lmgd^M`v#C=3$GBBW4G*^At>2Dl##A{A3Sn9!P#+gOe8 zh-51@@t++=xO{_9LRq*wmTw|G$uZ7EX2g@ivkOFEnO&ede&kszUZ+k0smuc>QZehZ z{scgKH$(xqbf2N_=-QVs03rZgmEcOW(5Pw_V0soIzBvP-g;~)7o`*bD2LN4Ukq`yr zZ-IG!lSxLm`Gy4;3xvuYfOHj{tL{K^7wUeUdUO^HJW+KT-T>K%C$zj}+RlXd`ef)7oDijAq>_-0po1r?nLSJz7v_-zze>x zQq0}cPn_{OrOQV>@!RI`B>q*K*gq zy_j@(kE@JCgmDPz4sGIbk8ZPIE0S#sdRc*M%ut6!?5zE%+ltKx%2h0MoL~-C zN$yRq6*0N}3HS-9cbBqQwY|dHJ0{^LV@%pp-(b=?)4-{m2EP>uU63}RbgUtGumEkF z@0BvwD1J^q$j*8$Cv2O~(?$T}R^_ugLXhEOE#yJ)CXqps5wGFcW=UU7b*Wwz4pCpc z%;{Q%2a;+&6~PqJ=BOljQBK7@VT=yNnVoq$j%FE!@5rz1WCsSUvmwp5s?i3fQd*sY z`FTJd9N_R5GN5#yL17yYCXIQ#P7^4#AR>MiT@d2Bn#dPK0F8^ddYpvcLmYmdWf*EE zLE*QbfXQFg`L(Rv`#o8?p)Iz+0rcQd#N6hRq0Oxtwy1uicwQj0kC6$fKL9rXfikA= zu$@|x59RR(t_n4?2_I14Z;G4ENmv7qh34}pXF_grELZo6AzaAdh$o1qKVT5h3;dy0 z$CP9PE6w*#{`Ky7rAnng9I7%*@%@XCYSX;NY#yBUSe#ig2m}ssk4$<|@oynr@Mp2_ zUNomt(I4efXrvGq(Ggb>zH`huOTH~D@$N-*Uy~VjCzjm=Xx4@u&D!c1-A67AEa=SN zj4h!X^u24CC87o?4_qUm!BQC(1g38uas(_q%o~4nfOW6%?w|Zo;}AS}{S(h_kKg}Y zIzVOa|Nbd{=JK;L2FtO?*j1O`<>x=8L9xif{v%wgE4)7m;=D$CtUVBQ^SEpD@09&! zx%Tg<7@t4Kd6-ZUzCGvu7|_pJB)SKn$^Qu``t^k*?8~{!P1g$cdnZg@@f$@CiCZVF z?7(^(MBChq$|?jXs=BBV1cHmp;iOq%R(=)812wBR3m0cZH{0E1;4?nPde1+FlqZTy zFe~tpXMBw=K~#IdtQYcHH5A*8Tc=OAa5kBa$74bPi|GVGmQaPJp`$gt5=o>e41Mg~1SQq9@32W;fK2ce+>1nAkc*H$ z%LQ66*xgKtg8W|-Q*YYM{{+ZQmgP9?pGj}Tgy0B6<8suWFvo@pgbc44Tj}hfaQ5c0l?)~3HbP`!z-hk2|b*ZK_TpMhczIogA8YZBn_WZsOcy~ zNt;XsT12fuTA+9*6@!mW(7g{yq^}*yGZC373KchMGcF+=0M;J(nc$Tm4us$k`Vi++ zh0TfN3Agolb6-62Eh(0jNl#z_de&n0GB9B`z0=%ZRC5rj8ivrCM`#c5Xx10GlPs2n zI$+k^VG(fNc*G^d9pq2B5mEwX0h$k~*&4zhuHywckD0S^kJGGH2!)L)Yt#ey@%E6m zlA2{Ci55UwtE`0G0ZQ=t`|Y2RPD^%22NHqU5cN@8aGa^v|22wC)0uDVs=^vPLtJ*vs|G<;GLwp6eJzYU~vT37--#5WU+U@>$=D$_?Ulak> zro8lDP!PUd*s*Fpi+Guec7$2;WO~f;TB)mcZ|WM*Vf!qkE5Rvq z;X6V4tN`IBKqc&lH&Ua`w;Q#bNJ;stid*9$P3;IPrw+5CIDI%r8nKF0NufQ8&*GN($_bt5*oeK3Vt(RIX-qng-QS(vm{@! zQ*c(2)^!oI>~|1P@%75$XEa?7NJw#98zYF>^d5|yNfe36P!mR^fK+w0NpFENiGm=d z*1MxF_SMpNpS?TQn$oFK@ngC3(z!v|K`Eh#28}20>bjW&Xg3JO$pGK?UmWGfkf~na zQ-~RF=!P$0=t)&Dq9US%xffIg84P?!&W|i1D$=NY-{7XMEtZRpsdUQ8saTqi#|a-@ zRvKfK0fsdL?)z#_w(*=L%Gl&=OCg7QNKA9mV%>yMqQ>%z$Y44;QqfoEy=fP=;SO|n z%{f;HPplJ!OtETm6|Z!OarEf3>`YnhW0&nCWLgA?#e29;K^w1muxyZ*D?=D$8yhf? zLPpd#YdXo%7*Hd~YPpKP>Pi)e?`O-2On&%&9~C^O^#0=2hohf>OgLKB=GR<46_F*e z`2>eQvR{$f1@C_cLPvAd_AdDKt%mz8yH;kL$QD2R0(ZYdS#ZyO^T|UUPE7A#8mY)z zPCVRFY$M)83d7VkHSBhBGQd!2ef5#79y$K>qa>=X-6~oTaveyaI4H$4rlo{Ydjwz^ zwMl_bYNL^+1$nKas?6c5PEB8!mmid9iU1E91^ZMN-y;TumFF`AVY!NhU5ZoCss@(P z^sGOfM^Q%z&9{EZeK+}p<^)Dh_(a!2v4RG%PZRI*nvg8r^_*L~$uqVK?z5ntr>WPOVu#r=u}__zraMFOevM)sSV z7-ou6EA61*O^JF9=2VYAcE1Th$s@60^zH;qBhLhnBrzq z{>E3oX12?jP>HNKf(NU(&0L9~SB7dK;<+UHpgI|==SCn&LA(+%2T5=mp^-ndnlbuB z2dxVc1Q>uv_fCRkeyQbCX<7Z-PdEi4#}!T8@cwro@P;G!Bx&wPS?Q%=wUA%enUB9w zql!}7pW1vB-1LcKea?hv-Bj(M34T;yhM&wcn5Bvm6LwjN@#AYOOBsnq+99Q{#OI5+ zVeWI09-Wv8^ZwRr-Tg`7c%V(U(^0ZaGtBx(B(WM;RdR{Xu6bP}AG6%Z11|5PZZ{U^ z3?*QczxrGQ0R!{R7IQ@dqog}3ii!`_C1VL1GL$xolqvqBqshDuSTc87`Jg*QwN^7j zd-Ns-m6KKxw5raeA*E~Y(-vPdSVSeuOm$u90Yd~PXs#PJK+eH!*q|x``tQ8h$9tZ4 zU6%R3YBP==0v4m;Bu0lwVtJ+)mGcVHA>QslWbH)clXF^uL+8{sr?tSM@*Nil`}l|G801sqWnHd%=92;AnF@z$`=> zHO2)Shn!mQr8A-%$M(iVUuGa`^%&OurqeNAfLG>i|G{aXuc9OQM}Zdb4J$b{zXUtr zZ7GFM4Klxka|H2&J%iTqJ_yVE0tOODb94T!A)F7}5g8G}!}&KIpFcr(@ybsHTK>fF zOXL47Gz1X;7Vra=vKoF}p`Tj^69p=#sUgM))103`lc5yj*NBAol-B-TxsMC+pm-2> zv#+vhumH}XUD>0K@h{A3wY#i`BqwP05jenbMsXX>ix3`8g)Mv*>~GY4HKI;hyZ6i_ zwMpOJ!jR-&6qkp$Jcqt3^?FFZ;s0{(A3yUjrS$$>;awk{GDR5&(C%@pD3f9;Ccd4; z2Vot=G6z%?`Eo7NGzzTmg{0~Z80eAH_^V1maY?Ek=+Nb?hW-fI_|>lby?kdM&$4gh zd;U*4Rd+SqV|HyB`n!mt4Q=D$Ph`BO1DHM8q!q^_H zI-UN(WS1EGivc{)9oVt&j_j2zX#)s(A!vqv5kkRLsc&n{^nzj47*Ul&lDwF`gHDF4 z+Yptv=gqohEkUy6M&{Y53)hc#L7m3$Jww9U3mGI1&}rlxA{~3Q`%#sM%292VG?=wL zOFG07x-+ctYzy{UXxWIt!%Vc#NJ)2AWUc4B!MY5c_*A530tU#BPTE7j{Rkyj zG~@cdwVdAvhQ^2}S#sf%mF5M==BIj0Qenz^AWRSII#LtN%hC!LGbp0tO4V`~*>=5< zyrmGHTY!u`?^Lg3aQ7~iAhv2g)^$AAU|JPI6;1K+E`{QwiV_1LyH+GwmLedjT#=Ir z;SWCn$_*n_^r-V5KLK+Bu3KZNZ2GPLw?T$sVdFsR&K%s4h6N0d)CUA1{hpTbw<`@0 zfJ4P8s$$Y}atd~t`I{$=@rLuid(u$BJ!!zq0x4+bPY1bKGVz``*y!+7@|eaELMpWmf7wRB-r)X+Z&4bO%OOVB%geR~Ls5pQU~B)k%4?$hFama>44HB<$fYfVnX zAf&65K~Wx`fJ<1 zd!XDW1Y%SJ=o=MzF}3$@mmOrd>VlbCvXLa`?}fU8*;H=Jb-pz2NKPF9r=lLgD9;-@ z^9XrWucq+cK6!@i)xaGK@IfbEldn7Uxah;4-rEhgc2BD>v#xitiTVM1U@Q{#$j+Oa z!9Lj|=@Fhm1$%3)1C2dRE9-JB=hFvyM5#0{XPWtWD>O7AuLpmKGQ(epPH+OjDwnRB zUGbH@10`P~5 z6@;!#2}F40!YVdAE9us^_22YQW`J>mgH5~~x<7j{n3Jc}VzD%?HtZjK>$R2G=hB8+o*lC=oc+YzCiP+6|&8FH~c2x+#Y zm*-4O{4xlFl{ot4_VZ_>D+A(hleMp2z4u4WJw%vu*}#p`sOmDLm`t1ScDYJ|XE74Gvu#Z=1)R1D|7BykWaxqEWAl zD}MsIccxOG{rmOxIbfJmmwTas0zAyA%DvEa=DIaS#AcJ#_!gyq=B3B|kztW{YPn&n zYvbrbsT?-nR=1sB;QDN9ET>CzU9UP?_a}fk=hwx1XABNbe{a_> z)UIWE{WNimdvh?MG0kWEOeB3f;OY2-mHTy?l!sQ9cmZ!YPPqu>NH8)cF%i0T0gu+T zS)vx9av3?#112%YnKknc9ozouLqH&(ugpGnBSj>SsvTbi5&#Fw{0`4DMo}sMPn#} zi+oIJ>B-hx##72h(nxd_%57FC{DzGwc@C|-+%CzI`u25?8~H%_EJ@BR*VqVVMSfFX z++2ySF6fmQRn%*A%q{&_8Jee$36Q^)MO&*b!KB~J47^tS3bZeNk$_i*eTap{_`|56 zV#APg!tt$GQ<)VuQ^OjK*w|Q6n5$#iF~j=f$BP`@#QwzsMW#Wp)vbs5%Fc zFKD4MwjaC2l>J~%3Va{vP@En#z~aeS4v$Yfq~Lun+dcaPzbs`YRy>pC3%AE0)9C>S z$!n!2;|nN3>Rc0hjI~|kqvYs3al1uqx?5=gxfgXi`b^J{08l|sW*vGkU4RU7x7rFp z`+V6NhD&!{ZJN#iw^PtdCVFMM4p!b&dzh@0LqS43xvatI6Gtp$*@d+xH{@~xjsg8; z5o!aL>85-J%Osmg(^q%&3j*f3T;KJ1x9frxSXiDBWG1hU03DYJyCN$)%&G>YePZ6_ z(dc3sI@PllkcRW>3|b$=Xna{jL_e($<{3nS#O_v5r098;w?rqGaC(lBaqXx+@SjL} z5)=dW=X?&51?&{^B8I_%?5GRyuFKbL;hj1Y*Lg0(`wEMDq+*aD;_S3MektEhS?a86f zEcnQ7`JHm_=@!<$e^uNhQGpfML>zK`W7FOUqfa7UFSX`Y(0wlLz;#;=HZ~6sZ%VwK>a2Q}vMS znZ*ER#fqlW5MnL2CRI)b3o%aJY_laO0ZPi^M1?Jr!b}Gqo|B7}+Nj7y^6GXSaZP>a z#gae-AeDx^n4gzRjUu{Z6+Rz8P@EPObf1UGY3Lh~kAnX=Xlg9;A=+Z9=hSO!-=pyj zfeFdw`Wij_lD7It1wl*lHpGw$Y{8)2x`Q_w@;%&7kX?|GnGiz<1CPwGT`GDljmU&k z9oT*I`4*;M(X6yGgBhz_<@gZ5>Z8uex;*r)$}j&%b{;4e$tE+Ym#Y35EFoH-(f2l` zyOM-e9kJDPC@x%Qm!An~ZF^Ra9~q^uc0FzMx3ayP{0p*$tS4zfM|t0?|5BFIG)`D} z>7uL7^-C&w%hnK^fXi5%{=Xy698%5kjrUH6|Ek1e%D*(^UX0T2=JU!wHTF3DlgQI9 zE3bd70msZcNzL2uegR`RfBS(4K7Gs8daooqe@OB;=ICuwy|?1To)BN*;ivy1+wQHn zw`Ge{B2qHmS~AapX7K-?C2%5C1OP^qb+I6x8gkxb}~h z{ByCR-&VuLUKak5{aan&Vk>(>|JjB=jQm$r1gHs=8Q}_Fzw5wAE|u@R)n%Og#;Ee< zlb_R10G9EMN|`af;IpY2R)iG$?XUz5D}iq2-H1sJn5CgC(V}xStC40~bkOWz=;xS_pLGVk( z#mH0qyxxV%rSwk~dEoo8=50>-#(l$7W>uoW5uWbOK(E1KT{yAmj|n^U zUyLQ!H6Y02Sx&S(RmBJz{~CJ>6JXj6G_BxVcs=-*BBpFYS__mf;E_@!RTXr#U^kNz z!CV1jA&e>Kn+T8dT^{$4eRxwf8qWSyACl-fT+0;)pI>!DSLwm(QO|4ZBTo8`PXd4p zapPV3Fk$5k1=88wH9Z-AM$7cNFRz{^5-#-HgH~a+sZ|j&-9Gr9KFY z8*@iWMkF!d8tYN$t4s2lq?M!kbyvi+P11^oE9)r9V-T3c<2_YKtwPn=28&UdBF~lU z7OGj2Sllqns##VL>Lu#qhI`ipbsxG|Yp7VZ)uEzmak-?|YTT?n>z9zGrpdY4{z9-{ zpqb9P&fqvspt-FpRgS(dWoEKcg%nb}8`tgP*gEla5~7leWW5!pJo-4nSgeu*1AN9G zQLMiZ2WiY>$+tw{#Eq^`w2A00$enJ$Z+|D1#{V?iyS9OL4nSMxVcpTT;Px{0XR=UKJZN7UnjBC=z|9TWIU)@GM?k`^f&A6v9uJ0ZI2B$niyOB_y6FqO#fK{9hktZYQS75OA4}?;1xKnAX zM{4rxW`>ORWx*)o@Y@z2Bp5Ix2VNH%oX!HG6knj8BY?X^uRZIsAf)gP_{y{&>L;xt zZ|19cI@#nqyXglH=7r~!8s762vR${f%!`tvr%$LZv%){QQob7Y+xc78@X1{?Jg~?Z z{QnmWT2?oO*7hN7Re%7@W9+0FLB;MpA%w!i-`VwFS?y65L_Y-@__yr*B>|OoI@hSQ z_gu~Uc62`+lf-^tKNm@8CD<3e;kbV;B}1w${pnixen-kOQHohQ@h`ITc`6JRZM><|wT41uH_{8a843PcFM=!c4{-Jo1DA7 zU(!)F-@D5~gvvtUL4 zY!r+q6+X^Fn8xR6U$bkFSgYuoC5h$gb@I`UHhktfc9qF)CU!MgA!SvFa^r}i<;F#q z^=(=uSI6VfwL#^Cg&H(qCb|(nYiZPVu-ER*0hawthL-fV7Oq8<#oFdB<<=l0AsNjg zR&WMpqk+_?r2$U=6|C!oLGk*@s)WSDes6!aK)*5Yw@0O3nYOvR+THc~Gck4dB^wdO zhw#ZnD5pF>s?bk;YS}1T1T|m~IL_)bs_+-3&@G40s0#1IcP9WU(VV56KwFoL{dygB zZzb(4l{Hn>4pY)(+6+~zK9aAG+<{&q@u(3Mint9Ol;d8b)G;lHjc^RB-yuUVYUN1u zGu76(JG+X-!tHw5h;XTsRVOfs2>9ZAmx)QV$SoEMcMrKnlRuT>ZRS6-c1uC zs>Lzalb~zz!%{6qB0UL3K?Pdu+G@CSl7`3tt*t?E5?X5;4@^R>jS;wWZkLjGodH|O z2GX8)^ud#uk2f9OhR1j3G2gx{q3W;x!71ludynLrk$6jyvO8xMXYy5gq(-?C2^ron z#?S>d*q#bhFd+bP@lKx6@X+65zIlHpRyC2HQvVugCi67GW0k611Dn9soVdl(xrQ*9 zlqHKdgzX*P5~ws?r8;+smD7@sKju&u5#njUWF{k$O-Mk`5A#oGwV0NuTm7zfz~(wO zLE5sAzqU^;6dXORH;{XaqY=!6wN~ObxXt&bu4Zks)3_`zSau0iPQc`+va_t=$a54C z(IfWOqtR$_$>cFaQ&dW#Q^J{kOua^t&3CWY z9Vw?2(V1Bvkx78Ls!LXG*D?F!AswAfjfy|W+2PJnI^GkcoYp#Mm0fJv+u&wv zPC${TB{0Qy)WJBlkmD7}^5hmiSN5-k)l8^@AoocP;A;R5YPA884&f2? z*50O*ela9F$;+-hvi(Q92a4(Q(kvvSxtMas(Q3Q0(8c83VrMdyUk>XYjZcSBPjNHO@bZ!cKTt`v3SAyu~<$TDfm zoE}2eMFU{F#GHv7ldfTHYnBdQ2f`g!+9DSHyjNxyiZ3#ta$Ffv+m_K5C##s#9~d6r zLd}e(VvZTkWHLz*^?0E#mGI!nm|0K_jHZr60D#`W%XVGTBp(H%3(k-Fk0L5BOBOS z%u*frlFfWVJ$vt%_6^pvz*S=XK5G2vUGGTZ1@J9T%kedwgA~n5)7Gow5GzkBxK$a- zoA{%b4ZA5)*<)$G-(mg{Kvi?zli#96D$?E{M|G;9XuR&>eIcnn4C5CGxz$6UO`<9a-fbWLR&zjh$MKVu5SsF`?k=;*k%y zb2g*pepYM?*YBMoRn)1ZFiN#hLaX$LIRp;IokEYvb^e1ku%8x5)stZ{5R!;!0BrNJjzkos7}weR(* zta2K^Ucjr{y+=QA+%NJiE_}jY!^ph!$jG_D%gWNM>Q~oS9di!!BTD7vL|(QhwbBs< z6}ES)q@8}-?n{FGQ!N4>wmw96V(Ed))Ro_=3$nVJ5W;kCc>P3{;hqYZ`CS1w_JPDd z0Xf$eDLQ|b#*x}uq8EleA8^Omg+^^wjl6#XSn9_9oLFO}25WhZB#M{r(EcQQg(9u! zX6}x^u98uGA@^s2Kk}7W@HZ9PU3N18OAH}+$9DrKDgo`7t;p#+ckJ`6u8HuD$Nigg zqf*yz2bb%E%Y!M(;E*MNwQeR!q5QUn2L>HfpLSD=3TS z9)fNw!=HIk9}3BR=-zUN;yy^)xUK`}c-_P{XHrbOJQ4hcyzuz2ci^))t!aLJj2Hh( zX<(9xGX3H}Nr4;ot<_*RSrR7LNaM7?3kqV2@=ye2t{mM0p4Jof_$ zlBnz@kWD^(0ezYi^PBEr+Ptm3<#uAvhip+a5Lv!4MP*9qqK4DmIVe@-aI-fbdp#H5 z>_Pb6m*aEy^$HF}HhjkT&ji+DmyqQp7N#(306}m|H~?K_RD!3Ef`?5@$#ZtLr9s9* zN;AJRU16NVdeoDf!_=p07!yJ=i6mbbm5j<~$SA)QP4Th0Me?2I_cl&KU-_D#^z3eT zMhvN37bF!^djclhM@95#Fx?g+?PN4+H*>R&uG)i#j}nh$)S8iDFJ`w?5pX|UR2Vbd+YX`2h?uV)eBUqk zcuwJn_^Rm+1Qd6eT0p*m?i@X=?UQlciCRlrENxV@S#<5%4h=nmKM=P-o(4WF-8Ua> zAYYuA*?f5y_g2tr@4p4&-?(*1xCggmE+3Wne`P@Dd$*lhr@wQZYPAhepz#qbuDzlE z7piu?CZoNFdvTM&whP{9VTim0`zWu zrulBHpMbER0OuGP4JEf)55+H(UR6260eIP2bEmva6y%rO*)AgHT7yrd#0AA5aMx^q zs}NzU7-8dpE8oc$T-&~HFFq*s^NF9o^Lf${;JmcQYj8DpYb4@kG;Hk`aj_Je^|;In z%={2gsSo(XILyo+8nmx}xRuO*gwZaZrtZH&w0?mU#%3*-`HC9FeBQr$1Fa78tnr z);igDAQWHmNbw+R+W&IY_ZpV+wSiuJwdp%?Vb3AEC5h(u>0TAi_2-xP)_}QEc__%) z!qhrgG8zjUhR3Nr9u7L|1cbmtK;M;ij?6}@&r_eh#^M2yNA$u!QgSq(*8T~|ShW$S zDrsQhexuhE;=N#^(NR-^qG8&lyNShT!=TIp%7J|(?0zRD+Wb&T+6-!q9hU1>3*14v z@Bax%@Sg9v=<|my*fRCg^UMAp?%p~ot}a;{?*ROw_+Nbxf=PB&ETgK^fJf~XI zgwN=}q3`4o!d%Zh=UD|pceyupzLAn?=u;R4){@GHPS~I zJpIV>bKIFe1k8vs$`Tn3q0;ia>pZewMfqNB3;Af*6?*Q0{`2|T75E$s*Ath|9CAqN z(|xWsyOcLnhufbE9`qpm>cV;TkBrgxg}L3x3uXQmIZL>S}$ zKm5XX3b|&mQWGa#E{j6D(__@XuY}GAyQA0ozw~qCb}2`bnO?%Z8o8Ouf;qJNqr-0Vx36wMw22_+h{90&g*^Cmq3gq-SMUrWg5TlM2AH!#OB^mC%pILt5lX#E*QM>+!Y2AK*v^ z2|2%6t{6fGY%@SQkhE1Yzla9inUAy9a%&D^C}_2l;Nol{r&pJW!owPCyU8o;5$Ug7W%Ng7UTrs1jXIkI({s-gYLkB`0=>E`+}P2wVi+Yf7ru7o&m`X z0p=0xg%jpCo->In)o)JeikIJ|dcus&Y;*tg6W}bDb7&$^bMp}gOk=FY_syLK>65e8~=KKS2 z-tn-s+4cYOB>aAWdcaA8LP>t3I^JrHXfIhP&&RrnPu%uTZZF9TWuQ-+?PSx+0px`G zl59@_4K9Z+T57X3EI>k-1X2J8Yc82qc!u}`AwtXwR_#qdbz;cz87AHs%Mfkva>SJ5 zX`j0f-5Zd9_$wP1WEYur`pKtqaf2a`ThoFPC)I6BZndr) zQ+1;)PP#2Q7Q3KWf5On2jaALB(eR~z;8)}VD|f8tEwRrRgKpl2ATrwabBZzstttU0 zd>Cm_<*?=vI)>;;@p*v{r%(jxl~QCsm{doEvmK>Fb&~Q1_3Xa0f$PaeArpKxAlMV3 zvw$>f*v(!MG1-q+rsEqq_2_yf1@u8ye}IJt+AodD1bb;rt9v0&OW{g&5Js-*Cv+4x z{DN6wBdrzK>d~lFT%ZZ4i1EpvJC^-Kv{mH^SaUJrggvw}LEuWNVJTfhqgTNt;luSI zBwgyj^-#(H$fgQ;hx$qe30R3rebe}~NU?QOtZ4!o@Y8BjLG)_4kO^ZihFE$8m zNewSKSvs_>As5Ga;)hq-&mAfjA^x5Yoo5$6pC2#Z^pq7nDVvR_VHlfzncRGSJl_m& zh#oABBoTsreTG<}_MNHaI8W@CiE3 z82IZCK;HA?pY8vxsG>qF8`WdAAej21s;=7J@{*H)IEG|0sJVVAo&f zlKoiM-k65DJDLh>avxGO=j}^2=x3}U>e?<(-)c2%HiIl+Di@ z8C1U6{H8sDhD_QF0hm6K?u#QO>H&GMzY zwdzseCD&w4!hPpv-rB2&Jw6f_&GURzo0ieQI*HufO5`x{#+}TLtG$x6t7czqTk3vH zAN%eFH!W2At%B*ZY-Ea<4?})S!6^Yz!R|@#=5T!II`b`%!cW_d^8-Ph!q zkNT3!U*5W2ha3P380fs+ZE4@4$@~HE-B02677XaBy`Gh6@``(~B#{;L!)QbyYhrE; zYll}KdG8hq18Emza3=I(NSc#RbFVYas@Sn3^7 zfOoSG;zrBnY;T^_@lfajm((O`<|`URPO1(u2x(C%BF?12n?C@(^!g7$xF#st%oo7C zRp`ptW^XVmF}K72xPWM`l)bWmFSD12CPqqO0Dv&Cu<%HT2yl=;DaL-6G={?fkt<>1 z;Iatjpkpz!DjGWa#$r>ju?y7nOv95Y7{qO!L#r9*zJ5aqt#BM)`)y|H;?J~67$A@z zxC1)YUpBVFBZXW0I@0N?Y`4%zJGa>My^-p^UUpfvt{>~mr>SRmhD?ZgSjEk+qw{#_ zg%t*)cHF@1)%Q6QIHfac23k^M5J^p6OFCu-N;6P?d3Swc3f6~MVNZW2u=fnLjia65 zUsWVl>A!~d2hGN0HfmC0g){tf>(~_BxH=f9V@0nR;b3|8AD{k<5BaN_66fe!BS*vf zhx&)FpZO)f5Mf71n)Om}9p_+~n<_xs9=g~UHNSOb9p?yyQxQFrb#_(xeU^mXH#t6i zwpLg(cMiF|eu~c`pSUk}*%swh)mjdN@)R?XArFUGiQ7wsnLtSJnU<^aU!=NkYPzZ0 z6plB+KW=h!24h1Am;BWplYiOrKLp31vETiezb`ML5{KrzaV_p-9>4#|AzD|fpF?+-aD*%laq`mr+(BCTmMtrOp=diC(!k{f@q;e#GXTIKvL{V#a>%bD^eB5QdPvBEWuvv zrjC+mT&ik?Dcu(>3mx_RtBnMg&c_$B$S!lV)uw(+l=K&Fq4m1x)77nX>!B_cXjdv5 zJQK^t?W5T`#;~lGQmwjJ2=HKav%*~B;#o^`uwvcdhu3cZN^HwC{zSKq+mxMV;Tw5b z)~h99?-ktWp-fNKHl6J=nk12k4>s^G=;?Hzj0H3}Lin6+joI?I!`&fFL3}Ww#u6fn zz)qkU66XW6_7kJSUHLpAX-=B^X0JER?aMu5IJf90FIlM{j@APo=t< ztK4dmS2sch-=pSMOY|4IjK0Bt0eal}=t=wP2-bIId}JG*VoDLZe+InO7Rj3=7Cc;s~sf5%sO%P>rqpj39?+_%pP>v?*`qHJ>opReUer65X5W~&oxvL5*XnR#RpGO)(l13OB zHtKiQj^h?Z?XQsEZceGx_nPIfvT<;$uT~VxhcYB0tB#S+9S(CST_L9hEmcQqeTkdO zu!%qr<^2WSfTUy97#Z-Xt{tb9zgP){Sa*g>e1E~Vc~vJ|lB$hsX7I`t!T4!b@;B35MXuxuck zr{d)By|=-*WcOD)k&g(VbSlaYB_3Ev`{o}2!>#tlPx`Z?yROxXjyXc>33#HE!B5@M z!-DC)EC;!;OM*Lj@}trZ8Wped>7VJLEDEo%?zH5dwHFgs*hs<<4Gul-xc2IV_r82& z@m9Ff-e7vaE07#a|2;$&;OfcTr8GZcORf~s*o1>S9GlVsC61{>uKR+k>`AhDp_y~K zCo6J+u#Oia7pZLCQE?C2`51jBe2$iODJ^}Q^OE(F9J@l=;Z1g5MfR2NuRQVj`R+0VS+^wGmHFl0L3eNGU2%UkZTG8jcps%OUS%>S-SqB~#1P=m1 zmxZA}zh@l`EOhMOIr*5(tYj1dN;yIbhOss0aIe`69EBZvrZ@kbVqkwyF{?2Sn&e?5 zM?9ZTViIE69$&Eg7P35-PRxqZ2%eJS?%sZRT70gP{BpQmV6s=I9P_ox8>SuP4nD`( zpzBumsRANiseWrmN!*|k-Dch4Wdg?ieJ`vjR1+iOKU(O)w8Jg6o9X8GC1yd4cT&WP z&n=>1QsO8BDtBteNpMPeDtE>f9R-i-h|qd#h)Q6V0g4;bZt5-=l$@1kNV-$u?TqWhJ|j_>U^-wfW3r)0bLs(_!tXt|%cgpXcD zDpnf~#fs~LP%%QI!lQ^k`0_(}#UwBEv5N2D#XMPQ9k%v;uNBE#Nxbkc4O#Q@bNfqt zMtXdN#uwtmYi-v^`tY-6y+q#^L@|7LcfNx#bnNFWjfQj{lQZX%U_R&J7L7rK?$CE% zBm;*m!l=u3l~uq78`cJAwJEfB?tW*|}*VF3e`Bn)cH8RIRevR`7%4qgTow z0HiTzXX3(M&sy-w#k}7}!1p!&O?BjF&e3_E{yn?%zG3q*3Z=A+DQfYMF(B>rcGk2y zVKr^_Q)Yom;LeSXLwjavKGWM$48w!TQjA{)>M5yQ2VV(a*SQ8G^9c@i%f~U-8z!Gr zM^T%O;eX`FvLMjxi0a#XWMlWpmqd1|mHLuR6+~_P9D*w!pK&^sO}Rgi-tV1=L z)VpT}GFy0uNH4J~TOdWn`_D9pW-)FV6w9V8K3i&Ka&R4BBP>$e$W zwV4~(ZI|bpPU%?uYFaW@bs<13gTf);aYj)jKum_R-@FOYwV6_bq3=;C)GSOSgr52` zu#mp-e2Pk(axhn~-M+871GI-&Ofb-SQd(TfZd@us`709Mnj^q5Bw!O^Ny1hhtf?A7lJM@0ziVGoi;fv>}iyiOYE>lz*#KLWZ z;7gVQi}xG2J!WH4DwRWT&>o+w6=x566Z}@32t%?NZN>tojYP5DJauoM({{*w0Tv0||3* zBG1=C#iA62I%bEi!Gg@uhAuwe{P>&!r4eR?NFjmJ`$?19Ruar?Fy#R3_kgio=Ep|q zGr)fxQqV}t;l^Yn%%#$U*e$pb0UKy)>Z1zd14!~gDDLz z4Sj|JLuzRepL7$q9R@%QB~mC@@@_==kO8z^aqQmwW?J^63+blI3;he}*$7?MaLx+a zdutcaXY}1zRzK>^-i3YsW0&Nv;1iLC4|7`E$1YiR+lrs#1qw_Gc3Q%gzfB+T|1uOh zI;79=%vwr4=1bwEa#l+_KV%_xbQ5Qa1bkw3S5K61#O&LW@%;Hs*;tA&4XC7O1rcvx z^XP`7bIcWHZ;!;MZdd_@SHN<4$gLKR*T2bwu;2$$QwsyI^QNHRTuZ0O0JWo1g{5Df zai_uaLIIt`t*@Isxl;sc;aw7VTEqb$19;4Cj8fD1^BQ3vB|r}CNKPMh4$X9JFL

    ^ZY14`NRC}W1puiKQ#U$3+;sa$st^o}r>Wo5nw0_uR2D^RAAbIs)SH-X3 z(;{v91d14^*Z~4egymR4y{j%w#stco381i_JyIz^+=0}7Hdw|YoMD^SQjQW4<3%($ zWD@;407XS|Mc2>vyphO0t^OlrhizwFk8eAF<_Q4j;jm#M_@Qi%zecXE4Uh$%q-@#B~SU6^=F)HE18nQ4nAn54 z5)Gyi>bxj@1@VGbX00Ca*g>KmR&ZqwHf`oQk8v*Byr~=l80n zf4rF1AtC1frM{Z@YxhgbWMK!T+idxN&>9_-|FQW`P5*=1-`r2I{}oYX{A0b-9QH57{PIXr=<>WFIHT$YVEhGMh1&SIon^Y$!2V3 zi+BU#88uU-?Enz9rk~bL4vYZ(so#yN7R-fe8|Qmn6L6VgOINoQHwe|kl%ZvaIt_g( z65jCjrV)9-U8HF-W|ytiKX;pcj%bzXRj zE0k)BGtAhzlciY5<5B(_{zX`I%mK8 zg%#U1w%3W<9ye|`c7JFSnhjT}N!)&5&2~V{?~aa_FzM@+qPU>`Ab*~9T+n$8-;So2 zLD4L)92mLx9ySm|8TCUlDpAjY)-Kd(P~8XLZ<&!kT;0AlD&-Ty&$T{4Y=Qb|+N#|L zd}c$>SSSom)xxT9@v;ei$+WziW`qb!xcDUnolL;j;8Dk}yrCWB`bp5>qObfLST6}M z9bSIX;VpuQjzjarO5lEcHFT@2Yx?-~DX;1)k!@f9{Gu9?Z&Pgc4moW-;Rl2dM|~|1%aK=0^hmFu~UdM(K>iWGGsSxXOtFH*@%D;Q<28E|558)!NXI(nV*C6zl^G zbJ{!u=Y`^(d25IkS!yfw8{a9X8?k7y&iMkLBo3pu+`a*C6BtWJ%T(Q+@!(%wNWE7y zn)kJklgtJhqW8n-(yIH0%p@vQXe^|BLZ=P$ww(PuuyLR>qXI$4r!%m{K%$~`1kHsoBMs~!N z;gRyGPsZiU7yD*yfc91bIoj-?7=JrN0Z|%tSEHJJW|qQi2`yPD#1}xBw(}bC`Ui7N zdCl@+Jip0kETJELA8yTCBiht~T5R;{>?5l*xE6AW9m-U^uJO{^9Sf=!V@dgt)XQ_FGIym zfky|VXr=lSQrtc@IuXGe;zAr@IiGgDxJP3hj;Zu-&1E0Nk&q*Rm`_M%fzm%IqvMSSff%hY z;IXe#4v!W$lhbNtPYb%ca0ryQ8f-sm@XC4ubXjt9w5dTty+G`xISN%%%Fz|o?pbtn znvp2UAut1>LqTx~r%_@*k`)s-nP49-GAfGkM`yU>AVrukNcuN;+xw9x$7G7l1({B| zXKd;wA-^n52d&<3E4&sezJhb}>_|>Ru|rS@`ruo?K0!XTGKWYFruftGy9=)Ez8}$8 zUVO6uHkI-ADW-3?3F7#@8p=A9Sga83l zD}Cp6zs1sdFtL=j#gLD|G155?6xI>IBmSDQgoiqXgnhcHVhU1aGdOu$|V=3+n zfsbH3O2Y2o%8kNva;a|zgN1pf){Ec1^nt#Nq!D8Ha2DW0YP&M_zJ-^L`>fK$)=y)S zQv={Bttu6Qj8Yy{lxY-ljNh};Q@u>())&ycahVU2dkEkXln@o6fknIG4N;T z^YbvOvCDjFC{~xqu!Jp|Y>-Sn24%qH>e&O%AaOY&g*g`CSOIudglS_~+iBB^Rc}X* zaC`Ymk_ZdNiq~Pj#fV4txWg=}Ym~)gi;6Y3Op4gfxVcHvGiYg~;oQ8HjQ8(K!M!;ZW2)zM+m5z#3y^wP!c%GQVx@cRUtZ2 zs%x#OB5OC=76ceiHL##vZo@qensVYzfrr`tn%2gmZA@Xft((cFNO%TgGOzh*RNnx8 zUyVEu{mbZ_C~<#rLEN=3nr@HmhEQVQbhOm`)pgUDNO=!@B%V&~;d}O-yCh#C2iPR5 zt8O;}NmIg6ZL@PVC7)MfWVwlFIZB&DC5Mnqoq{^#aUg(I+W&&R-d{{Wql48Dqds;cw3bgHc_|IpwR$n+$IUeD zh)UJ1EC-A~bq*(#Gm3bi3ER6oBhCr?H2>^YueQOX(y7A~V}83RE#77bWVSJ{L8%E# zW6)sX4J=Hv{QpnQZA5=KQ-~^)7>cT&Y7A=r|Cp~U^U+;^&EPtf^w-@#@GP)duf%UM&nzDEzy&S^E8m}dII1qx* zIQiT!wg;n0pyDXw;ZuWF?@shMY1lJ~yS=_zIkj^nV^Z~f*)LR`b_Zw@-|&MR6o-5U zue0UNx&NmT)b_*YKV5J|{l(LJ^P;YZWfDnl2g` ztDYS)0$+eoU?Qz%j|YyYCl}=a2=qqC?!4~1{WTS4mZviq$u4H)mRe>F|C%|>9euNb z-0~B4NxoXySPjaSzpw}iU5#l|;y6Yc{?li4ChB|g>tj?_RgR=t19~TN1zoHRU(pq- z!_TxAB;*Ws(g7pXBli$;Km(&tY_sFuM3xq&w@szJ;w3L<7ituXi9E1*% zkdQ$I?zC)~d#vPd2Zf&0E4-GoG}aqwa;eFRTeCh)wBB}xW0PwgLOC#9P-<0xR&f#C zc&d zG_R!5qM&JvJPmeG0;d+zS6e6ly_WOCj3p#o5p$;n{~fg$4Ylwaa{s9fucaeN`Ip*K zf^4&LHdcp19!V?SSpmfQF(&bE_^`?f18Ey9zA7`{eJ}#Uq!>#d7Q2D?`ot?P0wCD( zzMP$jt-gg&c~`?Yz&rNh8zyb#oa=rGdVA^x+$sjbJ2)s~xJ9h~R=39B)R4&>?uZ&V ztWQV;E;kihIgK_%k0dTv6q@x90HQtgVyjmbOWVPQ{5t)b1n^ZfeR7&QCk~WeF>JJ_ zcf`Y2`?`>Oms#HBAvD6GZJI5{(HB{48fKe-QM3}A9e~K31Iq^T5TGa&Mw*yy7174P zmr3iQ?nQXzk!fU0En&0rjTJ@OqbpA5s-$gR5G56cZjKy1&G#M67`R~lo;yK8)ImK) z0o#wNev2^1La!HmO?FniE)8d0QJ*oYy(l6QNMG1-F=hS8?kO)$5*A{)6yhm@LN zd%()1qKb-boe@>riS_i(vY+t8n%;-<T_lBz}KSR_KR=brFp)4W@2o#D5il}B4m__2;oQt|#cTPZpduid* z_hF^v>=Vn?3;8immdg`XIh!f2l@JGFY!2j3CBxA&PNDVbC5#;qyACtlZeRRz^MO2| z#0_h>mB7Xlc0{Q~!tUZ#y^)UsYU{$QN}mdAltbhIU642lBfiNSCFq`)u1_xiiOy^X z7DMWM3c-XS?(SV08=VYms%m}#n=>TI?t;h~+j0O$D`fgbL?tbijYikX^e$ABvc~N` zs#WMntqIrx4ba`pWRJ5&HNR9%lcrtplT5=0Q*Gwv)diDHh$$6*Y#FytxPs3gfW_B* z<*o-5C>ohv>`TgqvVok~e+mQ(b6wLv0E4o++jlAn+fTG2E0T+v)rH^E!8SBd;onSZ zzr-z6CF1~bRf^Sz2t7=8JNvSczx{yqGfOk%xJ-e{{7sTYweu!%0{w@3U+a>TLNydc zChuLJdIU~=qnkefj%lgCx>l@!*R&sY7#oOtPSAd_qglRVj)oMYwP*dPg8%aK3%o8) zSr4bwrH@rbSEF{hBhOW`y{V??567i1?5j}7{W0}W zt^pAiUXBO2SmK^x8~T{mjYE!jQoZR3u8`!ikFzA>nK0$g-l$S+^8$E-JNCw8^0c~U zWG*|axUtIOy&nPtvqE$U(iC3^?F~iq-XiMybS)6R0@3M)XD>^SsTAjvZ256VKfT_~ zL0^k29qxW^h0;4fIqFS{U%AX?yJBpplwPI>{c?a&fsG-n<=2PtRjMm~C8xhN)JLG2 zo#Y4K_;zcWFxmG~?NLH1vOjCa2t z_9tV_+Pru5%dLa0_b$-|Kh5*|Qy`%_24+O#rEp4&Blpogus4ScAomd4Yj;>KaU8K_@&(P)PV)>K&Rn3d_QL zW_QEf4el&&czbo90{~gKP4l!NSzp*+mY3uG>>BiBs|4Qsit1q;fd52mMi*iQP5gDl z4>TraJ57`u(K9L#CA-DO=<8k8yzFLR&z6%>H}>^_vy0yh8KeIpDo8Dg&FEOrq4}Og z;G-|DD;?4F)#yp0D7F9uagq@a$AY^y5^jAOH2+ZXEsYBi+?x06BVVJg^c20HKFY+6 z-!R;?U!JW_pyIR!K+831#p*_FR3TqPC=Lb%Hn%$)RDY>6A?|sZyWo$He;A@L!k{U( z8|y%uP(IPJrnTv6WR(#j*^j8I)b0SX)DDX`c zpnEL#ir7#U{nNg0q6cRMSWOKUQO2ZG!&d-eAzga3u##q}l3&Da(7U!24I&1&mzGwr zq?4c|g=TDr<6#{qK1DR=@v$(*Kj6GX9T2535+LH6n(zkn3Jb^L001grg7i&!T`;J~ zmrjCjI9FrR`TZCd(BG^AG7$L0S2V}JME8r5d<5rLI~gMODG`8jBsFxc{-Z`YOr%Dz zR)rGR=L1OD8b-XrFoIQx#+biSxE47rxGcjkyQ0zGSMFs|?3<=QLtTPS-=Gi-C3~Ww zI&M)!uBPx5q4Emd76Jt553sbd)k+M?Taz*oHpcXuW9KlTFf$%w1R;WoL@|{&OU+Vt z7y&xBY~O#!*0^w(X6bbJjLgE{dv;4)iH}a@)kT5`P{5pkmocO53Cwh$Wv1l>0T_zn z_OP>30RY3FC5pxh=)9Ocp)$snp(PgnQx%~rpaxTpOWjUJA5Lq0DzJ*YIHonsKy(;H zfYnEhfu)r|T_?MgH16E*mr$bfE8XG8cOJ{COu=m+qTE9F2*P(hsvv)Lq z)BV##TF-<`%JTJ$rhfEt)(0pN&i*8X*6WL)^xMuQDc6A~QS(NuuUa34BLy(6VypKQ z!R2Z`4f(PzkpMi4ojNfz|2bxZG+JT#v9hSftkS02N2r6p`pNp>86d6NQamcWaf3{h zBv@iYVND)HiqMejpL6jr^c(Jm&LI++XWHz-qF}Pzi6A2DtvAv^ETxi7P6|)npRACu zb$xrrq1yCw((@8}jx92BjNV4v-lj3$9PN3w)vZ7M`)6&k&92;MpLs1Kp9A5fgAG=0Eq(w?Pz7tEb9B^%xI7Jpfj14%wLt2%V%DiWqK$5BR|?s z*;iT@$}LNwc`Ii+&5^_{yUzb2h6~I)O*d{3AM4xw%Sktn!qa;*9UWI=S)IqxD=$s! z`9U?$$AQ+4ZC&-<PP9DQ;7%%CKhOgME_z!Y<7>!On|zSm!_!Dm9I{)W9R&=CY6I zF0WG=-!S(roI4`v@R1Z@8d(c_qQlbDd$?;@E7VBsF-gyxCnJi1;Dd0+#?FY#$c`y0 z6V{qdS%hJBc1JoW??d?5^k%S8XrEusFKo6O_obbX(lzO0FA6JQa~4c zoXDsf zHMkAvnjweuzS2yppkoF5r~Ri8t1gh4wj~7Z&kn#;$l z|2hc%>&6yl*O#FsHZeJ1z-ZPqm2OmwY6>%qN1tOcci4ie0u6Mi9CH&S%8DUIoa=@6 z#5sik%sow90B#Ok_l89m>wk*$KaK4_47Hb||7Yd0;fLLz4q}n^x6K)^6Kj#tDaa!G zzT_r?wPHXf7Q=6zl62(^PZ=mdDzvvlu6|Rqw3W=gT8prvbX9_aK8C;_E*O~(2E3@% zuS~NQK-@+(%J}kb9zW0CukE+B-@0Y~yjolLY=b`d|FH@AOhSs95BF^XhhG^@(-Nak zH^AUeT`OCiJ2EEpr09OovCffMc5Sg~Mq5D}M0~1!# zGH2ne_8ox`?K{9t7Rp1z$g?6F znCogaWdZ|4oXi@(QS34*5$RIJ0M5lwDI9T@zn8E0wTS8aVWIfE!Pw336SkcScklX| zaZHLril@r-;7xrEX!goq`NRaMS41mFI>t?BE?5ddQmT*vI)!aJCQSQhC)RHi&kY-jpB^34kGd-= zg7LbQ&Je-noC&NF8A?7h>Sra&^WsE-L5M?0QkZXmBjgfTM=#n=H@Vn&@1$ncBnUyQ zmeml}{36G(GDNN2uaxM8?A_Q(2E>3akC4qseyM32%HWjG!4_xvit!V5EwceI%upbb z$0XXp&|VQ2uF9}8<=ChXhKP=TM0G#`z!V2A+i@@>a=Z%o>Hp|ts zTp9uZJxBq}Ky^L`H;!HJ;CK8GrP2%GksvgYZ-{zz7pUZp0{NCK`2a+fa?3|MSMnM& zXu3Z)AVrQq`}6{?FiZ?Ud5`b+R9B!43Q@vtNu3MsO#>!@Qpfc4Ptp%!Rj07*($3r~WW#xlvV?wNV zHJF`2l?KeP0Ea&S;rm(P^WI!f!MuZ`V=(C{eR;MePw-xLu(o@V!b+*~mCmnYxA z!!Czs#V@wd$?;^Fp9M@6Zg0|+pdDOK^@SiUdEx6c$5SO5cIoT;g8Ru8k2~%URl6ms zW|Nq308?XfpavBJLd@3C29dwJ5E1$@_52J{@N1oMU(jPop6plXe#X|3RJT z6dR<6|070-KGXVv>R)I)G|5c6eP_m-#K$%6uqN+NP9im zRA_~eimAa9K4$hj$hM_n$PJSPuf>rheos0lqpDT-IciE*$*|}BBJ)#A`I_P4D;=%& zHn=onQfsX6%>C!I!7XC6@&~pD(6co$@`KiBR*ufw7s_Xhu-fYvXu6f<3GPJYqTtX` z7UZS0;MKbd(qnLVbA!i$pgD3$`n|81fs#NsY`&IrWnJL;{x|N$b%L26_lWm*9d4Ix zQKj`TzA#IArqk04s}u4A_LSKmsb9$MF&COB!wBe+IQ94 zy>F~k-Hq4;D;mfUbK;cJmEH^~)6^-o%gWPKed#Nwq0eb}RUBK4=sGKD&5t!=jtP!* z*KJ+hwM{bH%2#kvt1^l96>9!&5Uyw<7&}t`b!C*nsl88FWgl_hQ~AOCn*BZeO6#}4 zq8!(*lRPp1Fa6Kee*o5${Fbcf#5SUgysCZM@wEl$5^67>Xh;RJ^}c~|j4gEA;4Gts zC|1k2xs5cK5#&p)aOHd?nY~tJOY8Gut$=nz!hr|0aac5iW>gA379U}mhN^f4KywGa zJ{OT?2?MS)F~w_qwl;7zhMNmjSU!z1Z4x_d0Ux^&HS1i9WKIrB zWB5kB(2J0j*n$shQ|Ug_X|6*i=7|PQfaL&`NjXm{>Chka9!S)p16`kea!!b?iBbKv zo={B>i2B4)8Wl9umZPLHQ7U*2mU5g4tQTk~AU@1}B@o4x9(B^_IkJJy6rwGQ=%CY$ zZHuyncF>Lui|A>25Mm{O>)2jLQwJ=??vI6=LhO{~u`vMPu9Ub-UD08df(nx6yDk*3 zTrQy@@W+=_dtbThhEv?VERJoeK?w%pPvMp_sroKB--g!k$%by($YU9~r(^Z~FKxuq zS)an)!=h0%KXEdhyZqv|%u*0|jBYhD-`#E|e^J~Qr77o#Q(j&%e+)RJn@|ExCv!ZP ziV(Jrt#lXkAw!oie8&W4>H0&6yDp!u56%G`eKMG)OB0JbI z_6EVc*jc3c!Dd=;u&Ji;#IEy)e;h;{_rngO2AS$YTwYU$unWz@3tgD};Aj$w`Vd$o zt+5z`+!m?>tKm<3vVAn5LYJ2qZS_UXW1i{xO3f2ge@Gw!v|RTC$qHPMLhqVk6YC{8F~IJSdv>%;qaHCsXQ^shs38&C z)O+G;{CN+WJb0i}91vH4z;FpaICy?I0}9eY5(OH5&{Qmc;U;((&4nI`PB; z8)+3c*S3*6z!+1htnak}O}XO-QD-nZhM-8@=M>@~VhdcYaMDgrHlgY z&wyt5oIKdvI^xjj!mq03i-YKF-vyhL0_DoJdWWRsNtSyB<9e|;4#so>VEod?_J+S7 ztYJ2XYLNx7gy;hMLPr(Q?q58*x+dnXINzq$@QsJ=*~qgQd8A{FEoGYZ{cmmTC8HXE zIYTBlZF!FJGB5H~ue#?twR|I$YD=keKSes7LP z;z&K#;|GL$Z}Rg`&CX9z?4ysj>&}N&l4sE#14`$nT(@kxlv%9}m2bQ1H=Umr^EW>i zc3op!RUtyRCb-50*1f4pm%W=1&Fm=kS*=w)>7g z$BfMuPF}*Mb@Qn@JIsA{D>;%W$|v;>^${YQHk<5{JM|3lds(?CcLKwOql;i=6}Xa5 zvDOU0T!^?vEX*jvs0nwmj}ii8YCa}GH@0sWB{ZNJjvLZb_)}PTH46Yk_gGOPdgOF6 z?}@y9x1Z0DryvDb3nkQC{W1I~G_nMx4-(-5Lu8??>nts1*t!Bt&M1h#5evwcPtFF_ zKBROk`Exow&Hb!cxPkyIp_pwjFzDiYgH||eu6wwvsTy@{j|bYf0@OpZRvHxBpZbeu zNJ>{^wKMlvxT@Rq$w7ft+3aMinwD5MUo68-+f)5vCy;~z$N&Wdrtd=iKhSIAVnh}b z>RVAI52s@KmT|lbTF#dAKyxz6AuMLt8m2tt(wa``zU+BYCg!YW9(wj6V-v378^}ZX z^of_aL(@>&DN@eGM7OkDM%)TMq^7+e>0Y+?zXhrdPxW5!KZ?KfdD;A_@)wcnJ;_PD zv0b_YRV#;)Q5ypW(V*C-1{wH~1y(Qt1bFgc<@LcqA*ObP>IHeG!S>k;?#XkT|Tj(6(R1I7&qX8+d z2c;e%SfQ*b!wCsdYSovf_3SU(&n;F{&u4?%8Zt1m8ay=!@gEKl1nO(X>v36O4GHjY z)Ngxr&D4%X3PxJZ3UHVta2CiC10*yiMmBe+&}I5y5bIIMO1WKQgbdIjZ8Q0$yTk>= z*`P9ab1gn=gtn|F73d;>son2H7^yZ&J!WxzQN}m({!`p#5zto2o+63p+de*o;5`neB) z;{Xke*MX(M?}}2zqFz}DmzKt!pRC4g)q=?KCD~0A8Q6gUVn=fWL4%m zfTh!eud(1+skrQ5&J_%q@l-|4P3>cOGoy5-p%%c68|ERBDepdE-f7Q;Ldf6ZRRi_DfFqBVN6jhrW%Yhap2F9HteC8Z7_D zk~YWB;0v(ZMf9-Hh3NW1x|+x!eGkl-Y2ul9GeB&?fvYO7jDPD2_quC! zcqKwd6#H~}Lo!_qq4}t|dsTbl)#Q0h2x~2|0F}-78w!6`+3&9vD|G~CfQ}o0A=$Um zsHm`17R|;3Ibk#z!k9W@E`p&>Ma`Pg=^2H>RdIw= zHl{wu$F1CDEuX5%@U{gYUM2Ap9y9~7^`?V;Q`nB9>Zr~{P!6#U1XX$vSUVsUz&v-m zO57MYi}i_!paapdgy0WT+&9=G=>z(~g4{Tbg-!xXQ#HUwOD}^(cD=Gy>6q%BoeOGxBJ$K!v#m4id6t~F3bm#_YabcF(L4Ty z_7KMEd7GJfH{NgGx*IWH*o;9PysIeoZ8{E6@D6C*GehCb?D|Gl16mf(6mAirF9n;> zrmuk>)hWG0BgreH1A=q(j$B%YpT_w#Yvt|v>s2cw+9M#)|fsKq0)!c(0l&4!c6CkC3t7lt?j30J6~4GRrMD#R~kgTsn z>a6}XLO_WpF(HM-u9^J1(h8go*6$0$0fyU$a~)+Q@5T#6=nX^6&A6w< zSfYhLQq5W`i!rybCh63(S+m38%4Cqsu;Aj2ROdLMLkJu#F*GSc0+)27zN7 z!XP%Qe|q=-1&$1H^U)Sao4RNc*b)L}U6^yVs?kYyX9H!6C%s(;#)OB5aMNl(9PK@F`UL_66q0^b&4oqY?W=w$h6Svge@Tw2^VF! zUxg(Maf%CHH~_J%(qSn=;?OSPgu{l~a^WB`Fbro`Dj-aaH1_K{QCkrlNz(kHu7hLw z4nqu=PSx)6SG&nx?jdbUhgG)yp^*A8V4Hpc`M!IuXmEY-b#lHy)&zm z=;L0mC40P;?($IRpox{okL3gIlSS~UCMnviSfcNkTWNnuqtHhqy&7BPr^O z)F>g_GtxUxrA6e%-5EJjnl?u=C?STO87j;>N4JVbULWU)b)?P5ypNWWTZg1_q|L_1 zDDg@V;rx!>s&yyv_@Q|ZkD4Gs?BhbQo;>Hh24%gYghXdfRT zzAS@?tx-rxH<+A5>@7a*t4r+pr7)bShKm>2cl%LM_YYbIBiv`HQeD5QM@vyi(d(I6 z28VCMkKmVV9i44~oB>8QdDu2%x`b-cH{95jy-MP>g-_$h>L8mF4y0XCP6c}~I6IOp z8#It9dlKW($$wMIfCV;p`NE9n+#lLyHy?OqMZWjIB-}8A2oPgIzKp7 zYDxtJzRzL@@% zt8=U)J2CI;x+zCv*LJs z&XP~9vo$CukhSA6j>*oEiwT<>MjBy_9NK|3?p`OY5VjF+cpmPdHx`K8+l6z9|f6ANAXT_>k zR~%_n*!cDDOeD1`mHz;uvHJ+&r+SiRHuXLk-a1qk#2<_z3PB^^B!gao);|ORl4aKG^HT|Az-U5z(gss9+$flARz`>F z84jbr3p!egR%Y5DdFN3K;-hrLJR9`Nh7F^@aofg{Rk0pS#ad1&6PbCpYH|<#XaB?i zD-i$z0s{vF1pxs800000000315g{=_QDJeRvBB_xkm1r01<&>X6T%_iY3W5 zzKnql_8!C)9M*1HI$_i#8~|^`3pT(8LX1f^p3oZAMZg=RW11`snI}W#5CTlK0_P+Q z>HzBJWKIbcCvv+Nc4Xom4`Ndhg}%U40Ac*Pbm`NlPMtrar%s(Zbm`Oj$oiO@oWTgQ zasL1i0%6FJvH`#ZZWeU$Z$XQdaHBITg>;^xaty8zN=S&adJCi$9>CxfCuMZ571AQ2 zxby(jR|%2|>0K+Obgq@s1fsZ3Q4N6fD96$2tU1R_66IBdCU6Qt0MWP5*bo5VMg$2< zKYdw~t_6^t-)Mw`Mb6Bg06zxOK#?6wJfoZs*3&f!Wd4wKAv>pe7hg6TsMLbs(kQYx z{dAM5z3sQ!0Rd?CqA@Ri#ux}806OjVi39`@CZQ?k*2M>^**rR+(%xoyY*Xm^_(Xuu&N?NFa*FYWr(&LM$bqQ|!xEe` z^372VknS8JK$;<)Th2@&7=-Gr=_q{QSb~TUZ-(2VU4_k?{&lrR56A#?P(?_hQ(u~n z;>OhOfnuzp1<810ut41-{-FRFIX%N2Q->UgI)_9!BGhBTuAT`twn2tSiyodC5bP)m z^|zBn%_I@0g#it3`a1+jm*sqv&H+pFz(yn+Khc|qp+Z}QZ+ z(cwia^x;nzyzS#OAOPnXy#Z;IZ5!GY)B$gt=vV=Dju{+sU%BI0mfEq;nLJV;| znjYBH(IA+(ij2Y=+=!2^st0@Y8~H%Q95hS-0Z3ywlpV=Vd3b%Dm~{SuV(2q~mY{ae zoB>sVh=G*yQ)ajup9+AyV(wr%1neB&@j!SWO^-)yP%QTdBolm)aj?!xq9tKe*Pb0i zG#9if(K)drLY$cN@)djT@UPrpxJ$wyhI*eQ0vs4TiL%maSqGpBzy#XvxFDpE^)i4`L)^SYZsJNvQ%YK540c{TK6CT5csa%`~LunKp3K^S5CEuYtWDY#J9F4rxVBo33oRl1R8;{ zyx@Q?N&LAnbsuEz-9M)e1dsp%2j?h^SRvz$*-^Pf$0T#NGLZQ%{+JG6fR5)N>EGNV zNxvxOBFLQAGl% GXaCuGE@`y@ literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/index.md b/ru/building-sites/client-proofing/security/troubleshooting-security/index.md index ad63e71e2..11d19712f 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/index.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/index.md @@ -1,6 +1,7 @@ --- title: "Устранение проблем безопасности" translation: "building-sites/client-proofing/security/troubleshooting-security" +description: "Что проверить, если доступ в MODX работает не так, как ожидается." --- ## Устранение проблем безопасности diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index f0f21a982..085dc2d84 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -1,29 +1,17 @@ --- title: "Ручной сброс пароля пользователя" translation: "building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually" +description: "Сбросить пароль пользователя MODX, когда ссылка для восстановления не доходит: через API." --- ## Сброс пароля через правку базы данных Бывает, что учётная запись недоступна из-за утерянного или забытого пароля. Часто помогает ссылка Forgot Password на форме входа. Иногда пароль нужно сбросить вручную прямо в базе. Нужен доступ к базе с таблицами MODX через PHPMyAdmin или другой клиент, где можно править или UPDATE записи. -### Сброс пароля в MODX 2.1+ +**Пароль нельзя записать в базу вручную** +В MODX 3 пароли хешируются классом `MODX\Revolution\Hashing\modNative` — это функция `password_hash()` из PHP. В базе такой функции нет, поэтому значение поля `password` нельзя посчитать вне PHP. -В MODX 2.1+ пользователи по умолчанию создаются с алгоритмом хеширования PBKDF2. В MySQL или SQL Server обычно нет функций для таких хешей. Поэтому при ручном сбросе в базе также смените hash\_class пользователя с hashing.modPBKDF2 на hashing.modMD5. Затем через родную функцию MD5() задайте значение поля password. Пример MySQL UPDATE: - -``` php -UPDATE modx_users SET hash_class = 'hashing.modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; -``` - -Чтобы пароль потом снова автоматически перешёл на PBKDF2, установите [pbkdf2Convert Plugin](https://modx.com/extras/package/pbkdf2convert) из Package Management. - -### Сброс пароля в MODX 2.0.x - -В MODX 2.0.x достаточно записать в поле password валидный MD5-хеш прямо в таблице. Пример MySQL UPDATE по username: - -``` php -UPDATE modx_users SET password = MD5('the-new-password') WHERE username = 'theusername'; -``` +Есть и второй путь: полю `hash_class` пользователя можно задать класс `MODX\Revolution\Hashing\modMD5`, а пароль записать как MD5-хеш. Пользователь сможет войти, и при следующей смене пароля хеш будет пересчитан через `modNative`. Имя класса задаётся вместе с пространством имён; старое имя без него работает только через устаревший псевдоним, который печатает предупреждение. ## Сброс пароля через API @@ -49,12 +37,12 @@ if (empty($username) || empty($password) || empty($email)) { die('ERROR: Missing criteria.'); } -$modx= new modX(); +$modx = new \MODX\Revolution\modX(); $modx->initialize('mgr'); -$query = $modx->newQuery('modUser'); +$query = $modx->newQuery(\MODX\Revolution\modUser::class); $query->where( array('username'=>$username) ); -$user = $modx->getObjectGraph('modUser', '{ "Profile":{}, "UserGroupMembers":{} }', $query); +$user = $modx->getObjectGraph(\MODX\Revolution\modUser::class, '{ "Profile":{}, "UserGroupMembers":{} }', $query); // print_r($user); exit; if (!$user) { die("ERROR: No user with username $username"); @@ -81,12 +69,12 @@ if (!empty($user->UserGroupMembers)) { // Add the User to the User Group if he is not a member if (!$is_member) { // Verify the user group exists - $UserGroup = $modx->getObject('modUserGroup', $user_group); + $UserGroup = $modx->getObject(\MODX\Revolution\modUserGroup::class, $user_group); if (!$UserGroup) { die ("ERROR: User Group $user_group does not exist."); } - $Member = $modx->newObject('modUserGroupMember'); + $Member = $modx->newObject(\MODX\Revolution\modUserGroupMember::class); $Member->set('user_group', $user_group); $Member->set('member', $user->get('id')); // Super User = role 2 @@ -109,3 +97,24 @@ print "SUCCESS: User $username updated."; **Warning** С таким скриптом будьте крайне осторожны. По возможности не кладите его внутрь document root. Держите его вне document root и запускайте из командной строки. + +## Смотрите также + +1. [Пользователи](building-sites/client-proofing/security/users) +2. [Группы пользователей](building-sites/client-proofing/security/user-groups) +3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +4. [Роли](building-sites/client-proofing/security/roles) +5. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/ug-ctx-grid1.png b/ru/building-sites/client-proofing/security/ug-ctx-grid1.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b130d9bb8974dad6d917bbaaabe08a3362cfb5 GIT binary patch literal 6318 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 literal 0 HcmV?d00001 diff --git a/ru/building-sites/client-proofing/security/understanding-revo-acls.jpg b/ru/building-sites/client-proofing/security/understanding-revo-acls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b21f644a28340cfbe667fdc8b3a918769d67309 GIT binary patch literal 97901 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

    C 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 Access Control Lists, затем щёлкните правой кнопкой по существующей группе, чтобы обновить её, или создайте новую. +Чтобы править права группы, откройте иконку замка в меню пользователя → **Access Control Lists**, затем щёлкните правой кнопкой по существующей группе, чтобы обновить её, или создайте новую. -Группа пользователей может задавать доступ к четырём областям: +Группа пользователей может задавать доступ к пяти областям: - **Context Access** - доступ к менеджеру или к front-end порталу входа. - **Resource Group Access** - доступ к группе ресурсов. - **Element Category Access** - ограничение, например, только определёнными Chunks или только отдельными полями ресурса. - **Media Source Access** - ограничение доступа к папкам на файловой системе или к S3 buckets. +- **Namespace Access** - ограничение доступа к элементам пространства имён. ## Управление участниками -Добавлять и убирать пользователей из групп можно при редактировании пользователя (Manage -> Users): щёлкните правой кнопкой по пользователю и откройте вкладку "Access Permissions". +Добавлять и убирать пользователей из групп можно при редактировании пользователя (иконка замка в меню пользователя → **Users**): щёлкните правой кнопкой по пользователю и откройте вкладку "Access Permissions". -Другой способ: Admin -> Access Control Lists. Там дерево групп пользователей и их участников. Назначить пользователя в группу можно правым кликом по группе и далее: +Другой способ: иконка замка в меню пользователя → **Access Control Lists**. Там дерево групп пользователей и их участников. Назначить пользователя в группу можно правым кликом по группе и далее: - добавить пользователя через пункт контекстного меню - отредактировать группу и добавить пользователя в таблице @@ -53,6 +53,10 @@ translation: "building-sites/client-proofing/security/user-groups" Готово: доступ по роли. Эта ACL ограничит все ресурсы (документы) в контексте web и в группе ресурсов "TestResourceGroup4" только пользователями группы "HR Department" с ролью не слабее Supervisor. Роли с меньшим номером authority тоже получат доступ. Например, роль Coordinator с authority 2: пользователи этой группы тоже попадут под эту ACL. +### Права страницы + +Странице групп нужны права: `usergroup_view` — увидеть список, `usergroup_new` и `usergroup_save` — создать группу, `usergroup_edit` — изменить, `usergroup_delete` — удалить, `usergroup_user_list` — увидеть участников, `usergroup_user_edit` — добавить и убрать их. + ### Назначение групп и ролей через MODX API Работая с объектом modUser в MODX API, права можно назначать через modUser::[joinGroup](http://api.modx.com/revolution/2.1/_model_modx_moduser.class.html#%5CmodUser::joinGroup()). Этим методом вы добавляете пользователя напрямую в группу и при желании назначаете роль. diff --git a/ru/building-sites/client-proofing/security/users.md b/ru/building-sites/client-proofing/security/users.md index 998a0a56a..bd64704ed 100644 --- a/ru/building-sites/client-proofing/security/users.md +++ b/ru/building-sites/client-proofing/security/users.md @@ -1,103 +1,135 @@ --- title: "Пользователи" translation: "building-sites/client-proofing/security/users" +description: "Пользователи MODX: их поля, флаг суперпользователя, настройки пользователя и свойства пользователя на сайте." --- ## Что такое пользователь? -Пользователь (User) в MODX Revolution это учётная запись для входа. +Пользователь — это просто представление входа в MODX Revolution. -Пользователей можно включать в группы пользователей. К группам подключают [ACL](building-sites/client-proofing/security/policies/acls "ACL"), которые задают контроль доступа. +Пользователей можно включать в группы пользователей, к которым прикрепляются [ACL](building-sites/client-proofing/security/policies/acls "ACL") и которые дают контроль над доступом. + +## Суперпользователь + +Поле `sudo` делает пользователя суперпользователем: `checkPolicy()` сразу возвращает `true`, и проверки политик для него не выполняются вовсе. Пользователь видит всё, что бы ни говорили ACL. + +Выдать этот флаг может только пользователь с правом `set_sudo`. Администратор свежей установки получает его. ## Настройки пользователя -Настройки пользователя (User Settings) в MODX Revolution автоматически перекрывают системные и контекстные настройки с тем же ключом для этого пользователя. Они могут быть и полностью уникальными. Порядок наследования настроек: +Пользовательские настройки в MODX Revolution автоматически перекрывают системные или контекстные настройки с тем же ключом. Они могут быть и совершенно уникальными. Порядок наследования настроек: `System Settings -> Context Settings -> User Settings` -Чтобы править настройки пользователя, откройте **Security -> Manage Users -> Update User (_правый клик_) -> Settings (_вкладка_)** +Чтобы изменить настройки пользователя, пройдите по пути **иконка замка в меню пользователя → Users → Update User (_правой кнопкой_) → Settings (_вкладка_)** -Пользовательские настройки доступны только _после_ создания пользователя. Вкладки "Settings" нет, пока вы только создаёте пользователя. +Изменять пользовательские настройки можно только **после** создания пользователя. Вкладка «Settings» не видна при создании, и её показывают только пользователю с правами `settings` **и** `namespace`. -## Пользователи на front-end +## Пользователи на сайте -Когда пользователь вошёл на front-end сайта, его username и ID доступны через такие [Properties](building-sites/properties-and-property-sets "Properties and Property Sets"): +Когда пользователь вошёл на сайт, его имя и ID доступны через следующие [свойства](building-sites/properties-and-property-sets "Свойства и наборы свойств"): ``` php -[[+modx.user.id]] - Prints the ID -[[+modx.user.username]] - Prints the username +[[+modx.user.id]] - Выводит ID +[[+modx.user.username]] - Выводит имя ``` -Если пользователь не вошёл, ID будет пустым, а Username будет "(anonymous)". +Если пользователь не вошёл, ID будет пустым, а имя — «(anonymous)». -Начиная с MODX 2.4.0, имя пользователя по умолчанию задаётся в System Settings настройкой **default\_username**. +Начиная с MODX 2.4.0, имя по умолчанию задаётся в системных настройках значением **default\_username**. **Помните** -Важный нюанс: вход в _manager_ не означает вход на _web_ front-end. Пользовательские настройки и API-метод [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") подчиняются тому же правилу. Если вы не вошли на front-end, цепочка **System Settings -> Context Settings -> User Settings** применяется не полностью. +Не путайте: то, что вы вошли в _manager_, не значит, что вы вошли на _web_ front-end. Пользовательские настройки и метод API [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") подчиняются тому же правилу, поэтому если вы не вошли на front-end, цепочка **System Settings -> Context Settings -> User Settings** применяется не полностью. ## Поля пользователя -У пользователя есть такие поля: - -| Name | Description | -| ------------ | ------------------------------------------------------------------------------------ | -| id | ID пользователя. | -| username | Имя пользователя. | -| password | Зашифрованный пароль. | -| active | 1 или 0. Если не active, пользователь не сможет войти. | -| remote\_key | Удалённый ключ пользователя для приложений удалённой аутентификации. | -| remote\_data | JSON-массив данных для приложений удалённой аутентификации. | - -К пользователю также привязан Profile со следующими полями: - -| Name | Description | -| ---------------- | ---------------------------------------------------------------------------------------------------- | -| internalKey | ID пользователя. | -| fullname | Полное имя. | -| email | Email. | -| phone | Телефон. | -| mobilephone | Мобильный телефон. | -| fax | Факс. | -| blocked | 1 или 0. Если blocked = true, пользователь не сможет войти. | -| blockeduntil | Timestamp: до этой даты вход запрещён. | -| blockedafter | Timestamp: после этой даты вход запрещён. | -| logincount | Число входов пользователя. | -| lastlogin | Время последнего входа. | -| thislogin | Время входа в текущей сессии. | -| failedlogincount | Число неудачных попыток входа с момента последнего успешного входа. | -| sessionid | ID сессии пользователя, связанный с таблицей сессий. | -| dob | Дата рождения. | -| gender | 0 - не указано, 1 - мужской, 2 - женский. | -| address | Физический адрес. | -| country | Страна. | -| city | Город. | -| zip | Почтовый индекс. | -| state | Штат или область. | -| photo | Необязательное поле для фото. В UI не используется. | -| comment | Необязательный комментарий о пользователе. | -| website | Сайт пользователя. | -| extended | JSON-массив для дополнительных полей пользователя. | +Пользователи содержат следующие поля: + +| Имя | Описание | +| --- | --- | +| id | ID пользователя. | +| username | Имя пользователя. | +| password | Зашифрованный пароль пользователя. | +| cachepwd | Кэшированный пароль пользователя. | +| class\_key | Класс пользователя. Пользователь производного класса наследует его поведение. | +| active | 1 или 0. Если не активно, пользователь не сможет войти. | +| remote\_key | Ключ внешнего пользователя для приложений внешней аутентификации. | +| remote\_data | JSON-массив данных для приложений внешней аутентификации. | +| hash\_class | Класс, которым хешируется пароль. В MODX 3 по умолчанию `MODX\Revolution\Hashing\modNative`. | +| salt | Соль, которой хешируется пароль пользователя. | +| primary\_group | Группа, из которой пользователь получает дашборд и права своей основной группы. | +| session\_stale | Устарела ли сессия пользователя. | +| sudo | Является ли пользователь суперпользователем. См. [Суперпользователь](#суперпользователь). | +| createdon | Дата создания пользователя. | + +К пользователю привязан профиль. В нём следующие поля: + +| Имя | Описание | +| --- | --- | +| internalKey | ID пользователя. | +| fullname | Полное имя пользователя. | +| email | Адрес почты пользователя. | +| phone | Номер телефона. | +| mobilephone | Номер мобильного телефона. | +| fax | Номер факса. | +| blocked | 1 или 0. Если включено, пользователь не сможет войти. | +| blockeduntil | Метка времени, до которой пользователь не сможет войти. | +| blockedafter | Метка времени, после которой пользователь не сможет войти. | +| logincount | Число входов пользователя. | +| lastlogin | Когда пользователь входил в последний раз. | +| thislogin | Когда пользователь вошёл в текущей сессии. | +| failedlogincount | Сколько раз вход не удался с последнего успешного. | +| sessionid | ID сессии пользователя. Устарело, будет удалено в 3.2. | +| dob | Дата рождения. | +| gender | 0 — ни одного, 1 — мужской, 2 — женский. | +| address | Физический адрес. | +| country | Страна пользователя. | +| city | Город пользователя. | +| zip | Индекс или почтовый код пользователя. | +| state | Область или провинция пользователя. | +| photo | Путь к картинке пользователя. Она показывается в шапке менеджера и загружается через медиа-источник из настройки `photo_profile_source`. Если картинки нет и включена настройка `enable_gravatar`, используется Gravatar. | +| comment | Необязательное поле для комментариев о пользователе. | +| website | Сайт пользователя. | +| extended | JSON-массив для хранения дополнительных полей пользователя. | + +## Настройки учётных записей + +| Настройка | Что делает | +| --- | --- | +| `passwordless_activated` | Включает вход по волшебной ссылке. По умолчанию выключено. | +| `passwordless_expiration` | Время жизни волшебной ссылки, в секундах. По умолчанию 3600. | +| `password_min_length` | Минимальная длина пароля. По умолчанию 12. | +| `password_generated_length` | Длина пароля, который генерирует MODX. По умолчанию 16. | +| `allow_multiple_emails` | Может ли у пользователя быть несколько адресов. | +| `clean_phone_number` | Чистится ли номер телефона перед сохранением. | +| `default_username` | Имя пользователя, который не вошёл. По умолчанию `(anonymous)`. | +| `enable_gravatar` | Используется ли Gravatar, если у пользователя нет картинки. | +| `photo_profile_source` | Медиа-источник, из которого грузится картинка пользователя. | +| `unauthorized_page` | Страница, куда попадает пользователь без доступа. | +| `access_context_enabled` | Проверяется ли доступ к контексту вообще. | +| `access_resource_group_enabled` | Проверяется ли доступ к группе ресурсов вообще. | ## Получение пользователя через API -Текущего пользователя в API даёт ссылка $modx->user. Например, этот сниппет выводит username: +Текущего пользователя можно получить в API через ссылку $modx->user. Например, этот сниппет выводит имя пользователя: ``` php return $modx->user->get('username'); ``` -Чтобы взять поля Profile, сначала получите объект modUserProfile через алиас Profile. Например, этот сниппет возвращает email: +Чтобы получить поля профиля, сначала нужно получить объект modUserProfile через псевдоним Profile. Например, этот сниппет берёт адрес почты пользователя: ``` php $profile = $modx->user->getOne('Profile'); return $profile ? $profile->get('email') : ''; ``` -Если пользователь не вошёл, $modx->user всё равно доступен как объект, но вернёт 0 как ID и (Anonymous) как username. +Если пользователь не вошёл, объект $modx->user всё равно доступен, но вернёт 0 в качестве ID и (Anonymous) в качестве имени. -### Работа с extended-полями +### Работа с дополнительными полями -Значения в поле extended приходят как массив. С ними можно работать так: +Значения поля extended возвращаются массивом. Ими можно управлять так: ``` php /* get the extended field named "color": */ @@ -118,17 +150,17 @@ $profile->save(); 4. [Роли](building-sites/client-proofing/security/roles) 5. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - политика Administrator](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - политика Resource](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Усиление защиты MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем безопасности](building-sites/client-proofing/security/troubleshooting-security) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +7. [Усиление безопасности MODX Revolution](getting-started/maintenance/securing-modx) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) -9. [Расширение modUser](extending-modx/custom-users "Extending modUser") +9. [Расширение modUser](extending-modx/custom-users "Расширение modUser") From 9b5bc93f69235db77910a5e5038250b3931e9e56 Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Tue, 20 Oct 2026 19:47:38 +0600 Subject: [PATCH 2/6] docs(building-sites/client-proofing): editorial pass on the section Technical-editing pass over the whole client-proofing section in English: - cut filler and answer-first openings, moved details into the body; - turned prose into tables and lists where the content is reference data (widget fields, set fields, permissions); - unified terminology (User, User Group, Resource Group, Access Policy, TV, System setting, the manager) and the menu paths (the lock icon in the user menu, Admin for the gear); - unified the See Also list across the security section and the dashboards / form-customization subsections; - split sentences over 25 words and replaced the 2.x-era menu labels; - aligned the two reference tables (Administrator Policy, Resource Policy) and the field tables without touching their content. --- .../policies/permissions/administrator-policy.md | 2 +- .../creating-a-second-super-admin-user.md | 7 ++----- .../security-tutorials/giving-a-user-manager-access.md | 4 ++-- .../security-tutorials/making-member-only-pages.md | 10 +++------- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md b/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md index cdea66c31..53778886f 100644 --- a/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md +++ b/en/building-sites/client-proofing/security/policies/permissions/administrator-policy.md @@ -199,7 +199,7 @@ This policy is packaged into MODX and is given to users on the 'mgr' context who ## Custom Permissions -If you have created your own actions and menu items (e.g. a [Custom Manager Page](extending-modx/custom-manager-pages "Custom Manager Pages Tutorial")), then you can define custom permission items for them. Create the menu item (System --> Actions --> Create Menu) and let the permission items match those listed here. +If you have created your own actions and menu items (e.g. a [Custom Manager Page](extending-modx/custom-manager-pages "Custom Manager Pages Tutorial")), then you can define custom permission items for them. Create the menu item (**Admin → Actions → Create Menu**) and let the permission items match those listed here. ![](modx+custom+permission.jpg) diff --git a/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md b/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md index ab40479af..d070ab7a7 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md +++ b/en/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md @@ -9,6 +9,8 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/creating-a-se You want another User to have full manager access, with all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. Perhaps it's your colleague or your client, but by creating another Administrator you are handing over the keys to the _entire_ site. This is a simplistic scenario. The other admin could modify or delete your user, so this may not be a viable solution for what you need. +To give a user manager access on a smaller scale, see [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access"). Shaun McCormick's video on [Understanding MODX Revolution Security](http://vimeo.com/13856994) walks through setting up complex permission schemes. + ## The Solution After logging into your site's manager, do the following: @@ -60,8 +62,3 @@ When thinking about roles, think about that access policy there. The access poli 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) - -Related resources for this tutorial: - -- [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access") — an example of how to create a user with a permission level of less than yours. -- Shaun McCormick's video on [Understanding MODX Revolution Security](http://vimeo.com/13856994) — a detailed walk-through of setting up complex permission schemes. diff --git a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index 72deb0e40..e3fe3b9cb 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -11,11 +11,11 @@ You want a User to have manager editing access, but not have all the [Permission ## The Solution -1. In Access Controls ->Roles, create a new role (lets call it "Editor") with an authority of 10. +1. In **Access Controls → Roles**, create a new role (lets call it "Editor") with an authority of 10. 2. In the lock icon in the user menu → **Access Control Lists** → the tab **Policies**, duplicate the administrator policy and rename it. For our example we'll use "AdminLite". 3. Edit the AdminLite Policy to use whatever [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") you want the User to have. 4. In the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users**, right click the "Administrator" group and select "Update User Group.". -5. On the Permissions -> Context Access tab, add two new entries to the grid: +5. On the **Context Access** tab, add two new entries to the grid: 1. Context: 'mgr' Minimum Role: 'Editor', Access Policy 'AdminLite' 2. Context: 'web' Minimum Role: 'Editor', Access Policy 'Load, List and View' 6. In the lock icon in the user menu → **Users**, create the new user or edit an existing one. On the Access Permissions tab, assign them to the Administrator group with a role of Editor. diff --git a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index 6efa7c136..fee55d43a 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -75,7 +75,9 @@ In some cases you may need to clear the site cache, specifically for the mgr (ma ## Still can't get it to work? -Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then go to the Forums to ask for help. If you think the tutorial is misleading or inaccurate, please visit the forum topic (linked below) and post about what is incorrect so it can be fixed. +Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then go to the Forums to ask for help. If you think the tutorial is misleading or inaccurate, please visit the [forum topic discussing this tutorial](https://forums.modx.com/index.php/topic,51259.0.html) and post about what is incorrect so it can be fixed. + +Two further readings help with the permissions themselves: [Bob's permissions guide](http://bobsguides.com/revolution-permissions.html) covers the model in depth, and the [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") tutorial shows a basic "Members Only" area built with the Login Snippet. ## See Also @@ -98,9 +100,3 @@ Make sure you followed everything step by step and that you flushed permissions 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) - -Related resources for this tutorial: - -- Bob's permissions guide: -- Forum topic discussing this tutorial: -- Using the Login Snippet to set up a basic "Members Only" area: [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") From b39a5ef7e9e2eaf64b60f8f7e16d0663c7660462 Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Tue, 20 Oct 2026 20:00:10 +0600 Subject: [PATCH 3/6] docs(building-sites/client-proofing): sync the RU locale with the section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The editorial pass rewrote the English pages; the Russian ones were left behind. The RU pages now match the English ones: - the lists of "See Also" are the same in both locales: 19 items for the security section, 9 for the dashboards, 4 for the widget types, 6 for the form customization and 3 for its rules; - the English page of the resource groups got the unified list of the section — it was the only page that still carried the old one; - the prose that the English pages moved into the body is back in the body of the Russian ones: the link to the tutorial about a manager access and the video on the security model, the paragraph about the policy templates, and the two further readings about the rights; - the menu paths are the ones of MODX 3: the lock icon in the user menu → **Access Control Lists** → the tab **Roles**, the tab **Context Access**, and (**Admin → Actions → Create Menu**); - the rules of a form customization set call a template variable a TV, as the English pages do, and the name of the tab **Template Variables** is left as it is in the interface; - two headings follow the English ones: "Модель безопасности" and "Что такое панель управления". --- .../security/resource-groups.md | 20 ++++----- .../dashboards/creating-a-widget.md | 17 ++++---- .../client-proofing/dashboards/index.md | 2 +- .../dashboards/widget-types/file.md | 8 ++-- .../dashboards/widget-types/html.md | 8 ++-- .../dashboards/widget-types/index.md | 13 ++---- .../dashboards/widget-types/inline-php.md | 13 ++---- .../dashboards/widget-types/snippet.md | 8 ++-- .../form-customization/index.md | 2 +- .../form-customization/rules/index.md | 16 +++---- .../rules/move-tv-to-tab.md | 4 +- .../form-customization/rules/new-tab.md | 2 +- .../form-customization/rules/tv-default.md | 4 +- .../form-customization/rules/tv-title.md | 4 +- .../form-customization/rules/tv-visible.md | 4 +- .../form-customization/sets.md | 16 +++---- .../form-customization/tabs.md | 2 +- .../client-proofing/security/index.md | 6 +-- .../security/passwordless-login/index.md | 19 ++++---- .../client-proofing/security/policies/acls.md | 30 ++++++------- .../security/policies/index.md | 39 ++++++++--------- .../permissions/administrator-policy.md | 23 ++++++++-- .../security/policies/permissions/index.md | 43 +++++++++---------- .../policies/permissions/resource-policy.md | 21 ++++++++- .../security/policies/policytemplates.md | 30 ++++++------- .../security/resource-groups.md | 30 ++++++------- .../client-proofing/security/roles.md | 30 ++++++------- .../creating-a-second-super-admin-user.md | 30 +++++++++---- .../giving-a-user-manager-access.md | 28 +++++++++--- .../making-member-only-pages.md | 28 +++++++++--- .../more-on-the-anonymous-user-group.md | 19 ++++---- .../restricting-an-element-from-users.md | 24 ++++++++--- .../resetting-a-user-password-manually.md | 19 ++++---- .../client-proofing/security/user-groups.md | 30 ++++++------- .../client-proofing/security/users.md | 19 ++++---- 35 files changed, 345 insertions(+), 266 deletions(-) diff --git a/en/building-sites/client-proofing/security/resource-groups.md b/en/building-sites/client-proofing/security/resource-groups.md index b70bb83ba..2c8b30444 100644 --- a/en/building-sites/client-proofing/security/resource-groups.md +++ b/en/building-sites/client-proofing/security/resource-groups.md @@ -31,22 +31,22 @@ Membership alone does not hide the page. You still need a User Group and an ACL ## See Also -1. [Users](building-sites/client-proofing/security/users) -2. [User Groups](building-sites/client-proofing/security/user-groups) -3. [Resource Groups](building-sites/client-proofing/security/resource-groups) -4. [Roles](building-sites/client-proofing/security/roles) -5. [Policies](building-sites/client-proofing/security/policies) +1. [Security (ACLs)](building-sites/client-proofing/security) +2. [Users](building-sites/client-proofing/security/users) +3. [User Groups](building-sites/client-proofing/security/user-groups) +4. [Resource Groups](building-sites/client-proofing/security/resource-groups) +5. [Roles](building-sites/client-proofing/security/roles) +6. [Policies](building-sites/client-proofing/security/policies) 1. [Permissions](building-sites/client-proofing/security/policies/permissions) - 1. [Permissions - Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Permissions - Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Administrator Policy](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Resource Policy](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACLs](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) + 3. [Policy Templates](building-sites/client-proofing/security/policies/policytemplates) +7. [Security Tutorials](building-sites/client-proofing/security/security-tutorials) 1. [Giving a User Manager Access](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Creating a Second Super Admin User](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Restricting an Element from Users](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [More on the Anonymous User Group](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Hardening MODX Revolution](getting-started/maintenance/securing-modx) 8. [Troubleshooting Security](building-sites/client-proofing/security/troubleshooting-security) 1. [Resetting a User Password Manually](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md index 1050094b2..0c615b214 100644 --- a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md +++ b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md @@ -69,11 +69,12 @@ description: "Создание виджета панели управления ## Смотрите также -1. [Управление панелью](building-sites/client-proofing/dashboards/managing) -2. [Назначение панели группе пользователей](building-sites/client-proofing/dashboards/usergroups) -3. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) -4. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) - 1. [Тип виджета - файл](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Тип виджета - HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Тип виджета - inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Тип виджета - сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Панели управления](building-sites/client-proofing/dashboards) +2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) +3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) +4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) +5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) + 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) + 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) + 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) + 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/index.md b/ru/building-sites/client-proofing/dashboards/index.md index fce9c5faa..b6459259b 100644 --- a/ru/building-sites/client-proofing/dashboards/index.md +++ b/ru/building-sites/client-proofing/dashboards/index.md @@ -4,7 +4,7 @@ translation: "building-sites/client-proofing/dashboards" description: "Панель управления в MODX: виджеты на странице, которую видит пользователь после входа, штатные виджеты и личная копия панели у каждого пользователя." --- -## Что такое панели управления +## Что такое панель управления Панель управления — это страница, которая открывается при входе в менеджер. Логотип MODX в левом верхнем углу ведёт на неё же. diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/file.md b/ru/building-sites/client-proofing/dashboards/widget-types/file.md index 10b305652..3d40bfe05 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/file.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/file.md @@ -76,7 +76,7 @@ return 'modDashboardWidgetHelloWorld'; ## Смотрите также -1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) -2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) -3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) -4. [Тип виджета на приборной панели - сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) +2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) +3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) +4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/html.md b/ru/building-sites/client-proofing/dashboards/widget-types/html.md index 89cae1569..0011b92a7 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/html.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/html.md @@ -26,7 +26,7 @@ Hello, [[+modx.user.username]]! ## Смотрите также -1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) -2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) -3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) -4. [Тип виджета на приборной панели - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) +2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) +3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) +4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/index.md b/ru/building-sites/client-proofing/dashboards/widget-types/index.md index 36e0651a1..89897039d 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/index.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/index.md @@ -15,12 +15,7 @@ description: "Типы виджетов панели управления в MOD ## Смотрите также -1. [Панели управления](building-sites/client-proofing/dashboards) -2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) -3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) -4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) -5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) - 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) +2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) +3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) +4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md b/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md index 30899d17e..c526f276d 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/inline-php.md @@ -25,12 +25,7 @@ return 'Hello, World!'; ## Смотрите также -1. [Панели управления](building-sites/client-proofing/dashboards) -2. [Редактирование панели управления](building-sites/client-proofing/dashboards/managing) -3. [Назначение панели управления группе пользователей](building-sites/client-proofing/dashboards/usergroups) -4. [Создание виджета панели управления](building-sites/client-proofing/dashboards/creating-a-widget) -5. [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types) - 1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) - 2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) - 3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) - 4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) +2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) +3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) +4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md b/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md index 7dfe6f171..84c856966 100644 --- a/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md +++ b/ru/building-sites/client-proofing/dashboards/widget-types/snippet.md @@ -18,7 +18,7 @@ MyCustomDashboardSnippet ## Смотрите также -1. [Тип виджета панели инструментов - Файл](building-sites/client-proofing/dashboards/widget-types/file) -2. [Тип виджета панели инструментов - HTML](building-sites/client-proofing/dashboards/widget-types/html) -3. [Тип виджета Dashboard - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) -4. [Тип виджета на приборной панели - сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) +1. [Тип виджета панели управления - Файл](building-sites/client-proofing/dashboards/widget-types/file) +2. [Тип виджета панели управления - HTML](building-sites/client-proofing/dashboards/widget-types/html) +3. [Тип виджета панели управления - Inline PHP](building-sites/client-proofing/dashboards/widget-types/inline-php) +4. [Тип виджета панели управления - Сниппет](building-sites/client-proofing/dashboards/widget-types/snippet) diff --git a/ru/building-sites/client-proofing/form-customization/index.md b/ru/building-sites/client-proofing/form-customization/index.md index 9c7a08e23..83084bb44 100644 --- a/ru/building-sites/client-proofing/form-customization/index.md +++ b/ru/building-sites/client-proofing/form-customization/index.md @@ -6,7 +6,7 @@ description: "Настройка форм в MODX: профили, наборы ## Что такое настройка форм -Настройка форм позволяет менять формы менеджера: спрятать поле, переименовать его, подставить другое значение, перенести переменную шаблона на другую вкладку. +Настройка форм позволяет менять формы менеджера: спрятать поле, переименовать его, подставить другое значение, перенести TV на другую вкладку. Раздел находится в **Admin → Form Customization** и требует права **customize_forms**. diff --git a/ru/building-sites/client-proofing/form-customization/rules/index.md b/ru/building-sites/client-proofing/form-customization/rules/index.md index cd1221b6e..6822f171b 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/index.md +++ b/ru/building-sites/client-proofing/form-customization/rules/index.md @@ -16,10 +16,10 @@ description: "Десять правил набора настройки форм | [Видимость области](building-sites/client-proofing/form-customization/rules/tab-visible "Видимость области") | Прячет область формы. | Области, **Visible** | | [Заголовок области](building-sites/client-proofing/form-customization/rules/tab-title "Заголовок области") | Переименовывает область формы. | Области, **Title** | | [Новая область](building-sites/client-proofing/form-customization/rules/new-tab "Новая область") | Добавляет свою область в форму. | Области, **Create** | -| [Видимость TV](building-sites/client-proofing/form-customization/rules/tv-visible "Видимость TV") | Прячет переменную шаблона формы. | Переменные шаблона, **Visible** | -| [Заголовок TV](building-sites/client-proofing/form-customization/rules/tv-title "Заголовок TV") | Переименовывает переменную шаблона формы. | Переменные шаблона, **Label** | -| [Значение TV по умолчанию](building-sites/client-proofing/form-customization/rules/tv-default "Значение TV по умолчанию") | Задаёт значение по умолчанию для переменной шаблона. | Переменные шаблона, **Default Value** | -| [Перенос TV в другую область](building-sites/client-proofing/form-customization/rules/move-tv-to-tab "Перенос TV в другую область") | Переносит переменную шаблона в другую область. | Переменные шаблона, **Region** | +| [Видимость TV](building-sites/client-proofing/form-customization/rules/tv-visible "Видимость TV") | Прячет TV формы. | Template Variables, **Visible** | +| [Заголовок TV](building-sites/client-proofing/form-customization/rules/tv-title "Заголовок TV") | Переименовывает TV формы. | Template Variables, **Label** | +| [Значение TV по умолчанию](building-sites/client-proofing/form-customization/rules/tv-default "Значение TV по умолчанию") | Задаёт значение по умолчанию для TV. | Template Variables, **Default Value** | +| [Перенос TV в другую область](building-sites/client-proofing/form-customization/rules/move-tv-to-tab "Перенос TV в другую область") | Переносит TV в другую область. | Template Variables, **Region** | ## Правила не правятся напрямую @@ -29,7 +29,7 @@ description: "Десять правил набора настройки форм - **Set Information and Fields** — сам набор и поля формы; - **Regions** — области формы; -- **Template Variables** — переменные шаблона, назначенные шаблону набора. +- **Template Variables** — TV, назначенные шаблону набора. ## Порядок применения правил @@ -38,10 +38,10 @@ description: "Десять правил набора настройки форм 1. значение поля по умолчанию; 2. новая область, затем видимость и заголовок областей; 3. метка и видимость полей; -4. значение по умолчанию, метка и видимость переменных шаблона; -5. перенос переменной шаблона в другую область. +4. значение по умолчанию, метка и видимость TV; +5. перенос TV в другую область. -Перенос идёт последним намеренно: переменную шаблона можно перенести в область, которую тот же набор только что создал. +Перенос идёт последним намеренно: TV можно перенести в область, которую тот же набор только что создал. ## Смотрите также diff --git a/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md b/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md index 7dd921c18..d6808807d 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md +++ b/ru/building-sites/client-proofing/form-customization/rules/move-tv-to-tab.md @@ -1,12 +1,12 @@ --- title: "Перенос TV в другую область" translation: "building-sites/client-proofing/form-customization/rules/move-tv-to-tab" -description: "Правило «Перенос TV в другую область» набора настройки формы в MODX: как оно переносит переменную шаблона." +description: "Правило «Перенос TV в другую область» набора настройки формы в MODX: как оно переносит TV." --- ## Что делает правило -Переносит переменную шаблона формы менеджера в другую область. Переменная выводится в этой области вместо той, к которой принадлежала. +Переносит TV формы менеджера в другую область. TV выводится в этой области вместо той, к которой принадлежал. ## Где задаётся diff --git a/ru/building-sites/client-proofing/form-customization/rules/new-tab.md b/ru/building-sites/client-proofing/form-customization/rules/new-tab.md index ca87a118d..d24119b1c 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/new-tab.md +++ b/ru/building-sites/client-proofing/form-customization/rules/new-tab.md @@ -12,7 +12,7 @@ description: "Правило «Новая область» набора наст Вкладка **Regions** набора. Нажмите **Создать**, чтобы добавить строку в сетку, и заполните два поля: -- **Region (ID)** — идентификатор области, например `my-new-tab`. Он должен быть уникален в пределах набора, и именно на него вы ссылаетесь, перенося переменную шаблона в область. +- **Region (ID)** — идентификатор области, например `my-new-tab`. Он должен быть уникален в пределах набора, и именно на него вы ссылаетесь, перенося TV в область. - **Title** — текст на вкладке. Строку можно удалить снова пунктом **Delete** её контекстного меню. Удалить можно только область, созданную так; области самой формы удалить нельзя. diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-default.md b/ru/building-sites/client-proofing/form-customization/rules/tv-default.md index d25fefead..e15fb7fb7 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-default.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-default.md @@ -1,12 +1,12 @@ --- title: "Значение TV по умолчанию" translation: "building-sites/client-proofing/form-customization/rules/tv-default" -description: "Правило «Значение TV по умолчанию» набора настройки формы в MODX: как оно задаёт значение по умолчанию переменной шаблона." +description: "Правило «Значение TV по умолчанию» набора настройки формы в MODX: как оно задаёт значение по умолчанию TV." --- ## Что делает правило -Задаёт значение по умолчанию для переменной шаблона формы менеджера. Значение появляется, когда форма открывается. +Задаёт значение по умолчанию для TV формы менеджера. Значение появляется, когда форма открывается. Правило применяется на той странице, к которой привязан набор, — и на странице создания ресурса, и на странице редактирования. Чтобы оно действовало только при создании, привяжите набор к действию **Create Resource**, а не к **Create & Edit Resource**. diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-title.md b/ru/building-sites/client-proofing/form-customization/rules/tv-title.md index b61ee4060..90b456027 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-title.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-title.md @@ -1,12 +1,12 @@ --- title: "Заголовок TV" translation: "building-sites/client-proofing/form-customization/rules/tv-title" -description: "Правило «Заголовок TV» набора настройки формы в MODX: как оно переименовывает переменную шаблона формы." +description: "Правило «Заголовок TV» набора настройки формы в MODX: как оно переименовывает TV формы." --- ## Что делает правило -Заменяет метку переменной шаблона формы текстом, который задали вы. Переменная сохраняет имя и значение, меняется только текст рядом с ней. +Заменяет метку TV формы текстом, который задали вы. TV сохраняет имя и значение, меняется только текст рядом с ней. ## Где задаётся diff --git a/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md b/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md index 17001e209..3a53e6023 100644 --- a/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md +++ b/ru/building-sites/client-proofing/form-customization/rules/tv-visible.md @@ -1,12 +1,12 @@ --- title: "Видимость TV" translation: "building-sites/client-proofing/form-customization/rules/tv-visible" -description: "Правило «Видимость TV» набора настройки формы в MODX: как оно прячет переменную шаблона формы." +description: "Правило «Видимость TV» набора настройки формы в MODX: как оно прячет TV формы." --- ## Что делает правило -Прячет переменную шаблона формы менеджера. Переменная не просто скрывается: её тип меняется на `hidden`, так что её не выводят и нельзя заполнить. +Прячет TV формы менеджера. TV не просто скрывается: её тип меняется на `hidden`, так что её не выводят и нельзя заполнить. ## Где задаётся diff --git a/ru/building-sites/client-proofing/form-customization/sets.md b/ru/building-sites/client-proofing/form-customization/sets.md index b20c7cf62..580b69943 100644 --- a/ru/building-sites/client-proofing/form-customization/sets.md +++ b/ru/building-sites/client-proofing/form-customization/sets.md @@ -14,7 +14,7 @@ description: "Набор настройки формы в MODX: страница Вы можете выбрать шаблон, которым ограничен набор. Если у ресурса (а на странице создания — у родителя или в настройке `default_template`) этот шаблон, набор будет работать. Без заданного шаблона предполагается, что набор работает для всех ресурсов. -Кроме того, заданный шаблон ограничивает список редактируемых переменных шаблона переменными, назначенными этому шаблону. +Кроме того, заданный шаблон ограничивает список редактируемых TV теми, что назначены этому шаблону. ### Использование ограничений @@ -30,7 +30,7 @@ description: "Набор настройки формы в MODX: страница Правила настраиваются в наборе с помощью сеток на странице редактирования набора. У страницы три вкладки: **Set Information and Fields**, **Regions** и **Template Variables**. Когда закончите, нажмите «Сохранить» в правом верхнем углу. -Смена шаблона набора перезагружает страницу и пересобирает список переменных шаблона под новый шаблон. +Смена шаблона набора перезагружает страницу и пересобирает список TV под новый шаблон. ### Регулировка полей @@ -44,13 +44,13 @@ description: "Набор настройки формы в MODX: страница Подробнее — на странице [Настройка вкладок](building-sites/client-proofing/form-customization/tabs "Настройка вкладок"). -### Корректировка переменных шаблона +### Корректировка TV -Переменные шаблона находятся на вкладке **Template Variables**. Вы можете настроить метку, значение по умолчанию, видимость и область, в которой они лежат. +TV находятся на вкладке **Template Variables**. Вы можете настроить метку, значение по умолчанию, видимость и область, в которой они лежат. -Чтобы изменить область переменной шаблона, впишите в поле Region идентификатор нужной области. Колонка «Region Rank» задаёт порядок переменной внутри области относительно других переменных, переносимых туда же. +Чтобы изменить область TV, впишите в поле Region идентификатор нужной области. Колонка «Region Rank» задаёт порядок TV внутри области относительно других TV, переносимых туда же. -Правила применяются в фиксированном порядке, и перенос переменной идёт последним — переменную можно перенести в область, которую тот же набор только что создал. Смотрите [Правила настройки формы](building-sites/client-proofing/form-customization/rules "Правила настройки формы"). +Правила применяются в фиксированном порядке, и перенос TV идёт последним — TV можно перенести в область, которую тот же набор только что создал. Смотрите [Правила настройки формы](building-sites/client-proofing/form-customization/rules "Правила настройки формы"). ## Редактирование наборов через XML @@ -58,8 +58,8 @@ description: "Набор настройки формы в MODX: страница Импорт набора из XML создаст **новый** набор, а не переопределит существующие. После импорта можно деактивировать прежние наборы. -**Правила переменных шаблона через импорт не проходят** -Импортер записывает правила переменной шаблона под её голым идентификатором, а всё, что их читает, ищет идентификатор с префиксом `tv`. Правила переменных шаблона импортированного набора приходится задавать заново вручную в сетках набора. +**Правила TV через импорт не проходят** +Импортер записывает правила TV под голым идентификатором переменной, а всё, что их читает, ищет идентификатор с префиксом `tv`. Правила TV импортированного набора приходится задавать заново вручную в сетках набора. ## API раздела diff --git a/ru/building-sites/client-proofing/form-customization/tabs.md b/ru/building-sites/client-proofing/form-customization/tabs.md index 2d7da5977..8adc62256 100644 --- a/ru/building-sites/client-proofing/form-customization/tabs.md +++ b/ru/building-sites/client-proofing/form-customization/tabs.md @@ -40,7 +40,7 @@ description: "Области формы ресурса в MODX, которые ![](fc_new_tab.jpg) -Каждый раз, когда вам нужно обратиться к области, например при переносе переменных шаблона на новую вкладку, используйте идентификатор, который вы ей дали. +Каждый раз, когда вам нужно обратиться к области, например при переносе TV на новую вкладку, используйте идентификатор, который вы ей дали. Идентификатор должен быть уникален в пределах набора. Область, созданная так, удаляется снова пунктом **Delete** её контекстного меню; области самой формы удалить нельзя. diff --git a/ru/building-sites/client-proofing/security/index.md b/ru/building-sites/client-proofing/security/index.md index 8ef270bdc..fb2651a41 100644 --- a/ru/building-sites/client-proofing/security/index.md +++ b/ru/building-sites/client-proofing/security/index.md @@ -4,7 +4,7 @@ translation: "building-sites/client-proofing/security" description: "Модель безопасности MODX: группы, политики и разрешения, и как список контроля доступа их связывает." --- -## Безопасность в MODX Revolution +## Модель безопасности Безопасность в MODX Revolution построена на списках. Права выдаются группам пользователей и привязываются к объекту с указанием минимальной роли. @@ -91,8 +91,8 @@ MODX 3 создаёт при установке: 5. [Роли](building-sites/client-proofing/security/roles) 6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) 7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) diff --git a/ru/building-sites/client-proofing/security/passwordless-login/index.md b/ru/building-sites/client-proofing/security/passwordless-login/index.md index 653b94631..e40a4777b 100644 --- a/ru/building-sites/client-proofing/security/passwordless-login/index.md +++ b/ru/building-sites/client-proofing/security/passwordless-login/index.md @@ -37,21 +37,22 @@ MODX3 имеет новую функцию под названием "Вход ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/acls.md b/ru/building-sites/client-proofing/security/policies/acls.md index d9ae7e997..3a4eeb5d2 100644 --- a/ru/building-sites/client-proofing/security/policies/acls.md +++ b/ru/building-sites/client-proofing/security/policies/acls.md @@ -71,22 +71,22 @@ ACL для ресурсов работают немного иначе и в о ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Предоставление доступа менеджеру пользователей](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) - 2. [Создание страниц только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Создание второго суперадминистратора](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение доступа пользователей к элементу](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Защита MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем с безопасностью](building-sites/client-proofing/security/troubleshooting-security) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/index.md b/ru/building-sites/client-proofing/security/policies/index.md index 8e9bb49cd..56349f9c8 100644 --- a/ru/building-sites/client-proofing/security/policies/index.md +++ b/ru/building-sites/client-proofing/security/policies/index.md @@ -83,23 +83,22 @@ description: "Политики доступа MODX: двенадцать шта ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы Ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) - 1. [Права Доступа](building-sites/client-proofing/security/policies/permissions) - 1. [Права Доступа - Политика Администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Права Доступа - Политика Ресурса](building-sites/client-proofing/security/policies/permissions/resource-policy) - 2. [КД](building-sites/client-proofing/security/policies/acls) - 3. [Шаблоны Политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Предоставление доступа "User Manager"](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) - 2. [Создание "Member-Only" страниц](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Создание второго "Super Admin" пользователя](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Элементов от пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Закалка MODX Revolution](getting-started/maintenance/securing-modx) -8. [Стандарты безопасности](building-sites/client-proofing/security) -9. [Поиск проблем в безопасности](building-sites/client-proofing/security/troubleshooting-security) - 1. [Сбрость пароля пользователя в ручную](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md b/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md index 867e44fb2..425db424f 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/administrator-policy.md @@ -198,11 +198,28 @@ description: "Политика администратора MODX и полный ## Пользовательские разрешения -Если вы создали свои собственные действия и пункты меню [страницу настраиваемого менеджера](extending-modx/custom-manager-pages "Пользовательский менеджер страниц Учебникl"), то вы можете определить настраиваемые элементы разрешений при создании элемента меню (Система -> Действия -> Создать меню), который соответствует разрешения перечислены здесь. +Если вы создали свои собственные действия и пункты меню [страницу настраиваемого менеджера](extending-modx/custom-manager-pages "Пользовательский менеджер страниц Учебникl"), то вы можете определить настраиваемые элементы разрешений при создании элемента меню (**Admin → Actions → Create Menu**), который соответствует разрешения перечислены здесь. ![](modx+custom+permission.jpg) ## Смотрите также -1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) \ No newline at end of file +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/permissions/index.md b/ru/building-sites/client-proofing/security/policies/permissions/index.md index 86354b60b..e740771eb 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/index.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/index.md @@ -21,27 +21,26 @@ description: "Разрешения MODX: что такое одно разреш 1. [Права Доступа - Политика Администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) 2. [Права Доступа - Политика Ресурса](building-sites/client-proofing/security/policies/permissions/resource-policy) +Шаблоны политик организуют списки разрешений в политиках доступа. Политика доступа — это список чекбоксов, а шаблоны политик определяют, какие чекбоксы доступны в политике. Полный список разрешений может быть очень длинным, поэтому определять политики, перебирая сотни чекбоксов, неэффективно. Шаблоны политик позволяют сузить набор доступных опций. + ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы Ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) - 1. [Права Доступа](building-sites/client-proofing/security/policies/permissions) - 1. [Права Доступа - Политика Администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Права Доступа - Политика Ресурса](building-sites/client-proofing/security/policies/permissions/resource-policy) - 2. [КД](building-sites/client-proofing/security/policies/acls) - 3. [Шаблоны Политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Предоставление доступа "User Manager"](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) - 2. [Создание "Member-Only" страниц](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Создание второго "Super Admin" пользователя](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Элементов от пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Закалка MODX Revolution](getting-started/maintenance/securing-modx) -8. [Стандарты безопасности](building-sites/client-proofing/security) -9. [Поиск проблем в безопасности](building-sites/client-proofing/security/troubleshooting-security) - 1. [Сбрость пароля пользователя в ручную](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) - -Есть так же "Шаблоны Политик" - они помогают организовать списки разрешений в политиках доступа. Политики Доступа - это список чекбоксов, шаблоны политик определяют, какие флажки доступны для Политики доступа. Поскольку полный список разрешений может быть довольно длинным, не эффективно назначать Политики Доступа пробираясь через сотни чекбоксов. Шаблоны политик позволяют сузить параметры, доступные для политики доступа. +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md b/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md index fd04f3eac..68c5c10b7 100644 --- a/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md +++ b/ru/building-sites/client-proofing/security/policies/permissions/resource-policy.md @@ -31,5 +31,22 @@ description: "Ресурсная политика MODX и список её ра ## Смотрите также -1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) -2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/policies/policytemplates.md b/ru/building-sites/client-proofing/security/policies/policytemplates.md index a5a764b2e..f6d7cdb57 100644 --- a/ru/building-sites/client-proofing/security/policies/policytemplates.md +++ b/ru/building-sites/client-proofing/security/policies/policytemplates.md @@ -54,22 +54,22 @@ NamespaceTemplate содержит три разрешения простран ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Предоставление доступа менеджеру пользователей](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) - 2. [Создание страниц только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Создание второго суперадминистратора](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение доступа пользователей к элементу](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе анонимных пользователей](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Защита MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем с безопасностью](building-sites/client-proofing/security/troubleshooting-security) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/resource-groups.md b/ru/building-sites/client-proofing/security/resource-groups.md index fafc73934..1892866f0 100644 --- a/ru/building-sites/client-proofing/security/resource-groups.md +++ b/ru/building-sites/client-proofing/security/resource-groups.md @@ -30,22 +30,22 @@ description: "Группы ресурсов MODX: как они собирают ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - политика Administrator](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - политика Resource](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Усиление защиты MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем безопасности](building-sites/client-proofing/security/troubleshooting-security) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/roles.md b/ru/building-sites/client-proofing/security/roles.md index 767af8632..c5aefbf00 100644 --- a/ru/building-sites/client-proofing/security/roles.md +++ b/ru/building-sites/client-proofing/security/roles.md @@ -61,22 +61,22 @@ Authority удобно мыслить как порядковые номера: ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - политика Administrator](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - политика Resource](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Усиление защиты MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем безопасности](building-sites/client-proofing/security/troubleshooting-security) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md b/ru/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md index c2d3e2a8b..767069db2 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user.md @@ -8,6 +8,8 @@ description: "Создать второго администратора MODX: Вы хотите, чтобы ещё один пользователь MODX Revolution имел полный доступ к менеджеру со всеми [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") администратора. Это может быть коллега или клиент. Создавая ещё одного Administrator, вы отдаёте ключи от _всего_ сайта. Сценарий упрощённый: другой админ сможет изменить или удалить вашу учётную запись, так что для вашей задачи это может не подойти. По ходу шагов страница кратко знакомит с ролями и политиками доступа. +Чтобы дать менеджеру доступ в меньшем объёме, посмотрите урок [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access"). Видео Shaun McCormick [Understanding MODX Revolution Security](http://vimeo.com/13856994) подробно показывает сложные схемы прав. + ## Решение Войдите в менеджер сайта и сделайте следующее: @@ -40,12 +42,22 @@ description: "Создать второго администратора MODX: ## Смотрите также -См. также урок [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access "Giving a User Manager Access"): там пример пользователя с уровнем прав ниже вашего. - -Видео Shaun McCormick [Understanding MODX Revolution Security](http://vimeo.com/13856994) подробно показывает сложные схемы прав. - -1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index 67742ad33..821d75277 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -10,11 +10,11 @@ description: "Дать пользователю MODX права менеджер ## Решение -1. В **Access Controls → Roles** создайте роль (например, `Editor`) с authority `10`. +1. В **Access Control Lists** → вкладка **Roles** создайте роль (например, `Editor`) с authority `10`. 2. В **Settings → Access Control Lists → Access Policies** продублируйте политику Administrator и переименуйте (например, `AdminLite`). 3. В политике AdminLite оставьте только нужные [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions"). 4. В **Settings → Access Control Lists → User Groups** кликните правой кнопкой группу `Administrator` и выберите **Update User Group**. -5. На вкладке **Permissions → Context Access** добавьте две строки: +5. На вкладке **Context Access** добавьте две строки: 1. Context: `mgr`, Minimum Role: `Editor`, Access Policy: `AdminLite` 2. Context: `web`, Minimum Role: `Editor`, Access Policy: `Load, List and View` 6. В **Manage → Users** создайте пользователя или откройте существующего. На вкладке Access Permissions добавьте его в группу Administrator с ролью Editor. @@ -32,8 +32,22 @@ description: "Дать пользователю MODX права менеджер ## Смотрите также -1. [Доступ пользователя к Менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Создание второго Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Ограничение элемента для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [Ещё про группу Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index aa5eb9ca8..0ebdbcbcc 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -76,12 +76,26 @@ description: "Защитить страницы сайта на MODX так, ч Пройдите шаги по порядку и убедитесь, что flush permissions выполнен. Если всё кажется верным, проверьте ещё раз и спросите на Forums. Если урок кажется неточным или вводящим в заблуждение, напишите в теме форума (ссылка ниже), что исправить. -## Смотрите также - -Руководство Bob по правам: +Два источника помогут разобраться в самих правах: [руководство Bob по правам](http://bobsguides.com/revolution-permissions.html) подробно раскрывает модель, а урок [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") показывает базовую зону "Members Only", построенную на Login Snippet. -Тема форума по этому уроку: - -Базовая зона "Members Only" через Login Snippet: [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") +## Смотрите также -Безопасность: [Security](building-sites/client-proofing/security "Security") +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md index de1fe0c88..212402e1c 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md @@ -37,21 +37,22 @@ View по ресурсам в этой группе всё ещё закрыт. ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md index 412e80927..d79266f5f 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md @@ -94,8 +94,22 @@ description: "Скрыть элемент MODX от пользователей, ## Смотрите также -1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) -2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) -3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) -4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) -5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) + 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 2. [ACL](building-sites/client-proofing/security/policies/acls) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) + 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index 085dc2d84..c3656fffe 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -100,21 +100,22 @@ print "SUCCESS: User $username updated."; ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/user-groups.md b/ru/building-sites/client-proofing/security/user-groups.md index 305474e12..bb25cc01d 100644 --- a/ru/building-sites/client-proofing/security/user-groups.md +++ b/ru/building-sites/client-proofing/security/user-groups.md @@ -73,22 +73,22 @@ if( $user ){ ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - политика Administrator](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - политика Resource](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) - 3. [PolicyTemplates](building-sites/client-proofing/security/policies/policytemplates) -6. [Уроки по безопасности](building-sites/client-proofing/security/security-tutorials) - 1. [Доступ пользователя к менеджеру](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) + 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) + 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) - 3. [Второй пользователь Super Admin](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) - 4. [Ограничение Element для пользователей](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) - 5. [Подробнее о группе Anonymous](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Усиление защиты MODX Revolution](getting-started/maintenance/securing-modx) -8. [Устранение проблем безопасности](building-sites/client-proofing/security/troubleshooting-security) + 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) + 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) + 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) +8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) diff --git a/ru/building-sites/client-proofing/security/users.md b/ru/building-sites/client-proofing/security/users.md index bd64704ed..5efdd35f9 100644 --- a/ru/building-sites/client-proofing/security/users.md +++ b/ru/building-sites/client-proofing/security/users.md @@ -144,23 +144,22 @@ $profile->save(); ## Смотрите также -1. [Пользователи](building-sites/client-proofing/security/users) -2. [Группы пользователей](building-sites/client-proofing/security/user-groups) -3. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) -4. [Роли](building-sites/client-proofing/security/roles) -5. [Политики](building-sites/client-proofing/security/policies) +1. [Безопасность (ACLs)](building-sites/client-proofing/security) +2. [Пользователи](building-sites/client-proofing/security/users) +3. [Группы пользователей](building-sites/client-proofing/security/user-groups) +4. [Группы ресурсов](building-sites/client-proofing/security/resource-groups) +5. [Роли](building-sites/client-proofing/security/roles) +6. [Политики](building-sites/client-proofing/security/policies) 1. [Разрешения](building-sites/client-proofing/security/policies/permissions) - 1. [Разрешения - Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) - 2. [Разрешения - Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) + 1. [Политика администратора](building-sites/client-proofing/security/policies/permissions/administrator-policy) + 2. [Ресурсная политика](building-sites/client-proofing/security/policies/permissions/resource-policy) 2. [ACL](building-sites/client-proofing/security/policies/acls) 3. [Шаблоны политик](building-sites/client-proofing/security/policies/policytemplates) -6. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) +7. [Учебники по безопасности](building-sites/client-proofing/security/security-tutorials) 1. [Доступ менеджера](building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access) 2. [Страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages) 3. [Второй суперпользователь](building-sites/client-proofing/security/security-tutorials/creating-a-second-super-admin-user) 4. [Ограничение элемента](building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users) 5. [Об анонимном пользователе](building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group) -7. [Усиление безопасности MODX Revolution](getting-started/maintenance/securing-modx) 8. [Диагностика безопасности](building-sites/client-proofing/security/troubleshooting-security) 1. [Ручной сброс пароля пользователя](building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually) -9. [Расширение modUser](extending-modx/custom-users "Расширение modUser") From 31da29542576728a6166328093a9a9b28553250e Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Wed, 21 Oct 2026 10:17:35 +0600 Subject: [PATCH 4/6] docs(building-sites/client-proofing): address the review of #672 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three remarks. **The passwordless login page was confusing about the password.** It said that the password of the user "stays in the database all the same" and that every login by a link writes the hash of a temporary password into the field `password` — two statements that read as a contradiction. What the code does (`manager/controllers/default/security/login.class.php`, `handleMagicLoginLink()`): the handler writes a generated password into the field `password`, where `modUser::set()` stores only its hash, and logs the user in with it. The password the user chose is replaced and stops working. The page now says that, in its own section **The Password Is Replaced**; the sentence about the gain moved to the section above it. **The link to the forum topic was dead.** The topic of the old forum is gone. The sentence now points at the MODX Community, which is where the forum lives. The Russian page had a dangling reference to a link below that was not there any more; it points at the same place. **The page about resetting a password by hand had lost the statement.** The note that the password cannot be calculated in the database was right, but the way out was described in prose only. The `UPDATE` statement is back, with the `hash_class` of the user set to `MODX\Revolution\Hashing\modMD5` and the password written as an MD5 hash — the database has an `MD5()` function for that. Both locales follow. --- .../security/passwordless-login/index.md | 6 ++++-- .../security-tutorials/making-member-only-pages.md | 2 +- .../resetting-a-user-password-manually.md | 10 ++++++++-- .../security/passwordless-login/index.md | 6 +++++- .../security-tutorials/making-member-only-pages.md | 2 +- .../resetting-a-user-password-manually.md | 10 ++++++++-- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/en/building-sites/client-proofing/security/passwordless-login/index.md b/en/building-sites/client-proofing/security/passwordless-login/index.md index d61dd0930..13a510c2a 100644 --- a/en/building-sites/client-proofing/security/passwordless-login/index.md +++ b/en/building-sites/client-proofing/security/passwordless-login/index.md @@ -8,9 +8,11 @@ MODX 3 can log a user in without a password. With the feature activated, the log ## Benefits of passwordless login -As a site administrator you should not encourage your users to choose insecure passwords. Passwordless login moves the risk of a weak password away from your MODX installation, but of course needs a secure e-mail account for your users. The traditional username and password login has the same requirement, because it also offers self-service password resets by e-mail. +As a site administrator you should not encourage your users to choose insecure passwords. Passwordless login moves the risk of a weak password away from your MODX installation, but of course needs a secure e-mail account for your users. The traditional username and password login has the same requirement, because it also offers self-service password resets by e-mail. The gain is that the user has no password to choose, to remember or to reuse. -The password of the user stays in the database all the same. Every login by a link writes the hash of a temporary password into the field `password` of the user. The gain is that the user has no password to choose, to remember or to reuse, not that the password is gone. +## The Password Is Replaced + +Logging in by a link replaces the password of the user. The handler writes a generated password into the field `password`, where only its hash is stored, and logs the user in with it. The password the user chose is therefore gone after the first link — the account is left with a password that nobody knows. ## How to enable passwordless login diff --git a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index fee55d43a..129618e89 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -75,7 +75,7 @@ In some cases you may need to clear the site cache, specifically for the mgr (ma ## Still can't get it to work? -Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then go to the Forums to ask for help. If you think the tutorial is misleading or inaccurate, please visit the [forum topic discussing this tutorial](https://forums.modx.com/index.php/topic,51259.0.html) and post about what is incorrect so it can be fixed. +Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then ask for help on the [MODX Community](https://community.modx.com). Two further readings help with the permissions themselves: [Bob's permissions guide](http://bobsguides.com/revolution-permissions.html) covers the model in depth, and the [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") tutorial shows a basic "Members Only" area built with the Login Snippet. diff --git a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index 41e1495f3..2276de8bc 100644 --- a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -1,6 +1,6 @@ --- title: "Resetting a User Password Manually" -description: "Reset the password of a user of MODX when the link for a forgotten password does not reach them: through the API." +description: "Reset the password of a user of MODX when the link for a forgotten password does not reach them: in the database or through the API." _old_id: "484" _old_uri: "2.x/administering-your-site/security/troubleshooting-security/resetting-a-user-password-manually" --- @@ -12,7 +12,13 @@ It is not uncommon for a User account to become inaccessible because of a lost o **The password cannot be written into the database by hand** MODX 3 hashes the passwords with `MODX\Revolution\Hashing\modNative`, which is the `password_hash()` function of PHP. A database has no such function, so the value of the field `password` cannot be calculated outside of PHP. -There is a second way. Set the field `hash_class` of the user to the class `MODX\Revolution\Hashing\modMD5`, and write the password as an MD5 hash. The user can then log in with it, and the hash is recalculated with `modNative` the next time the password is changed. The name of the class has to be given with its namespace. The older name without it works only through a deprecated alias that prints a warning. +There is a second way. Set the field `hash_class` of the user to the class `MODX\Revolution\Hashing\modMD5`, and write the password as an MD5 hash — the database has an `MD5()` function for that. This is the statement to run in the database — the name of the table carries the prefix of your installation: + +``` sql +UPDATE modx_users SET hash_class = 'MODX\\Revolution\\Hashing\\modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; +``` + +The user can then log in with it, and the hash is recalculated with `modNative` the next time the password is changed. The name of the class has to be given with its namespace. The older name without it works only through a deprecated alias that prints a warning. ## Resetting a Password via the API diff --git a/ru/building-sites/client-proofing/security/passwordless-login/index.md b/ru/building-sites/client-proofing/security/passwordless-login/index.md index e40a4777b..b6c151798 100644 --- a/ru/building-sites/client-proofing/security/passwordless-login/index.md +++ b/ru/building-sites/client-proofing/security/passwordless-login/index.md @@ -11,7 +11,11 @@ MODX3 имеет новую функцию под названием "Вход Потребность в надежном пароле часто заставляет людей выбирать универсальные псевдозащищенные пароли, повторно используя проверенную надежную фразу и, возможно, просто добавляя число к услуге. Как администратор сайта, вы не должны поощрять своих пользователей делать небезопасные вещи. Это устраняет риск незащищенного пароля от вашей установки MODX, но, конечно, для ваших пользователей нужна защищенная учетная запись электронной почты. Но это также относится и к традиционному входу в систему по имени пользователя и паролю, потому что здесь также есть самообслуживание паролем, где вы можете сбросить пароль по электронной почте. -Пароль пользователя всё равно остаётся в базе: при каждом входе по ссылке в поле `password` пишется хеш временного пароля. Выигрыш в том, что пользователю не нужно придумывать, запоминать и переиспользовать пароль, а не в том, что пароля в базе нет. +Выигрыш в том, что пользователю не нужно придумывать, запоминать и переиспользовать пароль. + +## Пароль заменяется + +Вход по ссылке заменяет пароль пользователя. Обработчик записывает сгенерированный пароль в поле `password`, где хранится только его хеш, и входит с ним. Поэтому пароль, который выбрал пользователь, после первой ссылки пропадает — у учётной записи остаётся пароль, которого никто не знает. ## Как включить пароль без логина diff --git a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index 0ebdbcbcc..3cf28fa2d 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -74,7 +74,7 @@ description: "Защитить страницы сайта на MODX так, ч ## Всё ещё не работает? -Пройдите шаги по порядку и убедитесь, что flush permissions выполнен. Если всё кажется верным, проверьте ещё раз и спросите на Forums. Если урок кажется неточным или вводящим в заблуждение, напишите в теме форума (ссылка ниже), что исправить. +Пройдите шаги по порядку и убедитесь, что flush permissions выполнен. Если всё кажется верным, проверьте ещё раз и спросите об этом на [MODX Community](https://community.modx.com). Два источника помогут разобраться в самих правах: [руководство Bob по правам](http://bobsguides.com/revolution-permissions.html) подробно раскрывает модель, а урок [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") показывает базовую зону "Members Only", построенную на Login Snippet. diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index c3656fffe..9ee61670f 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -1,7 +1,7 @@ --- title: "Ручной сброс пароля пользователя" translation: "building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually" -description: "Сбросить пароль пользователя MODX, когда ссылка для восстановления не доходит: через API." +description: "Сбросить пароль пользователя MODX, когда ссылка для восстановления не доходит: в базе или через API." --- ## Сброс пароля через правку базы данных @@ -11,7 +11,13 @@ description: "Сбросить пароль пользователя MODX, ко **Пароль нельзя записать в базу вручную** В MODX 3 пароли хешируются классом `MODX\Revolution\Hashing\modNative` — это функция `password_hash()` из PHP. В базе такой функции нет, поэтому значение поля `password` нельзя посчитать вне PHP. -Есть и второй путь: полю `hash_class` пользователя можно задать класс `MODX\Revolution\Hashing\modMD5`, а пароль записать как MD5-хеш. Пользователь сможет войти, и при следующей смене пароля хеш будет пересчитан через `modNative`. Имя класса задаётся вместе с пространством имён; старое имя без него работает только через устаревший псевдоним, который печатает предупреждение. +Есть и второй путь: полю `hash_class` пользователя можно задать класс `MODX\Revolution\Hashing\modMD5`, а пароль записать как MD5-хеш — в базе для этого есть функция `MD5()`. Вот запрос, который выполняется в базе — в имени таблицы стоит префикс вашей установки: + +``` sql +UPDATE modx_users SET hash_class = 'MODX\\Revolution\\Hashing\\modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; +``` + +Пользователь сможет войти, и при следующей смене пароля хеш будет пересчитан через `modNative`. Имя класса задаётся вместе с пространством имён; старое имя без него работает только через устаревший псевдоним, который печатает предупреждение. ## Сброс пароля через API From 99fc18c269db899d69f12e012208eac342b616ee Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Fri, 23 Oct 2026 14:57:54 +0600 Subject: [PATCH 5/6] docs(building-sites/client-proofing): match the manager labels and the 3.x runtime The pages told readers that an MD5 reset returns to modNative, that every update resets the theme, and that several manager labels differ from the ones on screen. --- .../client-proofing/custom-manager-themes.md | 21 ++--- .../client-proofing/dashboards/managing.md | 6 +- .../client-proofing/manager-login.md | 30 ++++--- .../client-proofing/security/roles.md | 32 +++++--- .../giving-a-user-manager-access.md | 10 +-- .../making-member-only-pages.md | 34 ++++---- .../more-on-the-anonymous-user-group.md | 18 ++--- .../restricting-an-element-from-users.md | 22 ++--- .../resetting-a-user-password-manually.md | 79 ++++-------------- .../client-proofing/security/users.md | 24 +++--- .../client-proofing/custom-manager-themes.md | 25 +++--- .../dashboards/creating-a-widget.md | 23 +++--- .../client-proofing/dashboards/managing.md | 16 ++-- .../form-customization/index.md | 8 +- .../form-customization/tabs.md | 9 ++- .../client-proofing/manager-login.md | 38 +++++---- .../client-proofing/security/roles.md | 36 +++++---- .../giving-a-user-manager-access.md | 14 ++-- .../making-member-only-pages.md | 62 +++++++------- .../more-on-the-anonymous-user-group.md | 22 ++--- .../restricting-an-element-from-users.md | 74 ++++++++--------- .../resetting-a-user-password-manually.md | 80 ++++--------------- .../client-proofing/security/users.md | 32 ++++---- 23 files changed, 310 insertions(+), 405 deletions(-) diff --git a/en/building-sites/client-proofing/custom-manager-themes.md b/en/building-sites/client-proofing/custom-manager-themes.md index 9199bd7d2..f9d550994 100644 --- a/en/building-sites/client-proofing/custom-manager-themes.md +++ b/en/building-sites/client-proofing/custom-manager-themes.md @@ -3,15 +3,16 @@ title: "Custom Manager Themes" description: "Override the files of the MODX Manager with a theme of your own: how the theme is chosen, what it has to contain, and how to override a single file or a controller." --- -**Heads up**: check a custom manager theme after every upgrade of MODX. A theme can conflict with the changes of a new release, and the files that a release adds are never picked up by the theme. +> [!IMPORTANT] +> Check a custom manager theme after every upgrade of MODX. A theme can conflict with the changes of a new release, and the files that a release adds are never picked up by the theme. ## How a Theme Works -The manager is built on Smarty templates. The files of the default theme live in `manager/templates/default`. The system setting `manager_theme` holds the name of a directory inside `manager/templates/`. The manager reads the files of that theme first, and falls back to the files of `default` for everything the theme does not have. +The manager is built on Smarty templates. The default theme's files live in `manager/templates/default`. The system setting `manager_theme` holds a directory name inside `manager/templates/`. The manager reads that theme's files first, and falls back to `default` for every file the theme does not have. -Only the `default` theme ships with MODX 3. The others come with a build or with an extra, or they are your own. +Only the `default` theme ships with MODX 3. Other themes come with a build, an extra, or your own files. -The theme covers more than the pages of the manager. The templates of the dashboard widgets and of the TVs, and the controllers of the Resources, are resolved from it as well. +The theme covers more than the manager pages. Dashboard widget templates, TV templates, and Resource controllers are resolved from it as well. ## Overriding a Single File @@ -35,17 +36,17 @@ These files are read from the directory of the theme, with no fallback to `defau | `images/login/default-background.jpg` | The background of the login page. | | `email/default.tpl` | Creating a user: the template of the letter is not found. | -**The stylesheet of the login page is not themed** -`security/login.tpl` links the stylesheet of the `default` theme by a fixed path. To theme it, put `css/login.css` into the directory of the theme and fix the link in your own copy of `security/login.tpl`. The same holds for the browser of files, whose `browser/index.tpl` links `css/index.css` of the `default` theme. +**The login page stylesheet is not themed** +`security/login.tpl` links the `default` theme's stylesheet by a fixed path. To theme it, put `css/login.css` into the theme directory and fix the link in your copy of `security/login.tpl`. The same holds for the file browser: its `browser/index.tpl` links the `default` theme's `css/index.css`. -The stylesheet of the manager itself is themed. Put `css/index.css` into the directory of the theme, and the header picks it up through the `{$indexCss}` placeholder. +The manager stylesheet is themed. Put `css/index.css` into the theme directory, and the header picks it up through the `{$indexCss}` placeholder. ## Where the Theme Has to Live -The directory of the theme is resolved inside `manager/templates/`, which is part of the installation and is overwritten by an update. Keep the files of the theme in a repository of your own and restore them after an update. +The theme directory is resolved inside `manager/templates/`, which is part of the installation and is overwritten by an update. Keep the theme files in a repository of your own and restore them after an update. -**An update resets the theme** -On an update in the Evolve mode, the script `setup/includes/upgrade.install.php` sets `manager_theme` back to `default`. Check the value after every update. +**An update from Evolution resets the theme** +When the installer upgrades a site from Evolution, `setup/includes/upgrade.install.php` sets `manager_theme` back to `default`. An update inside MODX 3 leaves the setting as it is. ## Overriding a Controller diff --git a/en/building-sites/client-proofing/dashboards/managing.md b/en/building-sites/client-proofing/dashboards/managing.md index 89f53a939..c28150f78 100644 --- a/en/building-sites/client-proofing/dashboards/managing.md +++ b/en/building-sites/client-proofing/dashboards/managing.md @@ -11,7 +11,7 @@ You see a name and a description field, and below them a grid of the widgets of ![](dashboard-edit.png) -The name and the description of the "Default" Dashboard cannot be changed. It is the Dashboard every user gets when no group assigns another one. +The name of the Default Dashboard cannot be changed in the form. The description can. It is the Dashboard every user gets when no group assigns another one. ## Creating and Removing a Dashboard @@ -28,9 +28,7 @@ Changes made on this page update the Dashboard **template**. For [customizable D - When you **add a widget** here, it will appear on the dashboard for all existing users of that dashboard. - When you **remove a widget** here, it will be removed from all users' personal dashboards. -This is different from changes made directly on the dashboard page itself. Using the close button on a widget or adding a widget from the dashboard view affects only the currently logged-in user. - -If you want to enforce a widget change across all users, make it from this management page. If you only want to adjust your own dashboard, make the change directly on the dashboard page instead. +Changes made on the dashboard page itself are different. The close button on a widget, or adding a widget from the dashboard view, affects only the currently logged-in user. A widget that is added to the template arrives at the existing users with the default size and at the end of the list. diff --git a/en/building-sites/client-proofing/manager-login.md b/en/building-sites/client-proofing/manager-login.md index 71a314fa8..26a487bcd 100644 --- a/en/building-sites/client-proofing/manager-login.md +++ b/en/building-sites/client-proofing/manager-login.md @@ -3,15 +3,15 @@ title: Customizing the Login description: "The login page of the MODX Manager: its logo, the background image, the help block, the language, and the settings that change them." --- -The login page of MODX 3 has its own settings, its own template and its own events. You can change its look without touching the rest of the manager. +The login page of MODX 3 has its own settings, its own template, and its own events. You can change its look without changing the rest of the manager. ## Logo -The logo of the site is used by default. The file is `manager/templates/default/images/modx-logo-color.svg`. +The site logo is used by default. The file is `manager/templates/default/images/modx-logo-color.svg`. To use a different logo, put the address of an image into the `login_logo` system setting. It can be a local file or a full external URL. The image is limited to a width of 192 CSS pixels. -The logo is used in the letters of the manager as well, in the standard template `email/default.tpl`. +The logo is also used in the manager's letters, in the standard template `email/default.tpl`. **A custom theme needs its own logo** The default logo is read from the directory of the theme, with no fallback to `default`. A theme that has no `images/modx-logo-color.svg` shows a broken logo on the login page. @@ -20,15 +20,16 @@ The favicon of the page is a separate setting, `manager_favicon_url`. ## Background Image -The background of the login screen is a default one, included in `manager/templates/default/images/login/default-background.jpg`. The photo provided with MODX 3.0.0 was created by Christian Seel ([source](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)). +The login background ships as `manager/templates/default/images/login/default-background.jpg`. The photo in MODX 3.0.0 is by Christian Seel ([source](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)). -> If you've created or use a custom manager theme, you must also provide a `/manager/templates/YOUR-THEME/images/login/default-background.jpg` file to act as the default. +To use another image, put its address in the `login_background_image` system setting. It can be a local file or a full external URL. A landscape image works best. -To change the background to a different image, put the address of an image into the `login_background_image` system setting. It can be a local file or a full external URL. A landscape image works best. +> [!NOTE] +> If you've created or use a custom manager theme, you must also provide a `/manager/templates/YOUR-THEME/images/login/default-background.jpg` file to act as the default. ### Changing Programmatically -The background can also be set by a plugin, which is the way to give every visitor a different picture. One pre-made example is the [DailyPhoto extra](https://modx.com/extras/package/dailyphoto), which uses a different random photo each day from Unsplash. +A plugin can set the background, which is how you give every visitor a different picture. One ready-made example is the [DailyPhoto extra](https://modx.com/extras/package/dailyphoto), which uses a different random photo each day from Unsplash. To set the background yourself, create a plugin that listens to the `OnManagerLoginFormRender` system event: @@ -36,11 +37,11 @@ To set the background yourself, create a plugin that listens to the `OnManagerLo $modx->controller->setPlaceholder('background', '/full/url/to/image.jpg'); ``` -The event `OnManagerLoginFormPrerender` does the same, but its output is placed before the form. +The event `OnManagerLoginFormPrerender` places its output before the form. A plugin on that event cannot set the background: the theme writes the placeholder after Prerender runs. ## Help Block -The login page also includes a help block, which is disabled by default. To enable it, set the `login_help_button` system setting to yes. A help link is then shown at the bottom of the login panel. +The login page includes a help block, disabled by default. Set the `login_help_button` system setting to yes, and a help link shows at the bottom of the login panel. The content of the login block is managed in the lexicon. Go to **Admin → Lexicons**, select `core` as the namespace (if it is not pre-selected) and the `login` topic, and choose the language to edit. The relevant lexicon keys are `login_help_button_text`, `login_help_text`, and `login_help_title`. Double-click a value to edit it. @@ -48,7 +49,16 @@ The text of the greeting is chosen by the time of day from the keys `login_greet ## Language -The language of the login page is picked on the page itself. It is not the `manager_language` setting: in MODX 3 that setting is removed on upgrade, and the language lives in the session. The login page takes the language from the request, then from the session, then from the `Accept-Language` header of the browser. It falls back to `en`. +The language of the login page is picked on the page itself. It is not the `manager_language` setting. In MODX 3 that setting is removed on upgrade, and the language lives in the session. + +The page uses the first source that has a language: + +| Order | Source | +| --- | --- | +| 1 | The request | +| 2 | The session | +| 3 | The browser | +| 4 | `en` | ## Other Settings diff --git a/en/building-sites/client-proofing/security/roles.md b/en/building-sites/client-proofing/security/roles.md index d400912d8..fff24041b 100644 --- a/en/building-sites/client-proofing/security/roles.md +++ b/en/building-sites/client-proofing/security/roles.md @@ -11,7 +11,7 @@ A Role groups the Users of a User Group by position or status, e.g. "Editor" or Roles use an integer value called "Authority". **Lower numbers represent a stronger authority.** A user passes the check of an ACL when the authority of their role is **not greater** than the authority of the ACL. A user with a role of authority 10 passes every ACL that a user with a role of authority 11 passes. -Be sure you clarify your language when talking about Authority because this inverse relationship can lead to some confusing sentences. It helps to think of "Authority" as ordinal numbers: first, second, third, etc. **Authority=1** is the first authority and trumps **Authority=2** (i.e. the second authority). +Think of Authority as an ordinal: first, second, third. **Authority=1** is the first authority and trumps **Authority=2**. **The authority numbers are unique** The database will not let you create two roles with the same authority: the column has a unique index. @@ -29,34 +29,40 @@ The role **Super User** passes the check of every ACL, because the authority of ## The Permissions of the Page -The page of the roles needs the permission `view_role` to see the list, `new_role` and `save_role` to create a role, `edit_role` to change one, and `delete_role` to delete one. +The roles page needs these permissions: + +| Permission | What it allows | +| --- | --- | +| `view_role` | See the list. | +| `new_role`, `save_role` | Create a role. | +| `edit_role` | Change a role. | +| `delete_role` | Delete a role. | ## Usage -A common example is to create Roles that mimic a basic employee position structure. Let's say we create the following Roles and Authority levels: +Create roles that follow job titles. Authority has to be unique. Super User already uses 0, and Member already uses 9999. -- Administrator - 0 - Director - 1 - Coordinator - 2 - Supervisor - 3 -- Employee - 9999 +- Employee - 10 ![](roles-grid.png) -We can then create a User Group called "HR Department". Within that User Group, we'll assign Users to those Roles (you can have multiple Users per Role, as well). +Create a User Group called "HR Department" and assign users to those roles. Several users can share one role. -Now, let's say John has a Role of Coordinator. Mark has a Role of Supervisor. We're going to give Mark's "HR Department" User Group an Access Policy called "AccountPolicy". It holds the following Access Permissions: +John's role is Coordinator. Mark's role is Supervisor. Give the "HR Department" User Group an Access Policy called "AccountPolicy" on the "web" context, and set Minimum Role to "Supervisor": -- `view_accounts` -- `save_accounts` +![](ug-ctx-grid1.png) -We've assigned this Policy to the "web" context for our User Group "HR Department". We then set its Minimum Role value to "Supervisor": +The policy holds these permissions: -![](ug-ctx-grid1.png) +- `view_accounts` +- `save_accounts` -This means that Mark has these Permissions: he's in the User Group and has at least the Role of "Supervisor". +Mark has these permissions. He is in the User Group, and his role is at least "Supervisor". -But this **also** means that John has these Permissions as well, since he is a "Coordinator" which has a stronger Authority level than "Supervisor". So, John as Coordinator has the Permissions that Mark had as Supervisor. +John has them too. Coordinator has a stronger authority than Supervisor, so John has the permissions Mark has as Supervisor. ## See Also diff --git a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index e3fe3b9cb..3a70ca34e 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/en/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -7,15 +7,15 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/giving-a-user ## The Problem -You want a User to have manager editing access, but not have all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. This tutorial, partially written by BobRay, will help you through that. +You want a user to edit in the manager, and not have all the [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") of an Administrator user. Part of this tutorial was written by BobRay. ## The Solution -1. In **Access Controls → Roles**, create a new role (lets call it "Editor") with an authority of 10. -2. In the lock icon in the user menu → **Access Control Lists** → the tab **Policies**, duplicate the administrator policy and rename it. For our example we'll use "AdminLite". +1. In the lock icon → **Access Control Lists**, open the **Roles** tab and create a role (call it "Editor") with an authority of 10. +2. On the **Access Policies** tab, duplicate the administrator policy and rename it. For our example we'll use "AdminLite". 3. Edit the AdminLite Policy to use whatever [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") you want the User to have. -4. In the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users**, right click the "Administrator" group and select "Update User Group.". -5. On the **Context Access** tab, add two new entries to the grid: +4. On the tab **User Groups & Users**, right-click the "Administrator" group and select **Edit User Group**. +5. On the **Contexts** tab, click **Add Context Access** and add two entries: 1. Context: 'mgr' Minimum Role: 'Editor', Access Policy 'AdminLite' 2. Context: 'web' Minimum Role: 'Editor', Access Policy 'Load, List and View' 6. In the lock icon in the user menu → **Users**, create the new user or edit an existing one. On the Access Permissions tab, assign them to the Administrator group with a role of Editor. diff --git a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index 129618e89..b891d2cc0 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/en/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -7,6 +7,8 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/making-member ## The Steps +These steps protect front-end pages so that only certain users can see them. They assume users already register and log in with the [Login](/extras/login "Login") package. They do not change which resources a user can see or edit in the manager. + 1. Create a Resource Group (the lock icon in the user menu → **Resource Groups** → **Create Resource Group**) 2. Link your member-only resource to the Resource Group. (By editing the resource, or by dragging them from the resource tree to the right) 3. Create a User Group (the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> New User Group) @@ -14,48 +16,42 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/making-member 5. Add users to the user group with the role of Member. (the lock icon in the user menu → **Users**) 6. Flush permissions (**Flush Your Permissions**) and try it in another browser (not just another browser window: another browser) -This tutorial describes how to protect the pages of the front end of a site so that only certain users can see them. It assumes that you already know how to let users register and log in using the components in the [Login](/extras/login "Login") package. The process described below has no effect on which resources users can see or edit in the manager. - ## Access Wizard The wizard of the resource group walks you through the whole process. The result is the same as when you set every step by hand. ### 1. Create a Resource Group -A [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") is a collection of resources which you can link to user groups and access list entries. When you have created a resource group, you can easily classify pages to be only visible for certain user groups, or roles within user groups. - -Go to the lock icon in the user menu → **Resource Groups** and click the Create Resource Group. A window similar to this should pop up: ![](create-resource-group.png) +A [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") is a collection of resources you can link to user groups and access list entries. -Let's go over each section: +Go to the lock icon in the user menu → **Resource Groups** and click **Create Resource Group**. A window similar to this should pop up: ![](create-resource-group.png) | Section | Explanation | Tutorial Default | | --- | --- | --- | | Name | The name of the resource group that we're generating. Make it descriptive and easy-to-remember. | Protected | | Contexts | The context where you want the rules to apply. For this tutorial, we only have one context, "web", and we only want to hide things there. | web | -| Automatically give Administrator Group Access | Checking this box will give all users in the default administrator group access to the resource group. The default admin user is marked as a "sudo" user, and a sudo user bypasses the checks of the policies, so they see all resource groups regardless of whether the administrator group has access. However, if there are any other administrators that don't have sudo access and we want them to be able to view the resources in the resource group, we should check that box. | checked | +| Automatically give Administrator Group Access | Checking this box gives every user in the default administrator group access to the resource group. The default admin user is marked as a "sudo" user. A sudo user bypasses the checks of the policies, so they see every resource group whether or not the administrator group has access. Check the box if other administrators lack sudo and should see the resources in the group. | checked | | Automatically give Anonymous Group Access | Checking this box will give the anonymous user access to the resource group. When someone comes to your website and is not logged in, they are the anonymous user. We want to protect our pages from users who aren't logged in, so let's leave this box unchecked for this tutorial. | unchecked | | Create Parallel User Group | You may not wish to have everyone who can view the member-only pages be in the administrator group (if you've checked the "Automatically give Administrator Group Access" option). In this case, you can create another user group that has access to the resources in this resource group. Let's check that, as our members aren't administrators. | checked | | Automatically Give Other User Groups Access | If you have any other user groups that you've defined previously to this tutorial to whom you want to give access, you can list them here. | | -Great! We have a resource group and a user group created. We now need to add resources to the resource group and users to that user group. - ### 2. Add Resources to the Resource Group Tell MODX which Resources to protect. Stay on the page from Step 1 (the lock icon in the user menu → **Resource Groups**). On the right, open the web context to see the pages on your site. Drag them from the right column into your Resource Group. Or edit each Resource, open the Resource Groups tab, and check **Access** on the "Protected" row. ### 3. Add Users to the User Group -Go to the lock icon in the user menu → **Access Control Lists**. In the Users Groups tab, we can see a list of all of the user groups on our site. Right click on the "Protected" User group. Select "**Add User to Group**". For the "Name", select the user you want in the user group. For the Role, let's select "Member" for now. Roles define what an individual user can do within a user group, but we don't need that fine of control for this tutorial. Click Save. +Go to the lock icon in the user menu → **Access Control Lists**. On the **User Groups & Users** tab you see the user groups. Right-click the "Protected" group and select **Add User to Group**. For the "Name", select the user you want in the user group. For the Role, let's select "Member" for now. Roles define what an individual user can do within a user group, but we don't need that fine of control for this tutorial. Click Save. -As soon as you have protected a resource by (1) assigning it to one or more resource groups and (2) linking the group to a user group with an access control, those pages no longer show up for users that are not linked to it. The default behavior in that case is displaying the 404-error page. If you would rather return the 401-error, give the anonymous user "load" permission for the resource group; more about this in a later tutorial. At this moment in the tutorial, your page is not visible yet, because you have not added it to a user group. +A resource is protected when it is assigned to one or more resource groups. That group is linked to a user group with an access control. Those pages no longer show for users who are not linked to it. The default page is the 404 error. To return 401 instead, give the anonymous user "load" permission for the resource group. More on that in a later tutorial. At this point the page is still not visible, because you have not added it to a user group. When you use a websignup snippet, make sure it puts the new users into the right user group. -We now have our resources in a resource group, and users in a user group. Done? Sorry, we have a few small things to do first. If you're following this tutorial and this is your first foray into MODX security, you will likely run into a small but important snag. The user group we created has no context access to our front end context, web. In other words, if we could view that context, we could view those protected resources — but we can't currently view that context. Let's give our user group permission to view it. +The user group has no context access to the front-end context, web. If that context were available, the protected resources would be available too. It is not available yet. Add that access next. ### 4. Add Context Access to the User Group -Go to the lock icon in the user menu → **Access Control Lists**. Right click on the protected user group. Select "Update user group". Go to the Context Access tab. Click "Add Context". We are presented with a dialog such as the one below. Let's break it down: ![](context-access.png) +Go to the lock icon → **Access Control Lists**. Right-click the protected user group and select **Edit User Group**. Open the **Contexts** tab and click **Add Context Access**. The dialog has these fields: ![](context-access.png) | Section | Explanation | Tutorial Default | | --- | --- | --- | @@ -63,21 +59,19 @@ Go to the lock icon in the user menu → **Access Control Lists**. Right click o | Minimum Role | This specifies what user roles this rule will apply to. If we want all users in this user group, select "Member - 9999". This is where some of that fine control comes in that we talked about earlier. | Member - 9999 | | Access Policy | This specifies what permissions we're giving to the users. Different policies will allow user groups to do different things. | Administrator | -Let's make one rule with "web", "Member - 9999", and "Load, List and View". If we want users to be able to view the manager, we can add a second rule for the mgr context: "mgr", "Member - 9999", and "Administrator". Those users get admin access. If you would prefer to limit their permissions, you could instead choose "Content Editor" or "Developer" for their access policies. Alternatively, you can make your own policy in the lock icon in the user menu → **Access Control Lists** → the tab **Policies**, if you want to be specific about what users can do. - -We now have users in a user group, resources in a resource group, and that user group can view the context. +Make one rule with "web", "Member - 9999", and "Load, List and View". To let users view the manager, add a second rule for the mgr context: "mgr", "Member - 9999", and "Administrator". Those users get admin access. To limit their permissions, choose "Content Editor" or "Developer" for their access policy. You can also make your own policy on the **Access Policies** tab of **Access Control Lists**. ### 5. Flush Permissions -Before you can see a change, you need to reset / flush what your individual users can see and do. Go to **Flush Your Permissions**. To test this in the front end, you must use a different browser. Most of the trouble comes from not testing in a different browser or flushing your permissions. Don't be lazy: open that second browser. Congratulations, you now have members-only pages! +Before you can see a change, flush what your users can see and do. Go to **Flush Your Permissions**. To test the front end, use a different browser. Most of the trouble comes from testing in the same browser or skipping the flush. -In some cases you may need to clear the site cache, specifically for the mgr (manager) context as elements and resources may cache their permissions. +In some cases you may need to clear the site cache, specifically for the mgr (manager) context, because elements and resources may cache their permissions. ## Still can't get it to work? -Make sure you followed everything step by step and that you flushed permissions properly. If everything seems to be alright, check again and then ask for help on the [MODX Community](https://community.modx.com). +Check the steps and the flush. If the pages still fail, ask on the [MODX Community](https://community.modx.com). -Two further readings help with the permissions themselves: [Bob's permissions guide](http://bobsguides.com/revolution-permissions.html) covers the model in depth, and the [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") tutorial shows a basic "Members Only" area built with the Login Snippet. +Two further readings help with the permissions themselves. [Bob's permissions guide](http://bobsguides.com/revolution-permissions.html) covers the model in depth. The [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") tutorial shows a basic "Members Only" area built with the Login Snippet. ## See Also diff --git a/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md b/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md index b35c7378a..33e94548d 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md +++ b/en/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md @@ -10,31 +10,31 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/more-on-the-a Anyone who visits the site and is not logged in is the anonymous user. **The anonymous user is not a User Group** -In the database there is no group "Anonymous". The anonymous user is an access control list with the principal `0`, and in the tree of the groups it shows up as a pseudo entry "(Anonymous)". You can edit that entry like any other group, but what you change is the access of the anonymous user. +There is no group named Anonymous. In the group tree the visitor shows up as `(anonymous)`. You can edit that entry like any other group. What you change is the anonymous user's access. -You reach it by navigating to the lock icon in the user menu → **Access Control Lists**, the tab **User Groups & Users**. Then right-click on the "(Anonymous)" entry and select "Update User Group". ![](access+controls.png) +You reach it from the lock icon → **Access Control Lists**, the tab **User Groups & Users**. Right-click `(anonymous)` and select **Edit User Group**. ![](access+controls.png) ## What Can Anonymous Users Do? -By default, the anonymous user is granted Load Only permissions in every [Context](building-sites/contexts "Contexts") except the "mgr" Context. Without Load Only permissions, requests to the Context would result in a 404 Page Not Found response. +By default, the anonymous user is granted Load Only in every [Context](building-sites/contexts "Contexts") except the "mgr" Context. Without Load Only, a request to the Context returns 404 Page Not Found. ![](user+group_+anonymous.png) -Load Only permissions doesn't necessarily mean they can View the Resource (see below). +Load Only does not necessarily mean they can View the Resource. -For example, if you create a [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") and grant access permissions to a specific User Group, the anonymous user cannot access it. This is the basis of [Creating Member Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages "Making Member-Only Pages"). +If you create a [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") and grant it to a specific User Group, the anonymous user cannot access it. That is the basis of [Making Member-Only Pages](building-sites/client-proofing/security/security-tutorials/making-member-only-pages "Making Member-Only Pages"). ### 401 vs 404 Response on Protected Pages -When you create protected Resource Groups, the anonymous user has no Load permissions on it by default. They get a 404 Page Not Found response. To give them a 401 Unauthorized response instead, grant the anonymous user access to the Resource Group with Load Only permissions. +On a protected Resource Group, the anonymous user has no Load permission by default and gets 404 Page Not Found. To return 401 Unauthorized instead, grant that user access to the Resource Group with the Load Only policy. -You can do this in the Resource Group Access tab of the editing page of the anonymous user. +Do this on the Resource Group Access tab of the anonymous user's editing page. ![](screen+shot+2012-10-19+at+11.43.46+pm.png) -Click on "Add Resource Group", select the protected Resource Group in the dropdown, and select the Context for the access (don't select the "mgr" context). Choose Load Only as the Access Policy, click "Save", and you're done. +Click "Add Resource Group", select the protected Resource Group, and select the Context (don't select the "mgr" context). Choose Load Only as the Access Policy and click "Save". -They still will not be able to view the Resources in that protected Resource Group. They will only be able to "Load" it, and get a 401 response. You can specify a Resource ID to serve as a custom Unauthorized page by using the [Unauthorized Page System Setting](building-sites/settings/unauthorized_page "unauthorized_page"). +They still cannot view the Resources in that Resource Group. They can only Load it, and the response is 401. Set a Resource ID as the Unauthorized page with the [Unauthorized Page](building-sites/settings/unauthorized_page "unauthorized_page") system setting. ## See Also diff --git a/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md b/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md index a86018fc7..959cf50fe 100644 --- a/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md +++ b/en/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md @@ -18,7 +18,7 @@ _old_uri: "2.x/administering-your-site/security/security-tutorials/restricting-a ### 1. Create a Category -Click the Elements tab on the left-hand tree, and click the Category icon in the toolbar, or right-click "Categories" at the bottom, then click "New Category". Create and save a new category. Alternatively, you can use an already-existing Category for this tutorial. +Click the Elements tab in the left tree, then the Category icon in the toolbar. Or right-click "Categories" at the bottom and click "New Category". Save the category. An existing category works too. ### 2. Place the Element into the Category @@ -26,17 +26,17 @@ Edit the Element and set its Category to be the new Category created in step 1. ### 3. Create a User Group -Go to the lock icon in the user menu → **Access Control Lists** in the top menu, and find the "User Groups" tab. Then either create a new User Group or select a prior one. From there, right-click on the User Group and select "Update User Group". +Go to the lock icon → **Access Control Lists** and open the **User Groups & Users** tab. Create a user group or select an existing one. Right-click it and select **Edit User Group**. -If using the Access Wizard form, make sure the group gets "mgr" access in the Context field, and specify the Category in the Element Categories field. You can also put a list of users to be added to this group in the Users field. Right-click on the new User Group to update it if not using the Wizard. +On the Access Wizard form, give the group "mgr" in the Context field and set the Category in the Element Categories field. The Users field can list users to add to this group. If you are not using the Wizard, right-click the new User Group and update it. ### 4. Add the Users to the User Group -With the new User Group open for updating, find the Users tab and add any users you want to see the Element. Make sure to give them a Role of **at least** Member. Alternately, you can add individual users to the new User Group from the User's editing page in the Access Permission tab. +With the new User Group open, open the Users tab and add the users who should see the Element. Give them a role of **at least** Member. Or add a user from that user's editing page, on the Access Permission tab. ### 5. Add the Element Category ACL -Find the "Element Category Access" tab on this screen. The tab is in the panel of the group, next to the other access tabs. +Open the "Element Category Access" tab. It sits in the group panel, next to the other access tabs. Click "Add Category" on the button above the grid. Select: @@ -49,15 +49,15 @@ Click "Add Category" on the button above the grid. Select: ### 6. Flush Permissions -On the top menu, find "**Flush Your Permissions**" and click it. Then the lock icon in the user menu → **Logout All Users**. +Open the lock icon → **Flush Your Permissions**, then **Logout All Users**. -This force everyone to log in again, and your Element Category will now be protected from users outside the Editors User Group. +This forces everyone to log in again. The Element Category is then protected from users outside the Editors User Group. ## Hiding Specific Elements from Certain Users Sometimes, you want to hide elements from all users who are not in the Administrator group. To do that, put the elements in a category as we did above, but connect it to the Administrator user group: -- Go to the Administrator User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Administrator" and pick Update User Group +- Go to the Administrator User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Administrator" and pick **Edit User Group** - Find the Element Category Access tab - Add the following ACL entry, by clicking on "Add Category": - Category: your Category you made/selected earlier @@ -72,9 +72,9 @@ Now, only the admin Super User can see the elements. ## Special Case for Templates -Lets say you restricted a Template with the method above. But you also want another User Group to edit (but not create!) Resources with that Template, and to see its TVs, though it has no access to the Template. Currently, the 2nd User Group (let's call them Editors) would see the Resource, and the ID of the Template would show in the Template combobox, but they wouldn't see the TVs. We need another ACL on that group to get them to load the Template and its TVs. +You restricted a Template with the method above. Another User Group should edit Resources that use that Template, but not create them. It should see the Template's TVs, though it has no access to the Template. That group (call them Editors) would see the Resource. The Template combobox would show the Template ID, and they would not see the TVs. Add another ACL on that group so it loads the Template and its TVs. -- Go to the Editors User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Editors" and pick Update User Group +- Go to the Editors User Group edit page: the lock icon in the user menu → **Access Control Lists** → the tab **User Groups & Users** -> right click "Editors" and pick **Edit User Group** - Find the Element Category Access tab - Add the following ACL entry, by clicking on "Add Category": - Category: your Category you made/selected earlier @@ -85,7 +85,7 @@ Lets say you restricted a Template with the method above. But you also want anot - Click on the "Save" button at the upper right - Have the users in the Editors User Group logout and log back in, or alternatively click **Logout All Users** in the top menu -Done! Your Editors will now see and edit the TVs for the Template in the protected Category. The Template stays hidden from users who are not in the Editors User Group. +Editors will now see and edit the TVs for the Template in the protected Category. The Template stays hidden from users who are not in the Editors User Group. ## See Also diff --git a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index 2276de8bc..a250c5af4 100644 --- a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -7,102 +7,51 @@ _old_uri: "2.x/administering-your-site/security/troubleshooting-security/resetti ## Resetting a User Password via Database Manipulation -It is not uncommon for a User account to become inaccessible because of a lost or forgotten password. In many cases, this can easily be resolved by having the user use the Forgot Password link on the login form. In some cases you need to reset the password directly. +Have the user try the Forgot Password link on the login form. If the account is still unreachable, reset the password in the database. **The password cannot be written into the database by hand** -MODX 3 hashes the passwords with `MODX\Revolution\Hashing\modNative`, which is the `password_hash()` function of PHP. A database has no such function, so the value of the field `password` cannot be calculated outside of PHP. +MODX 3 stores the password as a hash that only PHP can produce. A database statement cannot calculate that hash. -There is a second way. Set the field `hash_class` of the user to the class `MODX\Revolution\Hashing\modMD5`, and write the password as an MD5 hash — the database has an `MD5()` function for that. This is the statement to run in the database — the name of the table carries the prefix of your installation: +Set the user's `hash_class` to `MODX\Revolution\Hashing\modMD5` and write the password as an MD5 hash. The database has an `MD5()` function for that. Run this statement. The table name carries your installation's prefix: ``` sql UPDATE modx_users SET hash_class = 'MODX\\Revolution\\Hashing\\modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; ``` -The user can then log in with it, and the hash is recalculated with `modNative` the next time the password is changed. The name of the class has to be given with its namespace. The older name without it works only through a deprecated alias that prints a warning. +The user can then log in with it. The next password change keeps hashing with `MODX\Revolution\Hashing\modMD5`. To return to the shipped hasher, set `hash_class` to `MODX\Revolution\Hashing\modNative` and then save a new password in the manager. The name of the class has to be given with its namespace. The older name without it works only through a deprecated alias that prints a warning. ## Resetting a Password via the API -You can also reset the password (or manipulate any part of the MODX application) by using the API. Below is a sample script to update the password and e-mail address of a given user. It also ensures this user is in the Administrator User Group. +This script sets a new password for an existing user. The password is hashed with the class already stored in `hash_class`. ``` php initialize('mgr'); -$query = $modx->newQuery(\MODX\Revolution\modUser::class); -$query->where(['username' => $username]); -$user = $modx->getObjectGraph(\MODX\Revolution\modUser::class, '{ "Profile":{}, "UserGroupMembers":{} }', $query); +$user = $modx->getObject(\MODX\Revolution\modUser::class, ['username' => $username]); if (!$user) { - die("ERROR: No user with username $username"); + die('ERROR: No user with that username.'); } -$user->set('username', $username); -$user->set('active', 1); $user->set('password', $password); -$user->Profile->set('email', $email); -$user->Profile->set('blocked', 0); -$user->Profile->set('blockeduntil', 0); -$user->Profile->set('blockedafter', 0); - -// Verify the user is a member of specified User Group -$is_member = false; -if (!empty($user->UserGroupMembers)) { - foreach ($user->UserGroupMembers as $UserGroupMembers) { - if ($UserGroupMembers->get('user_group') == $user_group) { - $is_member = true; - break; - } - } -} -// Add the User to the User Group if he is not a member -if (!$is_member) { - // Verify the user group exists - $UserGroup = $modx->getObject(\MODX\Revolution\modUserGroup::class, $user_group); - if (!$UserGroup) { - die("ERROR: User Group $user_group does not exist."); - } - - $Member = $modx->newObject(\MODX\Revolution\modUserGroupMember::class); - $Member->set('user_group', $user_group); - $Member->set('member', $user->get('id')); - // Super User = role 2 - $Member->set('role', 2); - $Member->set('rank', 0); - $user->addOne($Member, 'UserGroupMembers'); -} - -/* save user */ if (!$user->save()) { - die('ERROR: Could not save user.'); + die('ERROR: Could not save the user.'); } -print "SUCCESS: User $username updated."; - -?> +echo 'SUCCESS: password updated.'; ``` -You can put this script anywhere on your server so long as you update the path to the primary **index.php** file. You can execute the script by hitting it in a browser or via the command line. +Put the script anywhere on the server, and update the path to the main **index.php**. Run it in a browser or from the command line. -**Warning** -Be extremely careful when using a script like this! If possible, do NOT put it inside your document root. Put it outside of your document root and execute the script via the command line. +> [!WARNING] +> Be extremely careful with a script like this. If possible, do not put it inside your document root. Put it outside the document root and run it from the command line. ## See Also diff --git a/en/building-sites/client-proofing/security/users.md b/en/building-sites/client-proofing/security/users.md index 2dc82c9e0..4f58e9355 100644 --- a/en/building-sites/client-proofing/security/users.md +++ b/en/building-sites/client-proofing/security/users.md @@ -13,19 +13,19 @@ Users are assigned to User Groups, which carry [ACLs](building-sites/client-proo ## The Superuser -The field `sudo` makes a user a superuser: `checkPolicy()` returns `true` right away, and the policy checks do not run for it at all. The user sees everything, whatever the ACLs say. +The field `sudo` makes a user a superuser. Policy checks do not run for that user. The user sees everything, whatever the ACLs say. Only a user with the permission `set_sudo` can give it away. The administrator of a fresh installation gets it. ## User Settings -The settings of a user override any System or Context settings with the same key, and they can be unique to that user as well. The order of inheritance for Settings is: +A user setting overrides a user group setting of the same key. A user group setting overrides a context setting. A context setting overrides the system setting. The order is: -`System Settings → Context Settings → User Settings` +`System setting → Context setting → User group setting → User setting` -To edit the user settings, navigate to the lock icon in the user menu → **Users** → **Update User** (right-click) → **Settings** (tab). +To edit the settings of a user, open the lock icon → **Users**, right-click the user and choose **Edit**, then open the **Settings** tab. -You can change user-specific settings only _after_ you've created the user. The "Settings" tab is not visible when you first create the user. It is shown only to a user who has the permissions `settings` **and** `namespace`. +You can change those settings only after the user exists. The Settings tab is not on the create form, and only a sudo user sees it. Log in as sudo to edit the settings of a user. ## Users in the Front-End @@ -36,12 +36,12 @@ When a user is logged into the frontend of your site, their username and ID are [[+modx.user.username]] - Prints the username ``` -If a user is not logged in, ID will be blank, and Username will be "(anonymous)". +If a user is not logged in, the ID is 0 and the username is `anonymous`. The default Username is set with the `default_username` setting. **Remember** -Keep in mind that confusing caveat: just because you have logged into the _manager_ does not mean that you are logged into the _web_ front-end. The user-specific settings and the [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") API method obeys this same rule. If you're not logged in, the **System Settings → Context Settings → User Settings** cannot fully apply. +Logging into the _manager_ does not log you into the _web_ front end. If you are not logged in on the site, the chain **system setting → context setting → user group setting → user setting** cannot fully apply. [Code that reads a setting](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") follows the same split. ## The Fields of a User @@ -58,7 +58,7 @@ Users contain the following fields: | remote\_key | A remote user Key used by remote authentication apps. | | remote\_data | A JSON array of data used by remote authentication apps. | | hash\_class | The class that hashes the password of the user. The default of MODX 3 is `MODX\Revolution\Hashing\modNative`. | -| salt | The salt that the password of the user is hashed with. | +| salt | The salt stored on the user. The shipped hasher `modNative` does not use this column. | | primary\_group | The group that the user gets the dashboard and the access of its primary group from. | | session\_stale | Whether the session of the user is stale. | | sudo | Whether the user is a superuser. See [The Superuser](#the-superuser). | @@ -113,26 +113,26 @@ Users also have a Profile attached to them. It contains the following fields: ## Grabbing the User via the API -The current user can be retrieved in the API via the `$modx->user` reference. For example, this snippet outputs the username of the user: +The current user is available in the API as `$modx->user`. This snippet outputs the username: ``` php return $modx->user->get('username'); ``` -To read the Profile fields, get the `modUserProfile` object through the Profile alias first. For example, this snippet grabs the email of the user and returns it: +To read Profile fields, get the `modUserProfile` object through the Profile alias first. This snippet returns the user's email: ``` php $profile = $modx->user->getOne('Profile'); return $profile ? $profile->get('email') : ''; ``` -If the User is not logged in, `$modx->user` is still available as an object, but returns 0 as the ID and (Anonymous) as the username. +If the user is not logged in, `$modx->user` is still available as an object. It returns 0 as the ID and `anonymous` as the username. To write your own User class, see [Extending modUser](extending-modx/custom-users "Extending modUser"). ### Using Extended Fields -Values in the extended field return as an array. They can be manipulated like so: +Values in the `extended` field return as an array: ``` php /* get the extended field named "color": */ diff --git a/ru/building-sites/client-proofing/custom-manager-themes.md b/ru/building-sites/client-proofing/custom-manager-themes.md index 7abfa6dee..3f450ec2f 100644 --- a/ru/building-sites/client-proofing/custom-manager-themes.md +++ b/ru/building-sites/client-proofing/custom-manager-themes.md @@ -4,15 +4,16 @@ translation: "building-sites/client-proofing/custom-manager-themes" description: "Переопределить файлы менеджера MODX своей темой: как выбирается тема, что она обязана содержать и как переопределить один файл или контроллер." --- -**Важно**: проверяйте пользовательскую тему менеджера после каждого обновления MODX. Тема может конфликтовать с изменениями нового выпуска, а файлы, добавленные выпуском, тема никогда не подхватит. +> [!IMPORTANT] +> Проверяйте свою тему менеджера после каждого обновления MODX. Тема может конфликтовать с изменениями нового выпуска, а файлы, которые выпуск добавляет, тема никогда не подхватывает. ## Как устроена тема -Менеджер построен на шаблонах Smarty. Файлы темы по умолчанию лежат в `manager/templates/default`. Системная настройка `manager_theme` хранит имя каталога внутри `manager/templates/`, и менеджер сначала читает файлы этой темы, а к тем, которых в ней нет, обращается к файлам темы `default`. +Менеджер построен на шаблонах Smarty. Файлы стандартной темы лежат в `manager/templates/default`. Системная настройка `manager_theme` хранит имя каталога внутри `manager/templates/`. Менеджер сначала читает файлы этой темы, а недостающие берёт из `default`. -В MODX 3 поставляется только тема `default`. Остальные приходят со сборкой или с дополнением, либо делаются вами. +В MODX 3 поставляется только тема `default`. Остальные приходят со сборкой, с дополнением или делаются вами. -Тема охватывает не только страницы менеджера: из неё же резолвятся шаблоны виджетов дашбордов и переменных шаблона, а также контроллеры ресурсов. +Тема покрывает не только страницы менеджера. Из неё же берутся шаблоны виджетов панелей и TV, а также контроллеры ресурсов. ## Переопределение одного файла @@ -23,7 +24,7 @@ description: "Переопределить файлы менеджера MODX с Затем задайте в `manager_theme` значение `my-brand`. Файл из `my-brand` заменит файл из `default`. **Создайте каталог до того, как выберете тему** -Настройка — это выпадающий список каталогов `manager/templates/`, и его значение нельзя вписать руками. Сначала создайте `manager/templates/my-brand/`, потом выберите его в **Admin → Системные настройки**. +Настройка это выпадающий список каталогов `manager/templates/`. Значение нельзя вписать руками. Сначала создайте `manager/templates/my-brand/`, потом выберите его в **Админ → Системные настройки**. ## Что обязано быть в теме @@ -36,21 +37,21 @@ description: "Переопределить файлы менеджера MODX с | `images/login/default-background.jpg` | Фон страницы входа. | | `email/default.tpl` | Создание пользователя: шаблон письма не найден. | -**Стили страницы входа не темизируются** -`security/login.tpl` подключает стиль темы `default` по жёстко зашитому пути. Чтобы оформить его, положите `css/login.css` в каталог темы и поправьте ссылку в собственной копии `security/login.tpl`. То же самое с браузером файлов: его `browser/index.tpl` подключает `css/index.css` темы `default`. +**Стили страницы входа тема не перекрывает** +`security/login.tpl` подключает стиль темы `default` по жёстко заданному пути. Чтобы оформить его, положите `css/login.css` в каталог темы и поправьте ссылку в своей копии `security/login.tpl`. То же с браузером файлов: его `browser/index.tpl` подключает `css/index.css` темы `default`. -Стили самого менеджера темизируются: положите `css/index.css` в каталог темы, и шапка подхватит его через плейсхолдер `{$indexCss}`. +Стили самого менеджера тема перекрывает. Положите `css/index.css` в каталог темы, и шапка подхватит его через плейсхолдер `{$indexCss}`. ## Где должна лежать тема -Каталог темы ищется внутри `manager/templates/` — это часть каталога установки, который перезаписывается при обновлении. Держите файлы темы в своём репозитории и восстанавливайте их после обновления. +Каталог темы ищется внутри `manager/templates/`. Это часть каталога установки, и обновление его перезаписывает. Держите файлы темы в своём репозитории и восстанавливайте их после обновления. -**Обновление сбрасывает тему** -При обновлении в режиме Evolve скрипт `setup/includes/upgrade.install.php` возвращает `manager_theme` в `default`. Проверяйте значение после каждого обновления. +**Обновление с Evolution сбрасывает тему** +Когда установщик обновляет сайт с Evolution, `setup/includes/upgrade.install.php` возвращает `manager_theme` в `default`. Обновление внутри MODX 3 настройку не трогает. ## Переопределение контроллера -Контроллер переопределяется так же, только вместо `templates` в пути стоит `controllers`. Файл в теме должен называться так же, как в `default` (`.class.php`), а класс внутри него — называться `ManagerController` в глобальном пространстве, например `SecurityLoginManagerController`. +Контроллер переопределяется так же. В пути вместо `templates` стоит `controllers`. Файл в теме называется так же, как в `default` (`.class.php`). Класс внутри него называется `ManagerController` в глобальном пространстве, например `SecurityLoginManagerController`. ## Смотрите также diff --git a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md index 0c615b214..55f6fd930 100644 --- a/ru/building-sites/client-proofing/dashboards/creating-a-widget.md +++ b/ru/building-sites/client-proofing/dashboards/creating-a-widget.md @@ -4,11 +4,9 @@ translation: "building-sites/client-proofing/dashboards/creating-a-widget" description: "Создание виджета панели управления в MODX: поля виджета, размеры и как поместить его на панель." --- -В этой статье описано, как создать собственный виджет панели управления, включая краткий обзор типов виджетов и принципов их работы. - ## Создание базового виджета -Откройте страницу панелей управления (**Admin → Панели управления** в верхнем меню) и перейдите на вкладку **Widgets**. Нажмите **Создать**. Откроется экран создания виджета. На нём эти поля: +Откройте страницу панелей управления (**Админ → Панели управления** в верхнем меню) и перейдите на вкладку **Виджеты**. Нажмите **Создать**. Откроется экран создания виджета. На нём эти поля: | Поле | Что в нём | | --- | --- | @@ -16,12 +14,12 @@ description: "Создание виджета панели управления | **Description** | Краткое описание виджета для внутреннего использования. | | **Widget Type** | Тип виджета. Для первого виджета выберите «HTML». | | **Size** | Один из семи размеров: Quarter, One Third, Half, Two Third, Three Quarters, Full Size и Double Size. | -| **Permission** | Право менеджера, которое нужно пользователю, чтобы виджет появился. Пусто — виджет виден всем. | +| **Permission** | Право менеджера, которое нужно пользователю, чтобы виджет появился. Пусто: виджет виден всем. | | **Namespace** | Пространство имён, с которым связан виджет. Оставьте «core», если вы не пишете дополнение. | | **Lexicon** | Лексикон, который грузится вместе с виджетом. По умолчанию «core:dashboards». | | **Properties** | Произвольные свойства виджета, которые хранятся в JSON. Виджет-файл или виджет-сниппет получает их как `$scriptProperties`. | -Имя виджета должно быть уникальным. Когда вы вводите имя, под полем появляется текст, повторяющий ваш ввод: это автоматический перевод имён виджетов, он ищет ключ в лексиконе виджета. Введите ключ существующей записи, например `w_configcheck`, и увидите переведённое имя. +Когда вы вводите имя, под полем появляется текст, повторяющий ввод. Это перевод имени: он ищет ключ в лексиконе виджета. Введите ключ существующей записи, например `w_configcheck`, и увидите переведённое имя. В содержимое виджета вставьте: @@ -39,33 +37,34 @@ description: "Создание виджета панели управления Вернитесь на главную страницу панелей управления, откройте вкладку **Dashboards** и найдите панель по умолчанию. Щёлкните по ней правой кнопкой мыши и выберите **Редактировать**. Откроется страница редактирования. -Нажмите **Place Widget** над таблицей виджетов. Выберите **Hello World** в выпадающем списке и сохраните. Виджет добавлен на панель. Перетащите его на позицию №2 между виджетами **Configuration Check** и **MODX News Feed**: +Нажмите **Добавить виджет** над таблицей виджетов. Выберите **Hello World** в выпадающем списке и сохраните. Виджет добавлен на панель. Перетащите его на позицию №2 между виджетами **Configuration Check** и **MODX News Feed**: ![](dashboard-create2.png) Сохраните панель. -> **Примечание:** Добавление виджета через менеджер панелей (как описано выше) помещает его в **шаблон** панели. Если панель [настраиваемая](building-sites/client-proofing/dashboards "Dashboards"), виджет автоматически появится у всех существующих пользователей этой панели, а также у новых. +> [!NOTE] +> Добавление виджета через страницу панелей помещает его в **шаблон** панели. Если панель [настраиваемая](building-sites/client-proofing/dashboards "Панели управления"), виджет появляется у всех существующих пользователей этой панели и у новых. > -> Добавление виджета прямо на странице панели (через сам просмотр панели) добавляет его только для текущего пользователя. Другие пользователи его не увидят, пока виджет не добавят в шаблон. +> Добавление виджета прямо на странице панели добавляет его только текущему пользователю. Остальные его не увидят, пока виджет не добавят в шаблон. > > Виджет, добавленный в шаблон, приходит к существующим пользователям со стандартным размером и в конце списка, а не с тем размером, который указан в шаблоне. > -> На крупных сайтах с большим числом пользователей добавление виджета в шаблон создаёт запись размещения для каждого пользователя, у которого уже есть личная копия этой панели. Учитывайте это, если важна производительность. +> На крупном сайте добавление виджета в шаблон создаёт запись размещения для каждого пользователя с личной копией этой панели. Учитывайте это, если важна производительность. ### Просмотр виджета -Нажмите на логотип MODX в левом верхнем углу. Вы увидите новый виджет на панели. +Нажмите логотип MODX в левом верхнем углу. На панели будет новый виджет. ![](dashboard-create3.png) ## Удаление виджета -Виджет удаляется на вкладке Widgets, и при этом он убирается со всех панелей, где он был размещён. Виджеты, которые поставляются с MODX, удалить нельзя. +Виджет удаляется на вкладке **Виджеты**, и при этом он убирается со всех панелей, где он был размещён. Виджеты, которые поставляются с MODX, удалить нельзя. ## Другие типы виджетов -Доступны и другие типы виджетов. См. раздел [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types "Dashboard Widget Types"). +Другие типы описаны в разделе [Типы виджетов панели управления](building-sites/client-proofing/dashboards/widget-types "Типы виджетов панели управления"). ## Смотрите также diff --git a/ru/building-sites/client-proofing/dashboards/managing.md b/ru/building-sites/client-proofing/dashboards/managing.md index d72544884..646ce6f6b 100644 --- a/ru/building-sites/client-proofing/dashboards/managing.md +++ b/ru/building-sites/client-proofing/dashboards/managing.md @@ -4,25 +4,23 @@ translation: "building-sites/client-proofing/dashboards/managing" description: "Редактирование панели управления в MODX: назначение и размещение виджетов, своя панель и порядок изменений шаблона." --- -В этой статье описано, как редактировать панель управления, в том числе как назначать и размещать виджеты на этой панели. - ## Редактирование панели управления -Откройте главную страницу панелей управления: в верхнем меню это **Admin → Панели управления**. На первой вкладке вы увидите таблицу панелей, скорее всего только «Default». Щёлкните по строке правой кнопкой мыши и выберите **Редактировать**. Откроется страница редактирования панели. +Откройте главную страницу панелей управления: в верхнем меню это **Админ → Панели управления**. На первой вкладке вы увидите таблицу панелей, скорее всего только «Default». Щёлкните по строке правой кнопкой мыши и выберите **Редактировать**. Откроется страница редактирования панели. -Ниже полей имени и описания вы увидите таблицу виджетов панели. Перетаскивайте виджеты, чтобы изменить порядок. Добавляйте виджеты кнопкой «Place Widget». Удаляйте виджеты через контекстное меню по правому щелчку: +Ниже полей имени и описания вы увидите таблицу виджетов панели. Перетаскивайте виджеты, чтобы изменить порядок. Добавляйте виджеты кнопкой **Добавить виджет**. Удаляйте виджеты через контекстное меню по правому щелчку: ![](dashboard-edit.png) -Имя и описание панели «Default» изменить нельзя: это панель, которую видит пользователь, которому не назначили другую. +Имя панели Default в форме изменить нельзя. Описание можно. Это панель, которую видит пользователь, которому не назначили другую. ## Создание и удаление панели -На странице есть кнопка **Создать**, которая делает вашу собственную панель. В контекстном меню панели рядом с **Редактировать** есть **Дублировать** и **Удалить**. Дублирование копирует виджеты и их размещение — копию вы меняете как хотите. +На странице есть кнопка **Создать**, которая делает вашу собственную панель. В контекстном меню панели рядом с **Редактировать** есть **Дублировать** и **Удалить**. Дублирование копирует виджеты и их размещение. Копию вы меняете как хотите. Панель «Default» удалить нельзя. Когда панель удаляют, назначенные ей группы возвращаются к «Default». -Таблицу панелей можно фильтровать по группе пользователей — так быстрее всего найти панель конкретной группы. +Таблицу панелей можно фильтровать по группе пользователей. Так быстрее всего найти панель конкретной группы. ## Шаблон и личные изменения @@ -31,9 +29,7 @@ description: "Редактирование панели управления в - **Добавление виджета** здесь покажет его всем текущим пользователям панели. - **Удаление виджета** здесь уберёт его из всех личных панелей. -Это отличается от правок прямо на странице панели (кнопка закрытия виджета или добавление с панели). Такие правки касаются только текущего пользователя. - -Чтобы изменить виджеты для всех, правьте эту страницу управления. Чтобы поправить только свою панель, меняйте её на самой странице панели. +Правки прямо на странице панели устроены иначе. Кнопка закрытия виджета и добавление виджета с самой панели касаются только текущего пользователя. Виджет, добавленный в шаблон, приходит к существующим пользователям со стандартным размером и в конце списка. diff --git a/ru/building-sites/client-proofing/form-customization/index.md b/ru/building-sites/client-proofing/form-customization/index.md index 83084bb44..14e9a45cd 100644 --- a/ru/building-sites/client-proofing/form-customization/index.md +++ b/ru/building-sites/client-proofing/form-customization/index.md @@ -8,19 +8,19 @@ description: "Настройка форм в MODX: профили, наборы Настройка форм позволяет менять формы менеджера: спрятать поле, переименовать его, подставить другое значение, перенести TV на другую вкладку. -Раздел находится в **Admin → Form Customization** и требует права **customize_forms**. +Раздел находится в **Админ → Настройка форм** и требует права **customize_forms**. ## Три слоя > Профиль → Набор → Правила -**Профиль** — это набор наборов, и его можно привязать к группам пользователей. **Набор** — это набор правил, привязанный к странице менеджера. **Правило** — одно изменение, которое набор вносит в форму. +**Профиль** собирает наборы. Его можно привязать к группам пользователей. **Набор** собирает правила и привязан к странице менеджера. **Правило** вносит в форму одно изменение. Правила не правятся отдельно: они пересобираются из трёх сеток набора при каждом его сохранении. Смотрите [Правила настройки формы](building-sites/client-proofing/form-customization/rules "Правила настройки формы"). ## Как это хранится -Профиль хранит наборы, а набор — свои правила. Список полей и областей, которые можно менять, хранится в справочнике и заполняется при установке MODX. +Профиль хранит наборы. Набор хранит свои правила. Список полей и областей, которые можно менять, хранится в справочнике и заполняется при установке MODX. ## Какие формы можно настроить @@ -34,7 +34,7 @@ description: "Настройка форм в MODX: профили, наборы | Edit Resource | Страницу редактирования ресурса. | | Create & Edit Resource | На обе страницы сразу. | -В последнем случае набор покрывает обе страницы, а список полей и областей он предлагает взятым со страницы редактирования ресурса. +В последнем случае набор покрывает обе страницы. Список полей и областей он берёт со страницы редактирования ресурса. ## Смотрите также diff --git a/ru/building-sites/client-proofing/form-customization/tabs.md b/ru/building-sites/client-proofing/form-customization/tabs.md index 8adc62256..b60b25702 100644 --- a/ru/building-sites/client-proofing/form-customization/tabs.md +++ b/ru/building-sites/client-proofing/form-customization/tabs.md @@ -4,9 +4,10 @@ translation: "building-sites/client-proofing/form-customization/tabs" description: "Области формы ресурса в MODX, которые настройка форм может спрятать или переименовать, и как добавить свою область." --- -Когда вы используете настройку форм для настройки форм в менеджере MODX, вы можете либо разрешить / запретить доступ к определенным полям, либо разрешить / запретить доступ ко всем вкладкам или *частям* вкладок. +Настройка форм прячет или переименовывает вкладки формы ресурса целиком и их части. -**Если область — не вкладка** При настройке правил в разделе **Admin → Form Customization**, а затем при редактировании набора, существует список «Областей», но он не соответствует непосредственно знакомым «Документ», «Настройки», «Переменные шаблона» и «Ресурсные группы». Идентификаторы областей, перечисленные здесь, относятся ко всем вкладкам или *частям* вкладок. +**Если область не вкладка** +В **Админ → Настройка форм** при правке набора есть список «Областей». Он не совпадает со вкладками «Документ», «Настройки», «Переменные шаблона» и «Ресурсные группы». Идентификаторы в списке относятся ко вкладке целиком или к *части* вкладки. ## Области формы @@ -36,13 +37,13 @@ description: "Области формы ресурса в MODX, которые ## Добавление новых вкладок -Добавить новую вкладку довольно просто. Отредактируйте свой набор и откройте вкладку **Regions**. Нажмите **Создать**, задайте области идентификатор, например `my-new-tab`, и **Title**. +Отредактируйте набор и откройте вкладку **Regions**. Нажмите **Создать**, задайте области идентификатор, например `my-new-tab`, и **Title**. ![](fc_new_tab.jpg) Каждый раз, когда вам нужно обратиться к области, например при переносе TV на новую вкладку, используйте идентификатор, который вы ей дали. -Идентификатор должен быть уникален в пределах набора. Область, созданная так, удаляется снова пунктом **Delete** её контекстного меню; области самой формы удалить нельзя. +Идентификатор должен быть уникален в пределах набора. Область, созданная так, снова удаляется пунктом **Delete** её контекстного меню. Области самой формы удалить нельзя. ## Смотрите также diff --git a/ru/building-sites/client-proofing/manager-login.md b/ru/building-sites/client-proofing/manager-login.md index 6ce2fd9a1..059302f62 100644 --- a/ru/building-sites/client-proofing/manager-login.md +++ b/ru/building-sites/client-proofing/manager-login.md @@ -4,15 +4,15 @@ translation: "building-sites/client-proofing/manager-login" description: "Страница входа в менеджер MODX: логотип, фоновое изображение, блок справки, язык и настройки, которые их меняют." --- -В MODX 3 внешний вид страницы входа в Менеджер настраивается проще. +У страницы входа в MODX 3 свои настройки, свой шаблон и свои события. Внешний вид можно сменить, не трогая остальной менеджер. ## Логотип -По умолчанию используется логотип MODX из `/manager/templates/default/images/modx-logo-color.svg`. +По умолчанию используется логотип сайта из `/manager/templates/default/images/modx-logo-color.svg`. Чтобы поставить другой логотип, укажите URL изображения в системной настройке `login_logo`. Подойдёт локальный файл или полный внешний URL. Ширина ограничена 192 CSS-пикселями. -Логотип используется и в письмах Менеджера — в стандартном шаблоне `email/default.tpl`. +Логотип используется и в письмах менеджера, в стандартном шаблоне `email/default.tpl`. **Своей теме нужен свой логотип** Логотип по умолчанию читается из каталога темы, без отката на `default`. В теме без `images/modx-logo-color.svg` на странице входа будет битый логотип. @@ -21,17 +21,18 @@ Favicon страницы задаётся отдельно, настройкой ## Фоновое изображение -Фон страницы входа по умолчанию лежит в `/manager/templates/default/images/login/default-background.jpg`. Фото в MODX 3.0.0 снял Christian Seel: горный хребет у Engelberg, Швейцария. Новый экран входа собирали там на SnowUp. ([Источник](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)) +Фон страницы входа по умолчанию лежит в `/manager/templates/default/images/login/default-background.jpg`. Фото в MODX 3.0.0 снял Christian Seel ([источник](https://github.com/modxcms/revolution/pull/13773#issuecomment-364594061)). -> Если вы используете кастомную тему Менеджера, добавьте и файл `/manager/templates/YOUR-THEME/images/login/default-background.jpg` как фон по умолчанию. +Чтобы сменить фон, укажите адрес изображения в системной настройке `login_background_image`. Подойдёт локальный файл или полный внешний URL. Лучше работает горизонтальное изображение. -Чтобы сменить фон, укажите URL в системной настройке `login_background_image`. Подойдёт локальный файл или полный внешний URL. Лучше работает landscape-изображение. +> [!NOTE] +> Если вы используете свою тему менеджера, добавьте и файл `/manager/templates/YOUR-THEME/images/login/default-background.jpg` как фон по умолчанию. ### Смена из кода -Фон можно менять и плагином. +Фон можно задать и плагином. Так каждому посетителю достаётся своя картинка. -Готовый пример: Extra [DailyPhoto](https://modx.com/extras/package/dailyphoto) каждый день подставляет случайное фото с Unsplash. +Готовый пример: дополнение [DailyPhoto](https://modx.com/extras/package/dailyphoto). Каждый день оно подставляет случайное фото с Unsplash. Свою логику сделайте плагином на событие `OnManagerLoginFormRender`: @@ -39,19 +40,28 @@ Favicon страницы задаётся отдельно, настройкой $modx->controller->setPlaceholder('background', '/full/url/to/image.jpg'); ``` -Событие `OnManagerLoginFormPrerender` делает то же самое, но его вывод вставляется перед формой. +Событие `OnManagerLoginFormPrerender` вставляет свой вывод перед формой. Плагин на этом событии не задаёт фон: тема записывает плейсхолдер уже после Prerender. ## Блок справки -На странице входа есть блок помощи, но по умолчанию он выключен. Включите системную настройку `login_help_button`. Внизу панели входа появится ссылка Help. +На странице входа есть блок помощи. По умолчанию он выключен. Включите системную настройку `login_help_button`, и внизу панели входа появится ссылка Help. -Текст блока лежит в лексиконе. Откройте **Admin → Лексиконы**. Namespace: `core`, topic: `login`, нужный язык. Ключи: `login_help_button_text`, `login_help_text`, `login_help_title`. Правьте значение двойным кликом. +Текст блока лежит в лексиконе. Откройте **Админ → Управление словарями**. Namespace: `core`, topic: `login`, нужный язык. Ключи: `login_help_button_text`, `login_help_text`, `login_help_title`. Правьте значение двойным кликом. Текст приветствия выбирается по времени суток из ключей `login_greeting_morning`, `login_greeting_afternoon`, `login_greeting_evening` и `login_greeting_night` той же темы. ## Язык -Язык страницы входа выбирается прямо на ней. Это не настройка `manager_language`: в MODX 3 такую настройку удаляют при обновлении, а язык живёт в сессии. Страница входа берёт язык из запроса, затем из сессии, затем из заголовка `Accept-Language` браузера, иначе использует `en`. +Язык страницы входа выбирается прямо на ней. Это не настройка `manager_language`. В MODX 3 такую настройку удаляют при обновлении, а язык живёт в сессии. + +Страница берёт первый источник, в котором язык есть: + +| Порядок | Источник | +| --- | --- | +| 1 | Запрос | +| 2 | Сессия | +| 3 | Браузер | +| 4 | `en` | ## Другие настройки @@ -66,11 +76,11 @@ $modx->controller->setPlaceholder('background', '/full/url/to/image.jpg'); ## Вход без пароля -При необходимости включите [вход по magic link](building-sites/client-proofing/security/passwordless-login) вместо логина и пароля. С настройкой `passwordless_activated` форма показывает только поле для адреса почты. Срок действия ссылки задаёт настройка `passwordless_expiration`, по умолчанию 3600 секунд. +Вместо имени и пароля страница может предложить [вход по волшебной ссылке](building-sites/client-proofing/security/passwordless-login). С настройкой `passwordless_activated` форма показывает только поле для адреса почты. Срок действия ссылки задаёт настройка `passwordless_expiration`, по умолчанию 3600 секунд. ## Смотрите также 1. [Настройка системы управления для клиента](building-sites/client-proofing) 2. [Пользовательские темы системы управления](building-sites/client-proofing/custom-manager-themes) 3. [Настройка входа в Менеджер](building-sites/client-proofing/manager-login) -4. [Вход по magic link](building-sites/client-proofing/security/passwordless-login) +4. [Вход без пароля](building-sites/client-proofing/security/passwordless-login) diff --git a/ru/building-sites/client-proofing/security/roles.md b/ru/building-sites/client-proofing/security/roles.md index c5aefbf00..29b44fd8c 100644 --- a/ru/building-sites/client-proofing/security/roles.md +++ b/ru/building-sites/client-proofing/security/roles.md @@ -6,13 +6,11 @@ description: "Роли MODX: число authority, которое они нес ## Что такое роль? -Роль это должность или статус в конкретной ситуации. В MODX ею задают положение пользователя внутри группы пользователей, например "Editor" или "Front-end Read Only". +Роль задаёт положение пользователя внутри группы пользователей, например "Editor" или "Front-end Read Only". -Роли в MODX используют целое число Authority. **Меньшее число означает более сильные полномочия.** Пользователь проходит проверку ACL, когда authority его роли **не больше** authority самого ACL, поэтому пользователь с ролью authority 10 проходит все ACL, которые проходит пользователь с ролью authority 11. +Роли используют целое число Authority. **Меньшее число означает более сильные полномочия.** Пользователь проходит проверку ACL, когда authority его роли **не больше** authority этого ACL. Пользователь с ролью authority 10 проходит все ACL, которые проходит пользователь с ролью authority 11. -Говоря об Authority, формулируйте аккуратно: обратная зависимость часто путает формулировки. - -Authority удобно мыслить как порядковые номера: первый, второй, третий и так далее. **Authority=1** это первые полномочия и они сильнее **Authority=2** (вторых). +Authority удобно читать как порядковый номер: первый, второй, третий. **Authority=1** это первые полномочия, и они сильнее **Authority=2**. **Номера Authority уникальны** База не даст создать две роли с одинаковым authority: у столбца уникальный индекс. @@ -30,34 +28,38 @@ Authority удобно мыслить как порядковые номера: ## Права страницы -Странице ролей нужны права: `view_role` — увидеть список, `new_role` и `save_role` — создать роль, `edit_role` — изменить, `delete_role` — удалить. +| Право | Что даёт | +| --- | --- | +| `view_role` | Увидеть список. | +| `new_role`, `save_role` | Создать роль. | +| `edit_role` | Изменить роль. | +| `delete_role` | Удалить роль. | ## Использование -Частый пример: роли по структуре должностей. Допустим, вы создаёте такие роли и уровни Authority: +Создайте роли по должностям. Authority должен быть уникальным. У Super User уже стоит 0, у Member уже стоит 9999. -- Administrator - 0 - Director - 1 - Coordinator - 2 - Supervisor - 3 -- Employee - 9999 +- Employee - 10 ![](roles-grid.png) -Затем создайте группу пользователей "HR Department". Внутри группы назначьте пользователям эти роли (на одну роль может приходиться несколько пользователей). +Создайте группу пользователей "HR Department" и назначьте пользователям эти роли. На одну роль может приходиться несколько пользователей. -Допустим, у John роль Coordinator, у Mark роль Supervisor. Группе пользователей "HR Deparment" вы даёте Access Policy (набор Permissions) с именем "AccountPolicy" и такими Access Permissions: +У John роль Coordinator, у Mark роль Supervisor. Группе "HR Department" дайте политику доступа "AccountPolicy" на контексте "web" и поставьте Minimum Role в "Supervisor": -- view\_accounts -- save\_accounts +![](ug-ctx-grid1.png) -Эту политику вы назначили контексту "web" для группы "HR Department". Значение Minimum Role поставили в "Supervisor": +В политике такие разрешения: -![](ug-ctx-grid1.png) +- `view_accounts` +- `save_accounts` -Значит, у Mark есть эти Permissions: он в группе и его роль не слабее "Supervisor" (именно эту роль он и занимает). +У Mark есть эти разрешения. Он в группе, и его роль не слабее "Supervisor". -Но **также** эти Permissions есть у John: у него роль "Coordinator" с более сильным Authority, чем у "Supervisor". То есть John как Coordinator «унаследовал» Permissions, которые Mark имел как Supervisor. +Они есть и у John. У Coordinator authority сильнее, чем у Supervisor, поэтому у John есть разрешения, которые есть у Mark как у Supervisor. ## Смотрите также diff --git a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md index 821d75277..1b33aaa6e 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/giving-a-user-manager-access.md @@ -6,19 +6,19 @@ description: "Дать пользователю MODX права менеджер ## Задача -Нужен доступ к редактированию в Менеджере без полного набора [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions") администратора. Учебник частично написан BobRay. +Нужен доступ к редактированию в менеджере без полного набора [разрешений](building-sites/client-proofing/security/policies/permissions "Разрешения") администратора. Часть учебника написал BobRay. ## Решение -1. В **Access Control Lists** → вкладка **Roles** создайте роль (например, `Editor`) с authority `10`. -2. В **Settings → Access Control Lists → Access Policies** продублируйте политику Administrator и переименуйте (например, `AdminLite`). +1. В иконке замка → **Контроль доступа** откройте вкладку **Роли** и создайте роль (например, `Editor`) с authority `10`. +2. На вкладке **Политики доступа** продублируйте политику Administrator и переименуйте (например, `AdminLite`). 3. В политике AdminLite оставьте только нужные [Permissions](building-sites/client-proofing/security/policies/permissions "Permissions"). -4. В **Settings → Access Control Lists → User Groups** кликните правой кнопкой группу `Administrator` и выберите **Update User Group**. -5. На вкладке **Context Access** добавьте две строки: +4. На вкладке **Группы пользователей & Пользователи** щёлкните правой кнопкой группу `Administrator` и выберите **Редактировать группу пользователя**. +5. На вкладке **Контексты** нажмите **Добавить доступ к контексту** и добавьте две строки: 1. Context: `mgr`, Minimum Role: `Editor`, Access Policy: `AdminLite` 2. Context: `web`, Minimum Role: `Editor`, Access Policy: `Load, List and View` -6. В **Manage → Users** создайте пользователя или откройте существующего. На вкладке Access Permissions добавьте его в группу Administrator с ролью Editor. -7. Откройте **Security → Flush Sessions** и войдите снова. +6. В иконке замка → **Пользователи** создайте пользователя или откройте существующего. На вкладке **Права доступа** добавьте его в группу Administrator с ролью Editor. +7. Откройте иконку замка → **Завершить все сеансы** и войдите снова. ## Публикация в менеджере diff --git a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md index 3cf28fa2d..1499fc331 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/making-member-only-pages.md @@ -4,79 +4,73 @@ translation: "building-sites/client-proofing/security/security-tutorials/making- description: "Защитить страницы сайта на MODX так, чтобы их видели только участники группы." --- -## Введение +## Шаги -В MODX Revolution другая система безопасности: больше гибкости при выдаче (и запрете) доступа к ресурсам Manager и Web. Этот документ помогает войти в основы этой продвинутой схемы. +Эти шаги закрывают страницы сайта так, чтобы их видели только определённые пользователи. Считается, что регистрация и вход уже сделаны пакетом [Login](/extras/login "Login"). На то, какие ресурсы пользователь видит или правит в менеджере, шаги не влияют. -На front-end часто нужны страницы, которые видят только определённые пользователи. Урок показывает, как сделать это в MODX Revolution. Предполагается, что вы уже умеете регистрировать пользователей и входить через компоненты пакета [Login](/extras/login "Login"). Описанные шаги не влияют на то, какие ресурсы пользователь видит или правит в MODX Manager. - -Если вы уже ориентируетесь, ниже краткий список. Он проведёт по схеме или напомнит порядок. Если нужны подробности и примеры, прокрутите к соответствующим подразделам. - -1. Создайте Resource Group (иконка замка в меню пользователя → **Resource Groups** -> Create Resource Group) -2. Привяжите ресурс «только для участников» к Resource Group. (Через редактирование ресурса или перетаскиванием из дерева ресурсов вправо) -3. Создайте User Group (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> New User Group) +1. Создайте группу ресурсов (иконка замка в меню пользователя → **Resource Groups** → **Create Resource Group**) +2. Привяжите ресурс «только для участников» к группе ресурсов. (Через редактирование ресурса или перетаскиванием из дерева ресурсов вправо) +3. Создайте группу пользователей (иконка замка в меню пользователя → **Контроль доступа** → вкладка **Группы пользователей & Пользователи** → New User Group) 4. На вкладке Resource Group Access добавьте запись (context: web, minimum role: Member (9999), access policy: Resource) -5. Добавьте пользователей в группу с ролью Member. (иконка замка в меню пользователя → **Users**) -6. Сбросьте права (**Flush Your Permissions**) и проверьте в другом браузере (не просто в другом окне: в другом браузере) +5. Добавьте пользователей в группу с ролью Member. (иконка замка в меню пользователя → **Пользователи**) +6. Сбросьте права (**Перезагрузить права доступа**) и проверьте в другом браузере (не в другом окне того же браузера: в другом браузере) ## Access Wizard -В MODX 2.2.2 есть access wizard, который упрощает процесс. Пошаговое объяснение по-прежнему верно, но wizard сокращает шаги. Имеет смысл прочитать оба варианта, чтобы лучше понять, как части системы безопасности MODX связаны. +Мастер группы ресурсов проводит по всему процессу. Результат тот же, что при ручной настройке каждого шага. -### 1. Создайте Resource Group +### 1. Создайте группу ресурсов -Откройте иконка замка в меню пользователя → **Resource Groups** и нажмите Create Resource Group. Появится окно примерно такое: ![](create-resource-group.png) +[Группа ресурсов](building-sites/client-proofing/security/resource-groups "Группы ресурсов") собирает ресурсы, которые можно связать с группами пользователей и записями доступа. -Разберём секции: +Откройте иконку замка в меню пользователя → **Resource Groups** и нажмите **Create Resource Group**. Появится окно примерно такое: ![](create-resource-group.png) | Section | Explanation | Tutorial Default | | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | | Name | Имя создаваемой группы ресурсов. Сделайте его понятным и лёгким для запоминания. | Protected | | Contexts | Контекст, в котором действуют правила. В этом уроке один контекст, "web", и скрывать нужно только там. | web | -| Automatically give Administrator Group Access | Если отметить, все пользователи группы administrator по умолчанию получат доступ к группе ресурсов. С 2.2.1 пользователь admin по умолчанию помечен как "sudo" и видит все группы ресурсов независимо от доступа группы administrator. Если есть другие администраторы без sudo и вы хотите, чтобы они видели ресурсы группы, отметьте этот пункт. | checked | -| Automatically give Anonymous Group Access | Если отметить, все пользователи группы anonymous получат доступ к группе ресурсов. Посетитель сайта без входа считается в группе anonymous. Мы защищаем страницы от незалогиненных, поэтому в уроке оставляем пункт снятым. | unchecked | +| Automatically give Administrator Group Access | Если отметить, все пользователи группы administrator по умолчанию получат доступ к группе ресурсов. Пользователь admin по умолчанию помечен как "sudo", а sudo обходит проверки политик, поэтому он видит все группы ресурсов независимо от доступа группы administrator. Если есть другие администраторы без sudo и им нужно видеть ресурсы группы, отметьте этот пункт. | checked | +| Automatically give Anonymous Group Access | Если отметить, анонимный пользователь получит доступ к группе ресурсов. Посетитель без входа и есть анонимный пользователь. В этом уроке страницы закрыты от него, поэтому пункт оставляем снятым. | unchecked | | Create Parallel User Group | Не обязательно держать всех, кто видит страницы «только для участников», в группе administrator (если отметили "Automatically give Administrator Group Access"). Можно создать другую группу пользователей с доступом к ресурсам этой группы ресурсов. Отметьте: участники не администраторы. | checked | | Automatically Give Other User Groups Access | Если до урока у вас уже были группы пользователей, которым нужен доступ, перечислите их здесь. | | -Готово: есть группа ресурсов и группа пользователей. Дальше добавьте ресурсы в группу ресурсов и пользователей в группу пользователей. +### 2. Добавьте ресурсы в группу ресурсов -### 2. Добавьте ресурсы в Resource Group +Укажите MODX, какие ресурсы защищать. Оставайтесь на странице из шага 1 (иконка замка в меню пользователя → **Resource Groups**). Справа откройте контекст web, чтобы видеть страницы сайта. Перетащите их из правой колонки в группу ресурсов. Либо откройте каждый ресурс, вкладку **Resource Groups** (**Группы ресурсов**) и отметьте **Access** (**Доступ**) в строке "Protected". -Укажите MODX, какие ресурсы защищать. Оставайтесь на странице из шага 1 (иконка замка в меню пользователя → **Resource Groups**). Справа откройте контекст web, чтобы видеть страницы сайта. Перетащите их из правой колонки в группу ресурсов. Либо откройте каждый ресурс, вкладку Resource Groups и отметьте **Access** в строке "Protected". +### 3. Добавьте пользователей в группу пользователей -### 3. Добавьте пользователей в User Group +Откройте иконку замка → **Контроль доступа**. На вкладке **Группы пользователей & Пользователи** виден список групп. Щёлкните правой кнопкой группу «Protected» и выберите **Добавить пользователя в группу**. В "Name" выберите пользователя. В Role пока поставьте "Member". Роли задают, что пользователь может внутри группы, но для урока такая тонкость не нужна. Нажмите Save. -Со страницей Resource Group закончили. Откройте иконка замка в меню пользователя → **Access Control Lists**. На вкладке Users Groups виден список групп. Правым кликом по группе "Protected" выберите "Add User to Group". В "Name" выберите пользователя. В Role пока поставьте "Member". Роли задают, что пользователь может внутри группы, но для урока такая тонкость не нужна. Нажмите Save. +Ресурс защищён, когда он (1) назначен в одну или несколько групп ресурсов и (2) группа связана с группой пользователей через контроль доступа. Такие страницы не показываются пользователям вне этой связи. По умолчанию это страница 404. Чтобы вернуть 401, дайте анонимному пользователю разрешение "load" на группу ресурсов. Подробнее в другом уроке. Сейчас страница ещё не видна: вы ещё не добавили её в группу пользователей. -Важно: как только вы защитили ресурс, (1) назначив его в одну или несколько групп ресурсов и (2) связав группу ресурсов с группой пользователей через access control, эти страницы перестанут показываться пользователям вне связи с группой ресурсов. Поведение по умолчанию: страница 404. Если нужен ответ 401, группе anonymous нужно разрешение "load" на группу ресурсов. Подробнее в другом уроке. Сейчас ваша страница ещё не видна: вы ещё не добавили её в группу пользователей. +Если регистрация идёт через сниппет, проверьте, что новые пользователи попадают в нужную группу. -Ресурсы в группе ресурсов, пользователи в группе пользователей. Готово? Нет: осталось несколько мелочей. Если это ваш первый опыт с безопасностью MODX, часто ловят такой момент: у созданной группы пользователей нет context access к front-end контексту web. То есть если бы контекст был доступен, были бы доступны и защищённые ресурсы. Сейчас контекст недоступен. Дайте группе право смотреть этот контекст. +У созданной группы нет доступа к контексту web. Если бы контекст был доступен, были бы доступны и защищённые ресурсы. Сейчас контекст недоступен. Добавьте этот доступ следующим шагом. -### 4. Добавьте Context Access группе пользователей +### 4. Добавьте доступ к контексту -Откройте иконка замка в меню пользователя → **Access Control Lists**. Правым кликом по защищённой группе выберите "Update user group". Вкладка Context Access. Нажмите "Add Context". Появится диалог как ниже. Разберём: ![](context-access.png) +Откройте иконку замка → **Контроль доступа**. Щёлкните правой кнопкой защищённую группу и выберите **Редактировать группу пользователя**. Откройте вкладку **Контексты** и нажмите **Добавить доступ к контексту**. В диалоге такие поля: ![](context-access.png) | Section | Explanation | Tutorial Default | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| Context | Контекст, к которому даёте доступ. Базовый случай: web и mgr. Web это публичный front-end сайта, mgr это закрытый back-end (менеджер, в котором вы вошли). | web | +| Context | Контекст, к которому даёте доступ. Базовый случай: web и mgr. Web это публичная часть сайта, mgr это менеджер, в котором вы вошли. | web | | Minimum Role | К каким ролям применяется правило. Если ко всем в группе, выберите "Member - 9999". Здесь как раз та тонкая настройка, о которой речь выше. | Member - 9999 | | Access Policy | Какие разрешения получают пользователи. Разные политики дают группам разные возможности. | Administrator | -Сделайте одно правило: "web", "Member - 9999" и "Load, List and View". Если нужен вход в менеджер MODX, добавьте второе правило для mgr: "mgr", "Member - 9999" и "Administrator". Тогда у всех этих пользователей будет admin-доступ. Чтобы сузить права, вместо этого выберите "Content Editor" или "Developer". Либо создайте свою политику в иконка замка в меню пользователя → **Access Control Lists** → вкладка **Policies**, если нужно точно задать, что можно и чего нельзя. - -Пользователи в группе, ресурсы в группе ресурсов, группа видит контекст. Почти готово. +Сделайте одно правило: "web", "Member - 9999" и "Load, List and View". Чтобы пользователи видели менеджер, добавьте второе правило для mgr: "mgr", "Member - 9999" и "Administrator". У этих пользователей будет доступ администратора. Чтобы сузить права, выберите "Content Editor" или "Developer". Свою политику можно создать на вкладке **Политики доступа** в **Контроль доступа**. -### 5. Flush Permissions +### 5. Перезагрузите права доступа -Чтобы увидеть изменения, сбросьте, что видят и делают отдельные пользователи. Откройте **Flush Your Permissions**. На front-end проверяйте в другом браузере. Около 90% проблем идут от проверки не в другом браузере или от пропуска flush. Не ленитесь открыть второй браузер. Готово: страницы только для участников настроены. +Чтобы увидеть изменения, сбросьте, что видят и делают отдельные пользователи. Откройте иконку замка → **Перезагрузить права доступа**. На сайте проверяйте в другом браузере. Большая часть сбоев идёт от проверки в том же браузере или от пропуска этого сброса. Иногда нужно очистить кэш сайта, особенно для контекста mgr: элементы и ресурсы могут кэшировать права. ## Всё ещё не работает? -Пройдите шаги по порядку и убедитесь, что flush permissions выполнен. Если всё кажется верным, проверьте ещё раз и спросите об этом на [MODX Community](https://community.modx.com). +Проверьте шаги и сброс прав. Если страницы всё ещё не открываются, спросите на [MODX Community](https://community.modx.com). -Два источника помогут разобраться в самих правах: [руководство Bob по правам](http://bobsguides.com/revolution-permissions.html) подробно раскрывает модель, а урок [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") показывает базовую зону "Members Only", построенную на Login Snippet. +Два источника помогут разобраться в самих правах. [Руководство Bob по правам](http://bobsguides.com/revolution-permissions.html) подробно раскрывает модель. Урок [Login.Basic Setup](/extras/login/login.tutorials/basic-setup "Login.Basic Setup") показывает базовую зону "Members Only" на Login Snippet. ## Смотрите также diff --git a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md index 212402e1c..1499732be 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/more-on-the-anonymous-user-group.md @@ -6,34 +6,34 @@ description: "Кто такой анонимный пользователь в M ## Кто такой Anonymous? -Любой посетитель сайта без входа — это анонимный пользователь. +Любой посетитель сайта без входа это анонимный пользователь. -**Анонимный пользователь — не группа пользователей** -В базе нет группы «Anonymous». Анонимный пользователь — это список контроля доступа с principal `0`, а в дереве групп он показан псевдоузлом «(Anonymous)». Этот узел можно править так же, как любую группу, но меняете вы при этом доступ анонимного пользователя, а не группы. +**Анонимный пользователь не является группой пользователей** +В базе нет группы «Anonymous». В дереве групп посетитель показан узлом `(аноним)`. Узел правится так же, как любая группа. Меняется при этом доступ анонимного пользователя. -Чтобы его открыть, пройдите по пути **иконка замка в меню пользователя → Access Control Lists**, вкладка **User Groups & Users**. Кликните правой кнопкой по записи «(Anonymous)» и выберите **Update User Group**. ![](access+controls.png) +Откройте иконку замка → **Контроль доступа**, вкладка **Группы пользователей & Пользователи**. Щёлкните правой кнопкой `(аноним)` и выберите **Редактировать группу пользователя**. ![](access+controls.png) ## Что может Anonymous? -По умолчанию анонимный пользователь получает Load Only во всех [Context](building-sites/contexts "Contexts"), кроме `mgr`. Без Load Only запрос к Context вернёт 404 Page Not Found. +По умолчанию анонимный пользователь получает Load Only во всех [контекстах](building-sites/contexts "Contexts"), кроме `mgr`. Без Load Only запрос к контексту вернёт 404 Page Not Found. ![](user+group_+anonymous.png) -Load Only не означает, что ресурс можно View (см. ниже). +Load Only не означает, что ресурс можно View. -Пример: вы создаёте [Resource Group](building-sites/client-proofing/security/resource-groups "Resource Groups") и даёте доступ конкретной User Group. Anonymous эту Resource Group не увидит. На этом строится [создание страниц только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages "Making Member-Only Pages"). +Если создать [группу ресурсов](building-sites/client-proofing/security/resource-groups "Группы ресурсов") и выдать её конкретной группе пользователей, анонимный пользователь её не увидит. На этом строятся [страницы только для участников](building-sites/client-proofing/security/security-tutorials/making-member-only-pages "Страницы только для участников"). ### 401 против 404 на защищённых страницах -Для защищённых Resource Groups у Anonymous по умолчанию нет Load. Ответ будет 404 Page Not Found. Если нужен 401 Unauthorized, дайте Anonymous доступ к Resource Group с политикой Load Only. +У защищённой группы ресурсов у анонимного пользователя по умолчанию нет Load. Ответ будет 404 Page Not Found. Чтобы вернуть 401 Unauthorized, дайте ему доступ к группе ресурсов с политикой Load Only. -Это делается на вкладке Resource Group Access при редактировании Anonymous. +Это делается на вкладке Resource Group Access при редактировании анонимного пользователя. ![](screen+shot+2012-10-19+at+11.43.46+pm.png) -Нажмите **Add Resource Group**, выберите защищённую Resource Group, Context (не `mgr`) и Access Policy Load Only. Сохраните. +Нажмите **Add Resource Group**, выберите защищённую группу ресурсов, контекст (не `mgr`) и политику Load Only. Сохраните. -View по ресурсам в этой группе всё ещё закрыт. Доступен только Load и ответ 401. Кастомную Unauthorized-страницу задайте через [Unauthorized Page System Setting](building-sites/settings/unauthorized_page "unauthorized_page"). +Ресурсы этой группы он по-прежнему не увидит (нет View). Доступен только Load, ответ будет 401. Свою страницу Unauthorized задайте в настройке [Unauthorized Page](building-sites/settings/unauthorized_page "unauthorized_page"). ## Смотрите также diff --git a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md index d79266f5f..ddf9e7cec 100644 --- a/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md +++ b/ru/building-sites/client-proofing/security/security-tutorials/restricting-an-element-from-users.md @@ -6,91 +6,87 @@ description: "Скрыть элемент MODX от пользователей, ## Кратко -Урок показывает, как скрыть любой Element (Template, Snippet и т. д.) в менеджере MODX. Для этого используют Element Category ACL: они защищают Elements в Categories от просмотра. Пользователи группы Editors увидят элементы. Пользователи вне группы их не увидят. +Элемент (Template, Snippet и другие) скрывает ACL его категории. Пользователи группы Editors его видят. Остальные нет. -1. Создайте Category или возьмите существующую -2. Поместите Element, который нужно защитить, в эту Category -3. Создайте User Group или выберите существующую -4. Добавьте пользователей, которым нужен Element, в группу с ролью Member -5. На вкладке Element Category Access добавьте Element Category ACL (context: mgr, minimum role: Member (9999), access policy: Element) -6. Выполните Flush permissions и перезагрузите +1. Создайте категорию или возьмите существующую +2. Поместите элемент, который нужно защитить, в эту категорию +3. Создайте группу пользователей или выберите существующую +4. Добавьте пользователей, которым нужен элемент, в группу с ролью Member +5. На вкладке Element Category Access добавьте ACL категории (context: mgr, minimum role: Member (9999), access policy: Element) +6. Откройте **Перезагрузить права доступа** и обновите страницу ## Пошагово -### 1. Создайте Category +### 1. Создайте категорию -На вкладке Elements в левом дереве нажмите иконку Category на панели или правым кликом по "Categories" внизу выберите "New Category". Создайте и сохраните категорию. Можно взять уже существующую Category. +На вкладке Elements в левом дереве нажмите иконку Category на панели. Или правым кликом по "Categories" внизу выберите "New Category". Сохраните категорию. Можно взять уже существующую. -### 2. Поместите Element в Category +### 2. Поместите элемент в категорию -Отредактируйте Element и задайте ему Category из шага 1. +Отредактируйте элемент и задайте ему категорию из шага 1. -### 3. Создайте User Group +### 3. Создайте группу пользователей -Откройте иконка замка в меню пользователя → **Access Control Lists** в верхнем меню, вкладка "User Groups". Создайте новую группу или выберите существующую. Правым кликом по группе выберите "Update User Group". +Откройте иконку замка → **Контроль доступа**, вкладка **Группы пользователей & Пользователи**. Создайте группу или выберите существующую. Щёлкните её правой кнопкой и выберите **Редактировать группу пользователя**. -В Revolution 2.3.x пункт Access Control Lists лежит в меню Admin (значок шестерёнки). +В форме Access Wizard в поле Context дайте группе "mgr", а категорию укажите в Element Categories. В поле Users можно перечислить пользователей для добавления в группу. Без мастера обновите новую группу правым кликом. -Если используете форму Access Wizard, в поле Context дайте группе доступ "mgr", а Category укажите в Element Categories. В поле Users можно перечислить пользователей для добавления в группу. Если wizard не используете, обновите новую группу правым кликом. +### 4. Добавьте пользователей в группу -### 4. Добавьте пользователей в User Group +На экране группы откройте вкладку Users и добавьте пользователей, которым нужен элемент. Дайте роль **не слабее** Member. Или добавьте пользователя со страницы его редактирования, вкладка Access Permission. -На экране обновления группы откройте вкладку Users и добавьте пользователей, которым нужен Element. Дайте роль **не слабее** Member. Либо добавляйте пользователей в группу со страницы редактирования пользователя, вкладка Access Permission. +### 5. Добавьте ACL категории элемента -### 5. Добавьте Element Category ACL - -Откройте вкладку "Element Category Access". В Revolution 2.3.x она в боковой панели вкладки Permissions группы пользователей. +Откройте вкладку "Element Category Access". Она в панели группы, рядом с другими вкладками доступа. Нажмите "Add Category" над таблицей. Выберите: -- Category: ваша Category из шагов выше +- Category: категория из шагов выше - Minimum Role: Member - Access Policy: Element - Context: mgr - Нажмите "Save" в диалоге - Нажмите "Save" справа вверху -### 6. Flush Permissions +### 6. Перезагрузите права доступа -В верхнем меню: "**Flush Your Permissions**". В Revolution 2.3.x это иконка замка в меню пользователя → **Logout All Users**. +Откройте иконку замка → **Перезагрузить права доступа**, затем **Завершить все сеансы**. -Всех заставят войти снова. Element Category теперь защищена от пользователей вне группы Editors. +После этого все входят заново. Категория элемента закрыта от пользователей вне группы Editors. -## Скрытие конкретных Elements от части пользователей +## Скрытие отдельных элементов -Иногда нужно скрыть элементы от всех, кто не в группе Administrator. Положите элементы в категорию как выше, но привяжите её к группе Administrator: +Иногда нужно скрыть элементы от всех, кто не в группе Administrator. Положите элементы в категорию, как выше, и привяжите её к группе Administrator: -- Откройте редактирование группы Administrator (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> правый клик по "Administrator" -> Update User Group). В Revolution 2.3.x это Access Control Lists в меню Admin (шестерёнка). +- Откройте редактирование группы Administrator (иконка замка в меню пользователя → **Контроль доступа** → вкладка **Группы пользователей & Пользователи** → правый клик по "Administrator" → **Редактировать группу пользователя**) - Откройте вкладку Element Category Access - Добавьте ACL через "Add Category": - - Category: ваша Category из шагов выше - - Minimum Role: admin Super User + - Category: категория из шагов выше + - Minimum Role: Super User - Access Policy: Element - Context: mgr - Нажмите "Save" в диалоге - Нажмите "Save" справа вверху +- В верхнем меню: **Завершить все сеансы** -- В верхнем меню: **Logout All Users**. В Revolution 2.3.x это иконка замка в меню пользователя → **Logout All Users**. - -Теперь Elements видит только admin Super User. +Теперь элементы видит только admin Super User. -## Особый случай для Templates +## Особый случай для Template -Допустим, вы ограничили Template способом выше. Другой User Group без доступа к Template всё же должна править (но не создавать) Resources с этим Template и видеть TV шаблона. Сейчас вторая группа (назовём её Editors) видит Resource, в combobox Template показывает ID, но TV не видит. Нужна ещё одна ACL для группы Editors, чтобы загружались Template и связанные TV. +Вы ограничили Template способом выше. Другая группа пользователей должна править ресурсы с этим Template, но не создавать их. Она должна видеть TV шаблона, хотя доступа к самому Template у неё нет. Эта группа (назовём её Editors) видит ресурс. В списке Template показан его ID, а TV не видны. Нужна ещё одна ACL на группу Editors, чтобы загружались Template и его TV. -- Откройте редактирование группы Editors (иконка замка в меню пользователя → **Access Control Lists** → вкладка **User Groups & Users** -> правый клик по "Editors" -> Update User Group) +- Откройте редактирование группы Editors (иконка замка в меню пользователя → **Контроль доступа** → вкладка **Группы пользователей & Пользователи** → правый клик по "Editors" → **Редактировать группу пользователя**) - Откройте вкладку Element Category Access - Добавьте ACL через "Add Category": - - Category: ваша Category из шагов выше + - Category: категория из шагов выше - Minimum Role: Member - Access Policy: Load Only - Context: mgr - Нажмите "Save" в диалоге - Нажмите "Save" справа вверху +- Пользователи Editors выходят и входят снова, либо нажмите **Завершить все сеансы** в верхнем меню -- Пользователи Editors должны выйти и войти снова, либо **Logout All Users** в верхнем меню - -Готово. Editors увидят и будут править TV для Template в защищённой Category. Пользователи вне Editors их не увидят. +Editors увидят и будут править TV для Template в защищённой категории. Template остаётся скрыт от пользователей не из группы Editors. ## Смотрите также diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index 9ee61670f..a70a0ddb1 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -6,103 +6,51 @@ description: "Сбросить пароль пользователя MODX, ко ## Сброс пароля через правку базы данных -Бывает, что учётная запись недоступна из-за утерянного или забытого пароля. Часто помогает ссылка Forgot Password на форме входа. Иногда пароль нужно сбросить вручную прямо в базе. Нужен доступ к базе с таблицами MODX через PHPMyAdmin или другой клиент, где можно править или UPDATE записи. +Пусть пользователь откроет ссылку Forgot Password на форме входа. Если учётная запись всё ещё недоступна, сбросьте пароль в базе. Нужен клиент, в котором можно выполнить UPDATE. **Пароль нельзя записать в базу вручную** -В MODX 3 пароли хешируются классом `MODX\Revolution\Hashing\modNative` — это функция `password_hash()` из PHP. В базе такой функции нет, поэтому значение поля `password` нельзя посчитать вне PHP. +В MODX 3 пароль хранится как хеш, который считает только PHP. Запросом к базе этот хеш не получить. -Есть и второй путь: полю `hash_class` пользователя можно задать класс `MODX\Revolution\Hashing\modMD5`, а пароль записать как MD5-хеш — в базе для этого есть функция `MD5()`. Вот запрос, который выполняется в базе — в имени таблицы стоит префикс вашей установки: +Задайте полю `hash_class` пользователя класс `MODX\Revolution\Hashing\modMD5` и запишите пароль как MD5-хеш. В базе для этого есть функция `MD5()`. Выполните этот запрос. В имени таблицы стоит префикс вашей установки: ``` sql UPDATE modx_users SET hash_class = 'MODX\\Revolution\\Hashing\\modMD5', password = MD5('the-new-password') WHERE username = 'theusername'; ``` -Пользователь сможет войти, и при следующей смене пароля хеш будет пересчитан через `modNative`. Имя класса задаётся вместе с пространством имён; старое имя без него работает только через устаревший псевдоним, который печатает предупреждение. +Пользователь сможет войти. Следующая смена пароля по-прежнему хеширует через `MODX\Revolution\Hashing\modMD5`. Чтобы вернуться к штатному хешеру, поставьте `hash_class` в `MODX\Revolution\Hashing\modNative` и после этого сохраните новый пароль в менеджере. Имя класса задаётся вместе с пространством имён. Старое имя без него работает только через устаревший псевдоним, который печатает предупреждение. ## Сброс пароля через API -Пароль (и любую часть приложения MODX) можно менять через API. Ниже пример скрипта: обновляет пароль и email пользователя и гарантирует членство в группе Administrator. +Скрипт задаёт новый пароль существующему пользователю. Пароль хешируется классом, который уже записан в `hash_class`. ``` php initialize('mgr'); -$query = $modx->newQuery(\MODX\Revolution\modUser::class); -$query->where( array('username'=>$username) ); -$user = $modx->getObjectGraph(\MODX\Revolution\modUser::class, '{ "Profile":{}, "UserGroupMembers":{} }', $query); -// print_r($user); exit; +$user = $modx->getObject(\MODX\Revolution\modUser::class, ['username' => $username]); if (!$user) { - die("ERROR: No user with username $username"); + die('ERROR: Нет пользователя с таким именем.'); } -$user->set('username',$username); -$user->set('active',1); $user->set('password', $password); -$user->Profile->set('email', $email); -$user->Profile->set('blocked', 0); -$user->Profile->set('blockeduntil', 0); -$user->Profile->set('blockedafter', 0); - -// Verify the user is a member of specified User Group -$is_member = false; -if (!empty($user->UserGroupMembers)) { - foreach ($user->UserGroupMembers as $UserGroupMembers) { - if ($UserGroupMembers->get('user_group') == $user_group) { - $is_member = true; - break; - } - } -} -// Add the User to the User Group if he is not a member -if (!$is_member) { - // Verify the user group exists - $UserGroup = $modx->getObject(\MODX\Revolution\modUserGroup::class, $user_group); - if (!$UserGroup) { - die ("ERROR: User Group $user_group does not exist."); - } - - $Member = $modx->newObject(\MODX\Revolution\modUserGroupMember::class); - $Member->set('user_group', $user_group); - $Member->set('member', $user->get('id')); - // Super User = role 2 - $Member->set('role', 2); - $Member->set('rank', 0); - $user->addOne($Member,'UserGroupMembers'); -} - -/* save user */ if (!$user->save()) { - die('ERROR: Could not save user.'); + die('ERROR: Не удалось сохранить пользователя.'); } -print "SUCCESS: User $username updated."; - -?> +echo 'SUCCESS: пароль обновлён.'; ``` -Скрипт можно положить в любое место на сервере, если обновить путь к основному **index.php**. Запускайте его из браузера или из командной строки. +Положите скрипт в любое место на сервере и поправьте путь к основному **index.php**. Запускайте его из браузера или из командной строки. -**Warning** -С таким скриптом будьте крайне осторожны. По возможности не кладите его внутрь document root. Держите его вне document root и запускайте из командной строки. +> [!WARNING] +> С таким скриптом будьте крайне осторожны. По возможности не кладите его внутрь document root. Держите его вне document root и запускайте из командной строки. ## Смотрите также diff --git a/ru/building-sites/client-proofing/security/users.md b/ru/building-sites/client-proofing/security/users.md index 5efdd35f9..82f6546b1 100644 --- a/ru/building-sites/client-proofing/security/users.md +++ b/ru/building-sites/client-proofing/security/users.md @@ -6,25 +6,25 @@ description: "Пользователи MODX: их поля, флаг супер ## Что такое пользователь? -Пользователь — это просто представление входа в MODX Revolution. +Пользователь это вход в MODX. -Пользователей можно включать в группы пользователей, к которым прикрепляются [ACL](building-sites/client-proofing/security/policies/acls "ACL") и которые дают контроль над доступом. +Пользователей назначают в группы пользователей. У групп есть [ACL](building-sites/client-proofing/security/policies/acls "ACL"), и они задают доступ. ## Суперпользователь -Поле `sudo` делает пользователя суперпользователем: `checkPolicy()` сразу возвращает `true`, и проверки политик для него не выполняются вовсе. Пользователь видит всё, что бы ни говорили ACL. +Поле `sudo` делает пользователя суперпользователем. Проверки политик для него не выполняются. Пользователь видит всё, что бы ни говорили ACL. Выдать этот флаг может только пользователь с правом `set_sudo`. Администратор свежей установки получает его. ## Настройки пользователя -Пользовательские настройки в MODX Revolution автоматически перекрывают системные или контекстные настройки с тем же ключом. Они могут быть и совершенно уникальными. Порядок наследования настроек: +Настройка пользователя перекрывает настройку группы с тем же ключом. Настройка группы перекрывает настройку контекста. Настройка контекста перекрывает системную. Порядок такой: -`System Settings -> Context Settings -> User Settings` +`системная настройка → настройка контекста → настройка группы → настройка пользователя` -Чтобы изменить настройки пользователя, пройдите по пути **иконка замка в меню пользователя → Users → Update User (_правой кнопкой_) → Settings (_вкладка_)** +Чтобы изменить настройки пользователя, откройте иконку замка → **Пользователи**, щёлкните пользователя правой кнопкой и выберите **Редактировать**, затем вкладку **Настройки**. -Изменять пользовательские настройки можно только **после** создания пользователя. Вкладка «Settings» не видна при создании, и её показывают только пользователю с правами `settings` **и** `namespace`. +Менять эти настройки можно только после создания пользователя. На форме создания вкладки нет, и видит её только sudo. Войдите как sudo, чтобы править настройки пользователя. ## Пользователи на сайте @@ -35,12 +35,12 @@ description: "Пользователи MODX: их поля, флаг супер [[+modx.user.username]] - Выводит имя ``` -Если пользователь не вошёл, ID будет пустым, а имя — «(anonymous)». +Если пользователь не вошёл, ID равен 0, а имя `anonymous`. -Начиная с MODX 2.4.0, имя по умолчанию задаётся в системных настройках значением **default\_username**. +Имя по умолчанию задаёт настройка `default_username`. **Помните** -Не путайте: то, что вы вошли в _manager_, не значит, что вы вошли на _web_ front-end. Пользовательские настройки и метод API [getOption](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption") подчиняются тому же правилу, поэтому если вы не вошли на front-end, цепочка **System Settings -> Context Settings -> User Settings** применяется не полностью. +Вход в _manager_ не выполняет вход на сайт, в контекст _web_. Если вы не вошли на сайт, цепочка **системная настройка → настройка контекста → настройка группы → настройка пользователя** применяется не полностью. [Код, который читает настройку](extending-modx/xpdo/class-reference/xpdoobject/configuration-accessors/getoption "getOption"), следует тому же разделению. ## Поля пользователя @@ -57,7 +57,7 @@ description: "Пользователи MODX: их поля, флаг супер | remote\_key | Ключ внешнего пользователя для приложений внешней аутентификации. | | remote\_data | JSON-массив данных для приложений внешней аутентификации. | | hash\_class | Класс, которым хешируется пароль. В MODX 3 по умолчанию `MODX\Revolution\Hashing\modNative`. | -| salt | Соль, которой хешируется пароль пользователя. | +| salt | Соль, записанная у пользователя. Штатный хешер `modNative` эту колонку не использует. | | primary\_group | Группа, из которой пользователь получает дашборд и права своей основной группы. | | session\_stale | Устарела ли сессия пользователя. | | sudo | Является ли пользователь суперпользователем. См. [Суперпользователь](#суперпользователь). | @@ -82,7 +82,7 @@ description: "Пользователи MODX: их поля, флаг супер | failedlogincount | Сколько раз вход не удался с последнего успешного. | | sessionid | ID сессии пользователя. Устарело, будет удалено в 3.2. | | dob | Дата рождения. | -| gender | 0 — ни одного, 1 — мужской, 2 — женский. | +| gender | 0: ни одного, 1: мужской, 2: женский. | | address | Физический адрес. | | country | Страна пользователя. | | city | Город пользователя. | @@ -112,24 +112,24 @@ description: "Пользователи MODX: их поля, флаг супер ## Получение пользователя через API -Текущего пользователя можно получить в API через ссылку $modx->user. Например, этот сниппет выводит имя пользователя: +Текущий пользователь доступен в API как `$modx->user`. Этот сниппет выводит имя: ``` php return $modx->user->get('username'); ``` -Чтобы получить поля профиля, сначала нужно получить объект modUserProfile через псевдоним Profile. Например, этот сниппет берёт адрес почты пользователя: +Чтобы прочитать поля профиля, сначала получите объект `modUserProfile` через псевдоним Profile. Этот сниппет возвращает адрес почты: ``` php $profile = $modx->user->getOne('Profile'); return $profile ? $profile->get('email') : ''; ``` -Если пользователь не вошёл, объект $modx->user всё равно доступен, но вернёт 0 в качестве ID и (Anonymous) в качестве имени. +Если пользователь не вошёл, объект `$modx->user` всё равно доступен. Он вернёт ID `0` и имя `anonymous`. ### Работа с дополнительными полями -Значения поля extended возвращаются массивом. Ими можно управлять так: +Значения поля `extended` возвращаются массивом: ``` php /* get the extended field named "color": */ From 468c0c39d6473ef8957e4872c3f943f77a4a696b Mon Sep 17 00:00:00 2001 From: Ivan Bochkarev Date: Fri, 23 Oct 2026 14:59:31 +0600 Subject: [PATCH 6/6] docs(building-sites/client-proofing): limit the database password note to modNative The lead said a password cannot be written in SQL. That is true for modNative. The modMD5 UPDATE on the same page does write one. --- .../resetting-a-user-password-manually.md | 4 ++-- .../resetting-a-user-password-manually.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index a250c5af4..47c671e45 100644 --- a/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/en/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -9,8 +9,8 @@ _old_uri: "2.x/administering-your-site/security/troubleshooting-security/resetti Have the user try the Forgot Password link on the login form. If the account is still unreachable, reset the password in the database. -**The password cannot be written into the database by hand** -MODX 3 stores the password as a hash that only PHP can produce. A database statement cannot calculate that hash. +**The shipped hasher cannot be calculated in the database** +MODX 3 stores the password with `MODX\Revolution\Hashing\modNative`. A database statement cannot produce that hash. Set the user's `hash_class` to `MODX\Revolution\Hashing\modMD5` and write the password as an MD5 hash. The database has an `MD5()` function for that. Run this statement. The table name carries your installation's prefix: diff --git a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md index a70a0ddb1..4ed8edff0 100644 --- a/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md +++ b/ru/building-sites/client-proofing/security/troubleshooting-security/resetting-a-user-password-manually.md @@ -8,8 +8,8 @@ description: "Сбросить пароль пользователя MODX, ко Пусть пользователь откроет ссылку Forgot Password на форме входа. Если учётная запись всё ещё недоступна, сбросьте пароль в базе. Нужен клиент, в котором можно выполнить UPDATE. -**Пароль нельзя записать в базу вручную** -В MODX 3 пароль хранится как хеш, который считает только PHP. Запросом к базе этот хеш не получить. +**Штатный хеш в базе не посчитать** +В MODX 3 пароль хранится классом `MODX\Revolution\Hashing\modNative`. Запросом к базе этот хеш не получить. Задайте полю `hash_class` пользователя класс `MODX\Revolution\Hashing\modMD5` и запишите пароль как MD5-хеш. В базе для этого есть функция `MD5()`. Выполните этот запрос. В имени таблицы стоит префикс вашей установки: