diff --git a/doc/6/controllers/security/create-credentials/index.md b/doc/6/controllers/security/create-credentials/index.md new file mode 100644 index 000000000..2d278dd79 --- /dev/null +++ b/doc/6/controllers/security/create-credentials/index.md @@ -0,0 +1,56 @@ +--- +code: true +type: page +title: createCredentials +description: Creates authentication credentials for a user +--- + +# createCredentials + +Creates authentication credentials for a user. + +
+ +```js +createCredentials(strategy, kuid, credentials, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy to use | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `credentials` |
object
| New credentials | +| `options` |
object
| Query options | + +### credentials + +The credentials to send. The expected properties depend on the target authentication strategy. + +Example for the `local` strategy: + +```js +{ + username: 'foo', + password: 'bar' +} +``` + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the credentials are indexed | + +## Resolves + +An `object` representing the new credentials. +The content depends on the authentication strategy. + +## Usage + +<<< ./snippets/create-credentials.js diff --git a/doc/6/controllers/security/create-credentials/snippets/create-credentials.js b/doc/6/controllers/security/create-credentials/snippets/create-credentials.js new file mode 100644 index 000000000..89de8127b --- /dev/null +++ b/doc/6/controllers/security/create-credentials/snippets/create-credentials.js @@ -0,0 +1,23 @@ +try { + await kuzzle.security.createUser('foo', { + content: { + profileIds: ['default'], + fullName: 'John Doe' + }, + credentials: {} + }); + + const response = await kuzzle.security.createCredentials( + 'local', + 'foo', + { username: 'foo', password: 'bar' } + ); + console.log(response); + /* + { username: 'foo' } + */ + + console.log('Credentials successfully created'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-credentials/snippets/create-credentials.test.yml b/doc/6/controllers/security/create-credentials/snippets/create-credentials.test.yml new file mode 100644 index 000000000..6680c77c4 --- /dev/null +++ b/doc/6/controllers/security/create-credentials/snippets/create-credentials.test.yml @@ -0,0 +1,6 @@ +name: security#createCredentials +description: Creates credentials for the specified strategy +hooks: + after: curl -X DELETE kuzzle:7512/users/foo?refresh=wait_for +template: default +expected: Credentials successfully created diff --git a/doc/6/controllers/security/create-first-admin/index.md b/doc/6/controllers/security/create-first-admin/index.md new file mode 100644 index 000000000..5f056150b --- /dev/null +++ b/doc/6/controllers/security/create-first-admin/index.md @@ -0,0 +1,66 @@ +--- +code: true +type: page +title: createFirstAdmin +description: Creates a Kuzzle administrator account, only if none exist. +--- + +# createFirstAdmin + +Creates a Kuzzle administrator account, only if none exist. + +
+ +```js +createFirstAdmin(kuid, body, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `kuid` |
string
| Administrator [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `body` |
object
| Administrator content & credentials | +| `options` |
object
| Query options | + +### body + +The `body` property must contain two objects: +- `content`: Administrator additional information. Can be left empty. +Any other attribute can be added. +Make sure to [update the user mapping](/sdk/js/6/controllers/security/update-user-mapping) collection to match your custom attributes. +- `credentials`: Describe how the new administrator can be authenticated. This object must contain one or more +properties, named after the target authentication strategy to use. Each one of these properties are objects +containing the credentials information, corresponding to that authentication strategy. + +Example: + +```js +{ + content: { + firstName: 'John', + lastName: 'Doe' + }, + credentials: { + local: { + username: 'admin', + password: 'myPassword' + } + } +} +``` + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `reset` |
boolean

(`false`) | If true, restricted permissions are applied to `anonymous` and `default` roles | + +## Resolves + +A [`User`](sdk/js/6/core-classes/user/introduction) object containing information about the newly created administrator. + +## Usage + +<<< ./snippets/create-first-admin.js diff --git a/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.js b/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.js new file mode 100644 index 000000000..330e8fc48 --- /dev/null +++ b/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.js @@ -0,0 +1,37 @@ +try { + const response = await kuzzle.security.createFirstAdmin( + 'admin', + { + content: { + firstName: 'John', + lastName: 'Doe' + }, + credentials: { + local: { + username: 'admin', + password: 'myPassword' + } + } + } + ); + + console.log(response); + /* + User { + _id: 'admin', + content: + { profileIds: [ 'admin' ], + firstName: 'John', + lastName: 'Doe', + _kuzzle_info: + { author: '-1', + createdAt: 1560351009496, + updatedAt: null, + updater: null } } } + */ + + console.log('First admin successfully created'); + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.test.yml b/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.test.yml new file mode 100644 index 000000000..ed92521d2 --- /dev/null +++ b/doc/6/controllers/security/create-first-admin/snippets/create-first-admin.test.yml @@ -0,0 +1,6 @@ +name: security#createFirstAdmin +description: Creates first admin +hooks: + after: curl -X DELETE kuzzle:7512/users/admin?refresh=wait_for +template: default +expected: First admin successfully created diff --git a/doc/6/controllers/security/create-or-replace-profile/index.md b/doc/6/controllers/security/create-or-replace-profile/index.md new file mode 100644 index 000000000..0963a495e --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-profile/index.md @@ -0,0 +1,45 @@ +--- +code: true +type: page +title: createOrReplaceProfile +description: Creates a new profile or, if the provided profile identifier already exists, replaces it. +--- + +# createOrReplaceProfile + +Creates a new profile or, if the provided profile identifier already exists, replaces it. + +
+ +```js +createOrReplaceProfile(id, body, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Profile identifier | +| `body` |
object
| Profile definition content | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `policies` |
object
| [Profile content](/core/1/guides/essentials/security/#defining-profiles) | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created/replaced profile is indexed | + +## Resolves + +A [`Profile`](/sdk/js/6/core-classes/profile/introduction) object representing the updated/created profile. + +## Usage + +<<< ./snippets/create-or-replace-profile.js diff --git a/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.js b/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.js new file mode 100644 index 000000000..2f4babed3 --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.js @@ -0,0 +1,37 @@ +try { + const response = await kuzzle.security.createOrReplaceProfile( + 'myProfile', + { + policies: [ + { + roleId: 'default' + }, + { + roleId: 'admin', + restrictedTo: [ + { + index: 'someIndex', + collections: [ + 'collection1', + 'collection2' + ] + } + ] + } + ] + } + ); + console.log(response); + + /* + Profile { + _id: 'myProfile', + policies: + [ { roleId: 'default' }, + { roleId: 'admin', restrictedTo: [Array] } ] } + */ + + console.log('Profile successfully updated'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.test.yml b/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.test.yml new file mode 100644 index 000000000..0b47f4b69 --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-profile/snippets/create-or-replace-profile.test.yml @@ -0,0 +1,6 @@ +name: security#createOrReplaceProfile +description: Creates or replaces a profile +hooks: + after: curl -XDELETE kuzzle:7512/profiles/myProfile?refresh=wait_for +template: default +expected: Profile successfully updated diff --git a/doc/6/controllers/security/create-or-replace-role/index.md b/doc/6/controllers/security/create-or-replace-role/index.md new file mode 100644 index 000000000..238b55a13 --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-role/index.md @@ -0,0 +1,45 @@ +--- +code: true +type: page +title: createOrReplaceRole +description: Creates a new role or, if the provided role identifier already exists, replaces it. +--- + +# createOrReplaceRole + +Creates a new role or, if the provided role identifier already exists, replaces it. + +
+ +```js +createOrReplaceRole(id, body, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Role identifier | +| `body` |
object
| Role definition content | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `controllers` |
object
| [Role definition](/core/1/guides/essentials/security/#defining-roles) | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created/replaced role is indexed | + +## Resolves + +A [`Role`](/sdk/js/6/core-classes/role) object representing the created/replaced role. + +## Usage + +<<< ./snippets/create-or-replace-role.js diff --git a/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.js b/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.js new file mode 100644 index 000000000..d38b40c4b --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.js @@ -0,0 +1,52 @@ +try { + const response = await kuzzle.security.createOrReplaceRole( + 'read-only', + { + controllers: { + auth: { + actions: { + getCurrentUser: true, + getMyCredentials: true, + getMyRights: true, + logout: true + } + }, + collection: { + actions: { + getMapping: true, + list: true + } + }, + document: { + actions: { + count: true, + get: true, + mGet: true, + scroll: true, + search: true + } + }, + index: { + actions: { + list: true + } + } + } + } + ); + console.log(response); + /* + Role { + _id: 'read-only', + controllers: + { auth: { actions: [Object] }, + collection: { actions: [Object] }, + document: { actions: [Object] }, + index: { actions: [Object] } } } + */ + + console.log('Role successfully updated'); + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.test.yml b/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.test.yml new file mode 100644 index 000000000..a46b8c0dc --- /dev/null +++ b/doc/6/controllers/security/create-or-replace-role/snippets/create-or-replace-role.test.yml @@ -0,0 +1,6 @@ +name: security#createOrReplaceRole +description: Creates or replaces role +hooks: + after: curl -XDELETE kuzzle:7512/roles/read-only +template: default +expected: Role successfully updated diff --git a/doc/6/controllers/security/create-profile/index.md b/doc/6/controllers/security/create-profile/index.md new file mode 100644 index 000000000..13c8bbe33 --- /dev/null +++ b/doc/6/controllers/security/create-profile/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: createProfile +description: Creates a new profile +--- + +# createProfile + +Creates a new profile. + +
+ +```js +createProfile(id, profile, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `id` |
string
| Profile identifier | +| `profile` |
object
| [Profile definition content](/core/1/guides/essentials/security/#defining-profiles) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created profile is indexed | + +## Resolves + +A [`Profile`](/sdk/js/6/core-classes/profile/introduction) object representing the created profile. + +## Usage + +<<< ./snippets/create-profile.js + diff --git a/doc/6/controllers/security/create-profile/snippets/create-profile.js b/doc/6/controllers/security/create-profile/snippets/create-profile.js new file mode 100644 index 000000000..008433f90 --- /dev/null +++ b/doc/6/controllers/security/create-profile/snippets/create-profile.js @@ -0,0 +1,37 @@ +try { + const response = await kuzzle.security.createProfile( + 'myProfile', + { + policies: [ + { + roleId: 'default' + }, + { + roleId: 'admin', + restrictedTo: [ + { + index: 'someIndex', + collections: [ + 'collection1', + 'collection2' + ] + } + ] + } + ] + } + ); + console.log(response); + + /* + Profile { + _id: 'myProfile', + policies: + [ { roleId: 'default' }, + { roleId: 'admin', restrictedTo: [Array] } ] } + */ + + console.log('Profile successfully created'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-profile/snippets/create-profile.test.yml b/doc/6/controllers/security/create-profile/snippets/create-profile.test.yml new file mode 100644 index 000000000..77cad7466 --- /dev/null +++ b/doc/6/controllers/security/create-profile/snippets/create-profile.test.yml @@ -0,0 +1,6 @@ +name: security#createProfile +description: Creates a profile +hooks: + after: curl -XDELETE kuzzle:7512/profiles/myProfile?refresh=wait_for +template: default +expected: Profile successfully created diff --git a/doc/6/controllers/security/create-restricted-user/index.md b/doc/6/controllers/security/create-restricted-user/index.md new file mode 100644 index 000000000..a0bbf775b --- /dev/null +++ b/doc/6/controllers/security/create-restricted-user/index.md @@ -0,0 +1,71 @@ +--- +code: true +type: page +title: createRestrictedUser +description: Creates a new user in Kuzzle, with a preset list of security profiles. +--- + +# createRestrictedUser + +Creates a new user in Kuzzle, with a preset list of security profiles. + +The list of security profiles attributed to restricted users is fixed, and must be configured in the +[Kuzzle configuration file](/core/1/guides/essentials/configuration/). + +This method allows users with limited rights to create other accounts, but blocks them from creating accounts with unwanted privileges (e.g. an anonymous user creating his own account). + +
+ +```js +createRestrictedUser(body, [kuid], [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `body` |
object
| User content & credentials | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid). If not provided, a random kuid is automatically generated | +| `options` |
object
| Query options | + + +### body + +The `body` property must contain two objects: +- `content`: User additional information. Can be left empty. +- `credentials`: Describe how the new user can be authenticated. This object must contain one or more +properties, named after the target authentication strategy to use. Each one of these properties are objects +containing the credentials information, corresponding to that authentication strategy. + +Example: + +```js +{ + content: { + firstName: 'John', + lastName: 'Doe' + }, + credentials: { + local: { + username: 'jdoe', + password: 'password' + } + } +} +``` + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the user is indexed | + + +## Resolves + +A [`User`](sdk/js/6/core-classes/user/introduction) object containing information about the newly created user. + +## Usage + +<<< ./snippets/create-restricted-user.js diff --git a/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.js b/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.js new file mode 100644 index 000000000..5ae9fd17f --- /dev/null +++ b/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.js @@ -0,0 +1,31 @@ +try { + const response = await kuzzle.security.createRestrictedUser({ + content: { + fullName: 'John Doe' + }, + credentials: { + local: { + username: 'jdoe', + password: 'foobar' + } + } + }, 'jdoe'); + console.log(response); + + /* + User { + _id: 'jdoe', + content:, + { profileIds: [ 'default' ], + fullName: 'John Doe', + _kuzzle_info: + { author: '-1', + createdAt: 1561379086534, + udpatedAt: null, + updater: null } } } + */ + + console.log('User successfully created'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.test.yml b/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.test.yml new file mode 100644 index 000000000..f0ae1f924 --- /dev/null +++ b/doc/6/controllers/security/create-restricted-user/snippets/create-restricted-user.test.yml @@ -0,0 +1,6 @@ +name: security#createRestrictedUser +description: creates a restricted user +hooks: + after: curl -XDELETE http://kuzzle:7512/users/jdoe +template: default +expected: User successfully created diff --git a/doc/6/controllers/security/create-role/index.md b/doc/6/controllers/security/create-role/index.md new file mode 100644 index 000000000..b41dc986f --- /dev/null +++ b/doc/6/controllers/security/create-role/index.md @@ -0,0 +1,45 @@ +--- +code: true +type: page +title: createRole +description: Creates a new role +--- + +# createRole + +Creates a new role. + +
+ +```js +createRole(id, body, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `id` |
string
| Role identifier | +| `body` |
object
| Role definition content | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `controllers` |
object
| [Role definition](/core/1/guides/essentials/security/#defining-roles) | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created role is indexed | + +## Resolves + +A [`Role`](/sdk/js/6/core-classes/role) object representing the created/replaced role. + +## Usage + +<<< ./snippets/create-role.js diff --git a/doc/6/controllers/security/create-role/snippets/create-role.js b/doc/6/controllers/security/create-role/snippets/create-role.js new file mode 100644 index 000000000..ab57c1e38 --- /dev/null +++ b/doc/6/controllers/security/create-role/snippets/create-role.js @@ -0,0 +1,52 @@ +try { + const response = await kuzzle.security.createRole( + 'read-only', + { + controllers: { + auth: { + actions: { + getCurrentUser: true, + getMyCredentials: true, + getMyRights: true, + logout: true + } + }, + collection: { + actions: { + getMapping: true, + list: true + } + }, + document: { + actions: { + count: true, + get: true, + mGet: true, + scroll: true, + search: true + } + }, + index: { + actions: { + list: true + } + } + } + } + ); + console.log(response); + /* + Role { + _id: 'read-only', + controllers: + { auth: { actions: [Object] }, + collection: { actions: [Object] }, + document: { actions: [Object] }, + index: { actions: [Object] } } } + */ + + console.log('Role successfully created'); + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-role/snippets/create-role.test.yml b/doc/6/controllers/security/create-role/snippets/create-role.test.yml new file mode 100644 index 000000000..fcee0d453 --- /dev/null +++ b/doc/6/controllers/security/create-role/snippets/create-role.test.yml @@ -0,0 +1,6 @@ +name: security#createRole +description: Creates a role +hooks: + after: curl -XDELETE kuzzle:7512/roles/read-only?refresh=wait_for +template: default +expected: Role successfully created diff --git a/doc/6/controllers/security/create-user/index.md b/doc/6/controllers/security/create-user/index.md new file mode 100644 index 000000000..892f0cecc --- /dev/null +++ b/doc/6/controllers/security/create-user/index.md @@ -0,0 +1,70 @@ +--- +code: true +type: page +title: createUser +description: Creates a new user +--- + +# createUser + +Creates a new user. + +
+ +```js +createUser(kuid, body, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `body` |
object
| User content & credentials | +| `options` |
object
| Query options | + +### body + +The `body` property must contain two objects: +- `content`: Contains the list of profile ids to attach the user to and potential additional information. At least the `profileIds` must be supplied. +Any other attribute can be added. +Make sure to [update the user mapping](/sdk/js/6/controllers/security/update-user-mapping) collection to match your custom attributes. +- `credentials`: Describes how the new administrator can be authenticated. This object must contain one or more +properties, named after the target authentication strategy to use. Each one of these properties are objects +containing the credentials information, corresponding to that authentication strategy. + +Example: + +```js +{ + content: { + profileIds: [ + 'default' + ], + firstName: 'John', + lastName: 'Doe' + }, + credentials: { + local: { + username: 'admin', + password: 'myPassword' + } + } +} +``` + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created user is indexed | + +## Resolves + +A [`User`](sdk/js/6/core-classes/user/introduction) object containing information about the newly created user. + +## Usage + +<<< ./snippets/create-user.js + diff --git a/doc/6/controllers/security/create-user/snippets/create-user.js b/doc/6/controllers/security/create-user/snippets/create-user.js new file mode 100644 index 000000000..78b36b533 --- /dev/null +++ b/doc/6/controllers/security/create-user/snippets/create-user.js @@ -0,0 +1,31 @@ +try { + const response = await kuzzle.security.createUser('jdoe', { + content: { + profileIds: [ 'default' ] + }, + credentials: { + local: { + username: 'jdoe', + password: 'password' + } + } + }); + console.log(response); + + /* + User { + _id: 'john.doe', + content:, + { profileIds: [ 'default' ], + firstName: 'John', + lastName: 'Doe', + fullName: 'John Doe', + _kuzzle_info: + { author: '-1', + createdAt: 1561379086534, + updatedAt: null, + updater: null } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/create-user/snippets/create-user.test.yml b/doc/6/controllers/security/create-user/snippets/create-user.test.yml new file mode 100644 index 000000000..d1c10d2b8 --- /dev/null +++ b/doc/6/controllers/security/create-user/snippets/create-user.test.yml @@ -0,0 +1,6 @@ +name: security#createUser +description: creates user +hooks: + after: curl -XDELETE kuzzle:7512/users/jdoe +template: default +expected: '^ { profileIds: \[ ''default'' \],$' diff --git a/doc/6/controllers/security/delete-credentials/index.md b/doc/6/controllers/security/delete-credentials/index.md new file mode 100644 index 000000000..477aad09a --- /dev/null +++ b/doc/6/controllers/security/delete-credentials/index.md @@ -0,0 +1,41 @@ +--- +code: true +type: page +title: deleteCredentials +description: Deletes user credentials for the specified authentication strategy +--- + +# deleteCredentials + +Deletes user credentials for the specified authentication strategy. + +
+ +```js +deleteCredentials(strategy, kuid, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy to use | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the credentials deletion is indexed | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/delete-credentials.js diff --git a/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.js b/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.js new file mode 100644 index 000000000..a64b973dd --- /dev/null +++ b/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.js @@ -0,0 +1,11 @@ +try { + const response = await kuzzle.security.deleteCredentials('local', 'john.doe'); + console.log(response); + /* + { acknowledged: true } + */ + + console.log('Credentials successfully deleted'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.test.yml b/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.test.yml new file mode 100644 index 000000000..30e106e2a --- /dev/null +++ b/doc/6/controllers/security/delete-credentials/snippets/delete-credentials.test.yml @@ -0,0 +1,19 @@ +name: security#deleteCredentials +description: deletes credentials +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create?refresh=wait_for + after: + curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: Credentials successfully deleted diff --git a/doc/6/controllers/security/delete-profile/index.md b/doc/6/controllers/security/delete-profile/index.md new file mode 100644 index 000000000..6a1536d8e --- /dev/null +++ b/doc/6/controllers/security/delete-profile/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: deleteProfile +description: Deletes a security profile +--- + +# deleteProfile + +Deletes a security profile. + +
+ +```js +deleteProfile(id, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Profile identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the profile deletion is indexed | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/delete-profile.js diff --git a/doc/6/controllers/security/delete-profile/snippets/delete-profile.js b/doc/6/controllers/security/delete-profile/snippets/delete-profile.js new file mode 100644 index 000000000..e2c34c821 --- /dev/null +++ b/doc/6/controllers/security/delete-profile/snippets/delete-profile.js @@ -0,0 +1,17 @@ +try { + const response = await kuzzle.security.deleteProfile('myProfile'); + console.log(response); + /* + { found: true, + _index: '%kuzzle', + _type: 'profiles', + _id: 'myProfile', + _version: 29, + result: 'deleted', + _shards: { total: 2, successful: 1, failed: 0 } } + */ + + console.log('Profile successfully deleted'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/delete-profile/snippets/delete-profile.test.yml b/doc/6/controllers/security/delete-profile/snippets/delete-profile.test.yml new file mode 100644 index 000000000..ef4b73bb4 --- /dev/null +++ b/doc/6/controllers/security/delete-profile/snippets/delete-profile.test.yml @@ -0,0 +1,9 @@ +name: security#deleteProfile +description: deletes profile +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "policies": [] + }' kuzzle:7512/profiles/myProfile/_create +template: default +expected: Profile successfully deleted diff --git a/doc/6/controllers/security/delete-role/index.md b/doc/6/controllers/security/delete-role/index.md new file mode 100644 index 000000000..8e8ca35e9 --- /dev/null +++ b/doc/6/controllers/security/delete-role/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: deleteRole +description: Deletes a security role +--- + +# deleteRole + +Deletes a security role. + +
+ +```js +deleteRole(id, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Role identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the role deletion is indexed | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/delete-role.js diff --git a/doc/6/controllers/security/delete-role/snippets/delete-role.js b/doc/6/controllers/security/delete-role/snippets/delete-role.js new file mode 100644 index 000000000..99a131988 --- /dev/null +++ b/doc/6/controllers/security/delete-role/snippets/delete-role.js @@ -0,0 +1,17 @@ +try { + const response = await kuzzle.security.deleteRole('myRole'); + console.log(response); + /* + { found: true, + _index: '%kuzzle', + _type; 'roles', + _id: 'myRole',, + _version: 2, + result: 'deleted', + _shards: { total: 2, successful: 1, failed: 0 } } + */ + + console.log('Role successfully deleted'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/delete-role/snippets/delete-role.test.yml b/doc/6/controllers/security/delete-role/snippets/delete-role.test.yml new file mode 100644 index 000000000..47f9e3eb1 --- /dev/null +++ b/doc/6/controllers/security/delete-role/snippets/delete-role.test.yml @@ -0,0 +1,15 @@ +name: security#deleteRole +description: deletes role +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "controllers": { + "*": { + "actions": { + "*": true + } + } + } + }' kuzzle:7512/roles/myRole/_create +template: default +expected: Role successfully deleted diff --git a/doc/6/controllers/security/delete-user/index.md b/doc/6/controllers/security/delete-user/index.md new file mode 100644 index 000000000..1c8c2894e --- /dev/null +++ b/doc/6/controllers/security/delete-user/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: deleteUser +description: Deletes a user and all their associate credentials +--- + +# deleteUser + +Deletes a user and all their associated credentials. + +
+ +```js +deleteUser(kuid, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the user deletion is indexed | + +## Resolves + +An object containing the `kuid` of the deleted user in its `_id` property. + +## Usage + +<<< ./snippets/delete-user.js diff --git a/doc/6/controllers/security/delete-user/snippets/delete-user.js b/doc/6/controllers/security/delete-user/snippets/delete-user.js new file mode 100644 index 000000000..f973f0a61 --- /dev/null +++ b/doc/6/controllers/security/delete-user/snippets/delete-user.js @@ -0,0 +1,11 @@ +try { + const response = await kuzzle.security.deleteUser('john.doe'); + console.log(response); + /* + { _id: 'john.doe' } + */ + + console.log('User successfully deleted'); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/delete-user/snippets/delete-user.test.yml b/doc/6/controllers/security/delete-user/snippets/delete-user.test.yml new file mode 100644 index 000000000..f82599c33 --- /dev/null +++ b/doc/6/controllers/security/delete-user/snippets/delete-user.test.yml @@ -0,0 +1,19 @@ +name: security#deleteUser +description: Deletes a user +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create?refresh=wait_for + after: + curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: User successfully deleted diff --git a/doc/6/controllers/security/get-all-credential-fields/index.md b/doc/6/controllers/security/get-all-credential-fields/index.md new file mode 100644 index 000000000..cfcb427e2 --- /dev/null +++ b/doc/6/controllers/security/get-all-credential-fields/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: getAllCredentialFields +description: Retrieves the list of fields accepted by authentication strategies. +--- + +# getAllCredentialFields + +Retrieves the list of fields accepted by authentication strategies. + +
+ +```js +getAllCredentialFields([options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object with one property set per authentication strategy, each being an array of accepted field names. + +## Usage + +<<< ./snippets/get-all-credential-fields.js diff --git a/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.js b/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.js new file mode 100644 index 000000000..c96f3e5a4 --- /dev/null +++ b/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.js @@ -0,0 +1,11 @@ +try { + const response = await kuzzle.security.getAllCredentialFields(); + + console.log(response); + /* + { local: [ 'username', 'password' ], + facebook: [ ] } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.test.yml b/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.test.yml new file mode 100644 index 000000000..6cd8709d5 --- /dev/null +++ b/doc/6/controllers/security/get-all-credential-fields/snippets/get-all-credential-fields.test.yml @@ -0,0 +1,4 @@ +name: security#getAllCredentialFields +description: get all credential fields +template: default +expected: '{ local: \[ ''username'', ''password'' \] }' diff --git a/doc/6/controllers/security/get-credential-fields/index.md b/doc/6/controllers/security/get-credential-fields/index.md new file mode 100644 index 000000000..a91223303 --- /dev/null +++ b/doc/6/controllers/security/get-credential-fields/index.md @@ -0,0 +1,39 @@ +--- +code: true +type: page +title: getCredentialFields +description: Retrieves the list of accepted field names by the specified authentication strategy +--- + +# getCredentialFields + +Retrieves the list of accepted field names by the specified authentication strategy + +
+ +```js +getCredentialFields(strategy, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An array ofr accepted field names. + +## Usage + +<<< ./snippets/get-credential-fields.js diff --git a/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.js b/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.js new file mode 100644 index 000000000..76fb14789 --- /dev/null +++ b/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.js @@ -0,0 +1,10 @@ +try { + const response = await kuzzle.security.getCredentialFields('local'); + + console.log(response); + /* + [ 'username', 'password' ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.test.yml b/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.test.yml new file mode 100644 index 000000000..4734bada3 --- /dev/null +++ b/doc/6/controllers/security/get-credential-fields/snippets/get-credential-fields.test.yml @@ -0,0 +1,4 @@ +name: security#getCredentialFields +description: get credential fields +template: default +expected: '^\[ ''username'', ''password'' \]$' diff --git a/doc/6/controllers/security/get-credentials-by-id/index.md b/doc/6/controllers/security/get-credentials-by-id/index.md new file mode 100644 index 000000000..687a0b430 --- /dev/null +++ b/doc/6/controllers/security/get-credentials-by-id/index.md @@ -0,0 +1,45 @@ +--- +code: true +type: page +title: getCredentialsById +description: Gets credential information for the user identified by the strategy's unique user identifier userId. +--- + +# getCredentialsById + +Gets credential information for the user identified by the strategy's unique user identifier `userId`. + +The returned object will vary depending on the strategy (see [getById plugin function](/core/1/plugins/guides/strategies/#optional-getbyid)), and can be empty. + +**Note**: the user identifier to use depends on the specified strategy. +If you wish to get credential information using a [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) identifier, use the [getCredentials](sdk/js/6/controllers/security/get-credentials) action instead. + +
+ +```js +getCredentialsById(strategy, id, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy identifier | +| `id` |
string
| Credential identifier (this is **not** the [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid)) | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object containing the credential information (depends on the authentication strategy). + +## Usage + +<<< ./snippets/get-credentials-by-id.js diff --git a/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.js b/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.js new file mode 100644 index 000000000..dc271a398 --- /dev/null +++ b/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.js @@ -0,0 +1,10 @@ +try { + const response = await kuzzle.security.getCredentialsById('local', 'jdoe'); + + console.log(response); + /* + { username: 'jdoe', kuid: 'john.doe' } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.test.yml b/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.test.yml new file mode 100644 index 000000000..073dd18d7 --- /dev/null +++ b/doc/6/controllers/security/get-credentials-by-id/snippets/get-credentials-by-id.test.yml @@ -0,0 +1,18 @@ +name: security#getCredentialsById +description: get credentials by id +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create?refresh=wait_for + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^{ username: ''jdoe'', kuid: ''john.doe'' }$' diff --git a/doc/6/controllers/security/get-credentials/index.md b/doc/6/controllers/security/get-credentials/index.md new file mode 100644 index 000000000..a89f602b6 --- /dev/null +++ b/doc/6/controllers/security/get-credentials/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: getCredentials +description: Gets a user's credential information for the specified authentication strategy. +--- + +# getCredentials + +Gets a user's credential information for the specified authentication strategy. + +
+ +```js +getCredentials(strategy, kuid, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy identifier | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object containing the credential information (depends on the authentication strategy). + +## Usage + +<<< ./snippets/get-credentials.js diff --git a/doc/6/controllers/security/get-credentials/snippets/get-credentials.js b/doc/6/controllers/security/get-credentials/snippets/get-credentials.js new file mode 100644 index 000000000..ff90d5268 --- /dev/null +++ b/doc/6/controllers/security/get-credentials/snippets/get-credentials.js @@ -0,0 +1,10 @@ +try { + const response = await kuzzle.security.getCredentials('local', 'john.doe'); + + console.log(response); + /* + { username: 'jdoe', kuid: 'john.doe' } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-credentials/snippets/get-credentials.test.yml b/doc/6/controllers/security/get-credentials/snippets/get-credentials.test.yml new file mode 100644 index 000000000..d2bb2f8e1 --- /dev/null +++ b/doc/6/controllers/security/get-credentials/snippets/get-credentials.test.yml @@ -0,0 +1,18 @@ +name: security#getCredentials +description: get credentials +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create?refresh=wait_for + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^{ username: ''jdoe'', kuid: ''john.doe'' }$' diff --git a/doc/6/controllers/security/get-profile-mapping/index.md b/doc/6/controllers/security/get-profile-mapping/index.md new file mode 100644 index 000000000..f76a60c0d --- /dev/null +++ b/doc/6/controllers/security/get-profile-mapping/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: getProfileMapping +description: Gets the mapping of the internal security profiles collection +--- + +# getProfileMapping + +Gets the mapping of the internal security profiles collection. + +
+ +```js +getProfileMapping([options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object representing the internal profiles mapping, using [Elasticsearch mapping format](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping.html). + +## Usage + +<<< ./snippets/get-profile-mapping.js diff --git a/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.js b/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.js new file mode 100644 index 000000000..6593cf4ea --- /dev/null +++ b/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.js @@ -0,0 +1,21 @@ +try { + const response = await kuzzle.security.getProfileMapping(); + + console.log(response); + /* + { mapping: + { policies: + { properties: + { restrictedTo: + { properties: + { collections: + { type: 'text', + fields: { keyword: { type: 'keyword', ignore_above: 256 } } }, + index: + { type: 'text', + fields: { keyword: { type: 'keyword', ignore_above: 256 } } } } }, + roleId: { type: 'keyword' } } } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.test.yml b/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.test.yml new file mode 100644 index 000000000..c8b0680ec --- /dev/null +++ b/doc/6/controllers/security/get-profile-mapping/snippets/get-profile-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#getProfileMapping +description: get profile mapping +template: default +expected: '^{ mapping:' diff --git a/doc/6/controllers/security/get-profile-rights/index.md b/doc/6/controllers/security/get-profile-rights/index.md new file mode 100644 index 000000000..e28c3c6e8 --- /dev/null +++ b/doc/6/controllers/security/get-profile-rights/index.md @@ -0,0 +1,43 @@ +--- +code: true +type: page +title: getProfileRights +description: Gets the detailed rights configured by a security profile +--- + +# getProfileRights + +Gets the detailed rights configured by a security profile + +
+```js +getProfileRights(id, [options]); +``` +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Profile identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An array of objects. Each object is a security right described by the security profile: + +- `controller`: impacted controller +- `action`: impacted controller action +- `index`: index name +- `collection`: collection name +- `value`: tells if access if `allowed` or `denied`. If closures have been configured on the detailed scope, the value is `conditional`. + +## Usage + +<<< ./snippets/get-profile-rights.js diff --git a/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.js b/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.js new file mode 100644 index 000000000..4ff38cd1d --- /dev/null +++ b/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.js @@ -0,0 +1,23 @@ +try { + const response = await kuzzle.security.getProfileRights('myProfile'); + + console.log(response); + /* + [ { controller: 'auth', + action: 'login', + index: '*', + collection: '*', + value: 'allowed' + }, + { controller: 'document', + action: 'get', + index: 'someIndex', + collection: '*', + value: 'allowed' + } [..] + ] + + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.test.yml b/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.test.yml new file mode 100644 index 000000000..cde9df382 --- /dev/null +++ b/doc/6/controllers/security/get-profile-rights/snippets/get-profile-rights.test.yml @@ -0,0 +1,26 @@ +name: security#getProfileRights +description: get profile rights +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "policies": [ + { + "roleId": "admin", + "restrictedTo": [ + { "index": "someIndex" }, + { + "index": "anotherIndex", + "collections": [ + "someCollection" + ] + } + ] + }, + { + "roleId": "default" + } + ] + }' kuzzle:7512/profiles/myProfile/_create + after: curl -XDELETE kuzzle:7512/profiles/myProfile +template: default +expected: '^ value: ''allowed'' },$' diff --git a/doc/6/controllers/security/get-profile/index.md b/doc/6/controllers/security/get-profile/index.md new file mode 100644 index 000000000..c4780a125 --- /dev/null +++ b/doc/6/controllers/security/get-profile/index.md @@ -0,0 +1,39 @@ +--- +code: true +type: page +title: getProfile +description: Gets a security profile +--- + +# getProfile + +Gets a security profile. + +
+ +```js +getProfile(id, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Profile identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +The retrieved [`Profile`](/sdk/js/6/core-classes/profile/introduction) object. + +## Usage + +<<< ./snippets/get-profile.js diff --git a/doc/6/controllers/security/get-profile/snippets/get-profile.js b/doc/6/controllers/security/get-profile/snippets/get-profile.js new file mode 100644 index 000000000..87345fa57 --- /dev/null +++ b/doc/6/controllers/security/get-profile/snippets/get-profile.js @@ -0,0 +1,17 @@ +try { + const response = await kuzzle.security.getProfile('myProfile'); + + console.log(response); + /* + Profile { + _id: 'myProfile', + policies: + [ { roleId: 'admin', + restrictedTo: + [ { index: 'someIndex' }, + { index: 'anotherIndex', collections: [ 'someCollection' ] } ] }, + { roleId: 'default' } ] } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-profile/snippets/get-profile.test.yml b/doc/6/controllers/security/get-profile/snippets/get-profile.test.yml new file mode 100644 index 000000000..b1bdc9dc1 --- /dev/null +++ b/doc/6/controllers/security/get-profile/snippets/get-profile.test.yml @@ -0,0 +1,26 @@ +name: security#getProfile +description: get profile +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "policies": [ + { + "roleId": "admin", + "restrictedTo": [ + { "index": "someIndex" }, + { + "index": "anotherIndex", + "collections": [ + "someCollection" + ] + } + ] + }, + { + "roleId": "default" + } + ] + }' kuzzle:7512/profiles/myProfile/_create + after: curl -XDELETE kuzzle:7512/profiles/myProfile +template: default +expected: '^ \[ { roleId: ''admin'', restrictedTo: \[Array\] },$' diff --git a/doc/6/controllers/security/get-role-mapping/index.md b/doc/6/controllers/security/get-role-mapping/index.md new file mode 100644 index 000000000..e9da031c7 --- /dev/null +++ b/doc/6/controllers/security/get-role-mapping/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: getRoleMapping +description: Gets the mapping of the internal security roles collection. +--- + +# getRoleMapping + +Gets the mapping of the internal security roles collection. + +
+ +```js +getRoleMapping([options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object representing the internal roles mapping, using [Elasticsearch mapping format](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping.html). + +## Usage + +<<< ./snippets/get-role-mapping.js diff --git a/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.js b/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.js new file mode 100644 index 000000000..a897ec945 --- /dev/null +++ b/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.js @@ -0,0 +1,10 @@ +try { + const response = await kuzzle.security.getRoleMapping(); + + console.log(response); + /* + { mapping: { controllers: { type: 'object', enabled: false } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.test.yml b/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.test.yml new file mode 100644 index 000000000..dc3260487 --- /dev/null +++ b/doc/6/controllers/security/get-role-mapping/snippets/get-role-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#getRoleMapping +description: get roles mapping +template: default +expected: '^{ mapping:' diff --git a/doc/6/controllers/security/get-role/index.md b/doc/6/controllers/security/get-role/index.md new file mode 100644 index 000000000..cf510c400 --- /dev/null +++ b/doc/6/controllers/security/get-role/index.md @@ -0,0 +1,39 @@ +--- +code: true +type: page +title: getRole +description: Gets a security role +--- + +# getRole + +Gets a security role. + +
+ +```js +getRole(id, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `id` |
string
| Role identifier | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +The retrieved [`Role`](/sdk/js/6/core-classes/role) object. + +## Usage + +<<< ./snippets/get-role.js diff --git a/doc/6/controllers/security/get-role/snippets/get-role.js b/doc/6/controllers/security/get-role/snippets/get-role.js new file mode 100644 index 000000000..f9a844b41 --- /dev/null +++ b/doc/6/controllers/security/get-role/snippets/get-role.js @@ -0,0 +1,15 @@ +try { + const response = await kuzzle.security.getRole('myRole'); + + console.log(response); + /* + Role { + _id: 'myRole', + controllers: + { auth: + { actions: { login: true, getMyRights: true, updateSelf: true } }, + document: { actions: { get: true, search: true } } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-role/snippets/get-role.test.yml b/doc/6/controllers/security/get-role/snippets/get-role.test.yml new file mode 100644 index 000000000..e17e33b90 --- /dev/null +++ b/doc/6/controllers/security/get-role/snippets/get-role.test.yml @@ -0,0 +1,24 @@ +name: security#getRole +description: get role +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "controllers": { + "auth": { + "actions": { + "login": true, + "getMyRights": true, + "updateSelf": true + } + }, + "document": { + "actions": { + "get": true, + "search": true + } + } + } + }' kuzzle:7512/roles/myRole/_create + after: curl -XDELETE kuzzle:7512/roles/myRole +template: default +expected: '^ { auth: { actions: \[Object\] }, document: { actions: \[Object\] } } }$' diff --git a/doc/6/controllers/security/get-user-mapping/index.md b/doc/6/controllers/security/get-user-mapping/index.md new file mode 100644 index 000000000..0b34a8151 --- /dev/null +++ b/doc/6/controllers/security/get-user-mapping/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: getUserMapping +description: Gets the mapping of the internal users collection. +--- + +# getUserMapping + +Gets the mapping of the internal users collection. + +
+ +```js +getUserMapping([options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `options` |
object
| Query options | + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An object representing the internal users mapping, using [Elasticsearch mapping format](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping.html). + +## Usage + +<<< ./snippets/get-user-mapping.js diff --git a/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.js b/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.js new file mode 100644 index 000000000..34f0cb52e --- /dev/null +++ b/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.js @@ -0,0 +1,17 @@ +try { + const response = await kuzzle.security.getUserMapping(); + + console.log(response); + /* + { mapping: + { firstname: + { type: 'text', + fields: { keyword: { type: 'keyword', ignore_above: 256 } } }, + lastname: + { type: 'text', + fields: { keyword: { type: 'keyword', ignore_above: 256 } } }, + profileIds: { type: 'keyword' } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.test.yml b/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.test.yml new file mode 100644 index 000000000..878670ec5 --- /dev/null +++ b/doc/6/controllers/security/get-user-mapping/snippets/get-user-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#getUserMapping +description: get users mapping +template: default +expected: '^{ mapping:' diff --git a/doc/6/controllers/security/get-user-rights/index.md b/doc/6/controllers/security/get-user-rights/index.md new file mode 100644 index 000000000..70b36408b --- /dev/null +++ b/doc/6/controllers/security/get-user-rights/index.md @@ -0,0 +1,45 @@ +--- +code: true +type: page +title: getUserRights +description: Gets the detailed rights granted to a user +--- + +# getUserRights + +Gets the detailed rights granted to a user. + +
+ +```js +getUserRights(kui, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An array of objects. Each object is a security right granted or denied to the user: + +- `controller`: impacted controller +- `action`: impacted controller action +- `index`: index name +- `collection`: collection name +- `value`: tell if access if `allowed` or `denied`. If closures have been configured on the detailed scope, the value is `conditional`. + + +## Usage + +<<< ./snippets/get-user-rights.js + diff --git a/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.js b/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.js new file mode 100644 index 000000000..4253d44bf --- /dev/null +++ b/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.js @@ -0,0 +1,14 @@ +try { + const response = await kuzzle.security.getUserRights('john.doe'); + + console.log(response); + /* + [ { controller: '*', + action: '*', + index: '*', + collection: '*', + value: 'allowed' } ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.test.yml b/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.test.yml new file mode 100644 index 000000000..e0a7de1ec --- /dev/null +++ b/doc/6/controllers/security/get-user-rights/snippets/get-user-rights.test.yml @@ -0,0 +1,19 @@ +name: security#getUserRights +description: get user rights +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ], + "fullName": "John Doe" + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^ value: ''allowed'' } ]$' diff --git a/doc/6/controllers/security/get-user/index.md b/doc/6/controllers/security/get-user/index.md new file mode 100644 index 000000000..4a946e6dc --- /dev/null +++ b/doc/6/controllers/security/get-user/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: getUser +description: Gets a user +--- + +# getUser + +Gets a user. + +
+ +```js +getUser(kuid, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +The retrieved [`User`](sdk/js/6/core-classes/user/introduction) object. + +## Usage + +<<< ./snippets/get-user.js + diff --git a/doc/6/controllers/security/get-user/snippets/get-user.js b/doc/6/controllers/security/get-user/snippets/get-user.js new file mode 100644 index 000000000..7cae471b7 --- /dev/null +++ b/doc/6/controllers/security/get-user/snippets/get-user.js @@ -0,0 +1,19 @@ +try { + const response = await kuzzle.security.getUser('john.doe'); + + console.log(response); + /* + User { + _id: 'john.doe', + content: + { profileIds: [ 'default' ], + fullName: 'John Doe', + _kuzzle_info: + { author: -1, + createdAt: 1561447939790, + updatedAt: null, + updater: null } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/get-user/snippets/get-user.test.yml b/doc/6/controllers/security/get-user/snippets/get-user.test.yml new file mode 100644 index 000000000..3857b743f --- /dev/null +++ b/doc/6/controllers/security/get-user/snippets/get-user.test.yml @@ -0,0 +1,19 @@ +name: security#getUser +description: get user +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ], + "fullName": "John Doe" + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^ fullName: ''John Doe'',$' diff --git a/doc/6/controllers/security/has-credentials/index.md b/doc/6/controllers/security/has-credentials/index.md new file mode 100644 index 000000000..97e674488 --- /dev/null +++ b/doc/6/controllers/security/has-credentials/index.md @@ -0,0 +1,39 @@ +--- +code: true +type: page +title: hasCredentials +description: Checks if a user has credentials registered for the specified authentication strategy. +--- + +# hasCredentials + +Checks if a user has credentials registered for the specified authentication strategy. + +
+ +```js +hasCredentials(strategy, kuid, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `strategy` |
string
| Strategy identifier | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +A boolean telling whether the user can log in using the provided authentication strategy. + +## Usage + +<<< ./snippets/has-credentials.js + diff --git a/doc/6/controllers/security/has-credentials/snippets/has-credentials.js b/doc/6/controllers/security/has-credentials/snippets/has-credentials.js new file mode 100644 index 000000000..81e9fa213 --- /dev/null +++ b/doc/6/controllers/security/has-credentials/snippets/has-credentials.js @@ -0,0 +1,10 @@ +try { + const response = await kuzzle.security.hasCredentials('local', 'john.doe'); + + console.log(response); + /* + true + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/has-credentials/snippets/has-credentials.test.yml b/doc/6/controllers/security/has-credentials/snippets/has-credentials.test.yml new file mode 100644 index 000000000..81f335cd7 --- /dev/null +++ b/doc/6/controllers/security/has-credentials/snippets/has-credentials.test.yml @@ -0,0 +1,19 @@ +name: security#hasCredentials +description: has credentials +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ], + "fullName": "John Doe" + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: ^true$ diff --git a/doc/6/controllers/security/index.md b/doc/6/controllers/security/index.md new file mode 100644 index 000000000..80bfee617 --- /dev/null +++ b/doc/6/controllers/security/index.md @@ -0,0 +1,8 @@ +--- +code: true +type: branch +title: security +description: Security controller +--- + +# Security diff --git a/doc/6/controllers/security/m-delete-profiles/index.md b/doc/6/controllers/security/m-delete-profiles/index.md new file mode 100644 index 000000000..1a91f61e1 --- /dev/null +++ b/doc/6/controllers/security/m-delete-profiles/index.md @@ -0,0 +1,41 @@ +--- +code: true +type: page +title: mDeleteProfiles +description: Deletes multiple security profiles. +--- + +# mDeleteProfiles + +Deletes multiple security profiles. + +Throws a partial error (error code 206) if one or more profile deletions fail. + +
+ +```js +mDeleteProfiles(ids, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `ids` |
array<string>
| Profile identifiers | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the profiles deletion is indexed | + +## Resolves + +An array of the deleted profile ids. + +## Usage + +<<< ./snippets/m-delete-profiles.js + diff --git a/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.js b/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.js new file mode 100644 index 000000000..bcd9a2682 --- /dev/null +++ b/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.js @@ -0,0 +1,16 @@ +try { + const response = await kuzzle.security.mDeleteProfiles([ + 'profile1', + 'profile2', + 'profile3', + 'profile4', + 'profile5' + ]); + + console.log(response); + /* + [ 'profile1', 'profile2', 'profile3', 'profile4', 'profile5' ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.test.yml b/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.test.yml new file mode 100644 index 000000000..b017d8aea --- /dev/null +++ b/doc/6/controllers/security/m-delete-profiles/snippets/m-delete-profiles.test.yml @@ -0,0 +1,11 @@ +name: security#mDeleteProfiles +description: mdelete profiles +hooks: + before: | + for i in 1 2 3 4 5; do + curl -H "Content-type: application/json" -d '{ + "policies": [{ "roleId": "default" }] + }' kuzzle:7512/profiles/profile${i}/_create + done +template: default +expected: '^\[ ''profile1'', ''profile2'', ''profile3'', ''profile4'', ''profile5'' \]$' diff --git a/doc/6/controllers/security/m-delete-roles/index.md b/doc/6/controllers/security/m-delete-roles/index.md new file mode 100644 index 000000000..77dd59675 --- /dev/null +++ b/doc/6/controllers/security/m-delete-roles/index.md @@ -0,0 +1,41 @@ +--- +code: true +type: page +title: mDeleteRoles +description: Deletes multiple security roles. +--- + +# mDeleteRoles + +Deletes multiple security roles. + +Throws a partial error (error code 206) if one or more role deletions fail. + +
+ +```js +mDeleteRoles(ids, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `ids` |
array<string>
| Role identifiers | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the roles deletion is indexed | + +## Resolves + +An array of the deleted roles ids. + +## Usage + +<<< ./snippets/m-delete-roles.js + diff --git a/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.js b/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.js new file mode 100644 index 000000000..2cd3e878e --- /dev/null +++ b/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.js @@ -0,0 +1,16 @@ +try { + const response = await kuzzle.security.mDeleteRoles([ + 'role1', + 'role2', + 'role3', + 'role4', + 'role5' + ]); + + console.log(response); + /* + [ 'role1', 'role2', 'role3', 'role4', 'role5' ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.test.yml b/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.test.yml new file mode 100644 index 000000000..5578d3834 --- /dev/null +++ b/doc/6/controllers/security/m-delete-roles/snippets/m-delete-roles.test.yml @@ -0,0 +1,17 @@ +name: security#mDeleteRoles +description: mdelete roles +hooks: + before: | + for i in 1 2 3 4 5; do + curl -H "Content-type: application/json" -d '{ + "controllers": { + "*": { + "actions": { + "*": true + } + } + } + }' kuzzle:7512/roles/role${i}/_create + done +template: default +expected: '^\[ ''role1'', ''role2'', ''role3'', ''role4'', ''role5'' \]$' diff --git a/doc/6/controllers/security/m-delete-users/index.md b/doc/6/controllers/security/m-delete-users/index.md new file mode 100644 index 000000000..b835fef65 --- /dev/null +++ b/doc/6/controllers/security/m-delete-users/index.md @@ -0,0 +1,41 @@ +--- +code: true +type: page +title: mDeleteUsers +description: Deletes multiple users +--- + +# mDeleteUsers + +Deletes multiple users. + +Throws a partial error (error code 206) if one or more user deletions fail. + +
+ +```js +mDeleteUsers(kuids, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuids` |
array<string>
| Array of user [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the users deletion is indexed | + +## Resolves + +An array of the deleted user ids. + +## Usage + +<<< ./snippets/m-delete-users.js + diff --git a/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.js b/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.js new file mode 100644 index 000000000..7e523e9e4 --- /dev/null +++ b/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.js @@ -0,0 +1,14 @@ +try { + const response = await kuzzle.security.mDeleteUsers([ + 'user1', + 'user2', + 'user3' + ]); + + console.log(response); + /* + [ 'user1', 'user2', 'user3' ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.test.yml b/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.test.yml new file mode 100644 index 000000000..be9ebea3d --- /dev/null +++ b/doc/6/controllers/security/m-delete-users/snippets/m-delete-users.test.yml @@ -0,0 +1,19 @@ +name: security#mDeleteUsers +description: mdelete users +hooks: + before: | + for i in 1 2 3; do + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ] + }, + "credentials": { + "local": { + "username": "user'${i}'", + "password": "pass" + } + } + }' kuzzle:7512/users/user${i}/_create + done +template: default +expected: '^\[ ''user1'', ''user2'', ''user3'' \]$' diff --git a/doc/6/controllers/security/m-get-profiles/index.md b/doc/6/controllers/security/m-get-profiles/index.md new file mode 100644 index 000000000..f9b6724f8 --- /dev/null +++ b/doc/6/controllers/security/m-get-profiles/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: mGetProfiles +description: Gets multiple security profiles +--- + +# mGetProfiles + +Gets multiple security profiles. + +
+ +```js +mGetProfiles(ids, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `ids` |
array<string>
| Profile identifiers | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An array of retrieved [`Profile`](/sdk/js/6/core-classes/profile/introduction) objects. + +## Usage + +<<< ./snippets/m-get-profiles.js + diff --git a/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.js b/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.js new file mode 100644 index 000000000..365cdba4e --- /dev/null +++ b/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.js @@ -0,0 +1,22 @@ +try { + const response = await kuzzle.security.mGetProfiles([ + 'profile1', + 'profile2', + 'profile3' + ]); + + console.log(response); + /* + [ Profile { + _id: 'profile1', + policies: [ [Object] ] }, + Profile { + _id: 'profile2', + policies: [ [Object] ] }, + Profile { + _id: 'profile3'; + policies: [ [Object] ] } ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.test.yml b/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.test.yml new file mode 100644 index 000000000..d20ca0ba1 --- /dev/null +++ b/doc/6/controllers/security/m-get-profiles/snippets/m-get-profiles.test.yml @@ -0,0 +1,15 @@ +name: security#mGetProfiles +description: mget profiles +hooks: + before: | + for i in 1 2 3; do + curl -H "Content-type: application/json" -d '{ + "policies": [{"roleId": "default"}] + }' kuzzle:7512/profiles/profile${i}/_create + done + after: | + for i in 1 2 3; do + curl -XDELETE kuzzle:7512/profiles/profile${i} + done +template: default +expected: '^ policies: \[ \[Object\] \] } \]$' diff --git a/doc/6/controllers/security/m-get-roles/index.md b/doc/6/controllers/security/m-get-roles/index.md new file mode 100644 index 000000000..151b2c030 --- /dev/null +++ b/doc/6/controllers/security/m-get-roles/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: mGetRoles +description: Gets multiple security roles +--- + +# mGetRoles + +Gets multiple security roles. + +
+ +```js +mGetRoles(ids, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `ids` |
array<string>
| Roles identifiers | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An array of retrieved [`Role`](/sdk/js/6/core-classes/role/introduction) objects. + +## Usage + +<<< ./snippets/m-get-roles.js + diff --git a/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.js b/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.js new file mode 100644 index 000000000..a992bf825 --- /dev/null +++ b/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.js @@ -0,0 +1,22 @@ +try { + const response = await kuzzle.security.mGetRoles([ + 'role1', + 'role2', + 'role3' + ]); + + console.log(response); + /* + [ Role { + _id: 'role1', + controllers: { '*': [Object] } }, + Role { + _id: 'role2', + controllers: { '*': [Object] } }, + Role { + _id: 'role3', + controllers: { '*': [Object] } } ] + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.test.yml b/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.test.yml new file mode 100644 index 000000000..ea2870d33 --- /dev/null +++ b/doc/6/controllers/security/m-get-roles/snippets/m-get-roles.test.yml @@ -0,0 +1,21 @@ +name: security#mGetRoles +description: mget roles +hooks: + before: | + for i in 1 2 3; do + curl -H "Content-type: application/json" -d '{ + "controllers": { + "*": { + "actions": { + "*": true + } + } + } + }' kuzzle:7512/roles/role${i}/_create + done + after: | + for i in 1 2 3; do + curl -XDELETE kuzzle:7512/roles/role${i} + done +template: default +expected: '^ _id: ''role3'',$' diff --git a/doc/6/controllers/security/replace-user/index.md b/doc/6/controllers/security/replace-user/index.md new file mode 100644 index 000000000..5cbf7ab70 --- /dev/null +++ b/doc/6/controllers/security/replace-user/index.md @@ -0,0 +1,63 @@ +--- +code: true +type: page +title: replaceUser +description: Replaces a user with new configuration. +--- + +# replaceUser + +Replaces a user with new configuration. + +
+ +```js +replaceUser(kuid, body, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `body` |
object
| User content | +| `options` |
object
| Query options | + +### body + +**mandatory properties** + +| Property | Type | Description | +| --- | --- | --- | +| `profileIds` |
array<string>
| Profile identifiers to assign the user to | + +**other properties** + +The body can be extended with any custom information. +Make sure to [update the user mapping](/sdk/js/6/controllers/security/update-user-mapping) collection to match your custom attributes. + +example: + +```js +{ + profileIds: [ 'default' ], + firstName: 'John', + lastName: 'Doe' +} +``` + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created user is indexed | + +## Resolves + +An [`User`](sdk/js/6/core-classes/user/introduction) object containing information about the updated user. + +## Usage + +<<< ./snippets/replace-user.js + diff --git a/doc/6/controllers/security/replace-user/snippets/replace-user.js b/doc/6/controllers/security/replace-user/snippets/replace-user.js new file mode 100644 index 000000000..b93c07d99 --- /dev/null +++ b/doc/6/controllers/security/replace-user/snippets/replace-user.js @@ -0,0 +1,24 @@ +try { + const response = await kuzzle.security.replaceUser('john.doe', { + profileIds: [ 'default' ], + firstName: 'John', + lastName: 'Doe' + }); + + console.log(response); + /* + User { + _id: 'john.doe', + content: + { profileIds: [ 'default' ], + firstName: 'John', + lastName: 'Doe', + _kuzzle_info: + { author: -1, + createdAt: 1561461975256, + updatedAt: null, + updater: null } } } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/replace-user/snippets/replace-user.test.yml b/doc/6/controllers/security/replace-user/snippets/replace-user.test.yml new file mode 100644 index 000000000..4a1c8e239 --- /dev/null +++ b/doc/6/controllers/security/replace-user/snippets/replace-user.test.yml @@ -0,0 +1,18 @@ +name: security#replaceUser +description: replace user +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "pass" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^ firstName: ''John'',$' diff --git a/doc/6/controllers/security/search-profiles/index.md b/doc/6/controllers/security/search-profiles/index.md new file mode 100644 index 000000000..82d186ec7 --- /dev/null +++ b/doc/6/controllers/security/search-profiles/index.md @@ -0,0 +1,47 @@ +--- +code: true +type: page +title: searchProfiles +description: Searches security profiles, optionally returning only those linked to the provided list of security roles +--- + +# searchProfiles + +Searches security profiles, optionally returning only those linked to the provided list of security roles. + +
+ +```js +searchProfiles([body], [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `body` |
object
| Query including role identifiers to search for | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `roles` |
array<string>
| Role identifiers | + +### options + +| Property | Type
(default) | Description | +| ---------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `from` |
number

(`0`) | Offset of the first document to fetch | +| `size` |
number

(`10`) | Maximum number of documents to retrieve per page | +| `scroll` |
string

(`""`) | When set, gets a forward-only cursor having its ttl set to the given value (ie `30s`; cf [elasticsearch time limits](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/common-options.html#time-units)) | + +## Resolves + +A [`SearchResult`](sdk/js/6/core-classes/search-result) object containing the retrieved [`Profile`](/sdk/js/6/core-classes/profile) objects. + +## Usage + +<<< ./snippets/search-profiles.js + diff --git a/doc/6/controllers/security/search-profiles/snippets/search-profiles.js b/doc/6/controllers/security/search-profiles/snippets/search-profiles.js new file mode 100644 index 000000000..fd43b196f --- /dev/null +++ b/doc/6/controllers/security/search-profiles/snippets/search-profiles.js @@ -0,0 +1,21 @@ +try { + const results = await kuzzle.security.searchProfiles({ + roles: [ 'default' ] + }); + + console.log(results); + /* + ProfileSearchResult { aggregations: undefined, + hits: + [ Profile { _id: 'profile1', policies: [Array] }, + Profile { _id: 'profile2', policies: [Array] }, + Profile { _id: 'profile3', policies: [Array] }, + Profile { _id: 'default', policies: [Array] } ], + fetched: 4, + total: 4 } + */ + + console.log(`Successfully retrieved ${results.total} profiles`); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/search-profiles/snippets/search-profiles.test.yml b/doc/6/controllers/security/search-profiles/snippets/search-profiles.test.yml new file mode 100644 index 000000000..8447e0ffd --- /dev/null +++ b/doc/6/controllers/security/search-profiles/snippets/search-profiles.test.yml @@ -0,0 +1,15 @@ +name: security#searchProfiles +description: search profiles +hooks: + before: | + for i in 1 2 3; do + curl -H "Content-type: application/json" -d '{ + "policies": [{ "roleId": "default" }] + }' kuzzle:7512/profiles/profile${i}/_create?refresh=wait_for + done + after: | + for i in 1 2 3; do + curl -XDELETE kuzzle:7512/profiles/profile${i} + done +template: default +expected: ^Successfully retrieved 4 profiles$ diff --git a/doc/6/controllers/security/search-roles/index.md b/doc/6/controllers/security/search-roles/index.md new file mode 100644 index 000000000..cbf48aeca --- /dev/null +++ b/doc/6/controllers/security/search-roles/index.md @@ -0,0 +1,47 @@ +--- +code: true +type: page +title: searchRoles +description: Searches security roles, optionally returning only those allowing access to the provided controllers. +--- + +# searchRoles + +Searches security roles, optionally returning only those allowing access to the provided controllers. + +
+ +```js +searchRoles([body], [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `body` |
object
| Query including allowed controllers to search for | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `controllers` |
array<string>
| Role identifiers | + +### options + +| Property | Type
(default) | Description | +| ---------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `from` |
number

(`0`) | Offset of the first document to fetch | +| `size` |
number

(`10`) | Maximum number of documents to retrieve per page | +| `scroll` |
string

(`""`) | When set, gets a forward-only cursor having its ttl set to the given value (ie `30s`; cf [elasticsearch time limits](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/common-options.html#time-units)) | + +## Resolves + +A [`SearchResult`](sdk/js/6/core-classes/search-result) object containing the retrieved [`Role`](/sdk/js/6/core-classes/role) objects. + +## Usage + +<<< ./snippets/search-roles.js + diff --git a/doc/6/controllers/security/search-roles/snippets/search-roles.js b/doc/6/controllers/security/search-roles/snippets/search-roles.js new file mode 100644 index 000000000..a6ac3be5f --- /dev/null +++ b/doc/6/controllers/security/search-roles/snippets/search-roles.js @@ -0,0 +1,21 @@ +try { + const results = await kuzzle.security.searchRoles({ + controllers: ['auth'] + }); + + console.log(results); + /* + RoleSearchResult { + aggregations: undefined, + hits: + [ Role { _id: 'admin', controllers: [Object] }, + Role { _id: 'default', controllers: [Object] }, + Role { _id: 'anonymous', controllers: [Object] } ] + fetched: 3, + total: 3 } + */ + + console.log(`Successfully retrieved ${results.total} roles`); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/search-roles/snippets/search-roles.test.yml b/doc/6/controllers/security/search-roles/snippets/search-roles.test.yml new file mode 100644 index 000000000..64cb86570 --- /dev/null +++ b/doc/6/controllers/security/search-roles/snippets/search-roles.test.yml @@ -0,0 +1,4 @@ +name: security#searchRoles +description: search roles +template: default +expected: ^Successfully retrieved 3 roles$ diff --git a/doc/6/controllers/security/search-users/index.md b/doc/6/controllers/security/search-users/index.md new file mode 100644 index 000000000..a7b0e5c4b --- /dev/null +++ b/doc/6/controllers/security/search-users/index.md @@ -0,0 +1,47 @@ +--- +code: true +type: page +title: searchUsers +description: Searches users +--- + +# searchUsers + +Searches users. + +
+ +```js +searchUsers([query], [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `query` |
object
| Search query | +| `options` |
object
| Query options | + +### query + +The search query to apply to users content, using [ElasticSearch Query DSL](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl.html) syntax. + +If left empty, the result will return all available users. + +### options + +| Property | Type
(default) | Description | +| ---------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `from` |
number

(`0`) | Offset of the first document to fetch | +| `size` |
number

(`10`) | Maximum number of documents to retrieve per page | +| `scroll` |
string

(`""`) | When set, gets a forward-only cursor having its ttl set to the given value (ie `30s`; cf [elasticsearch time limits](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/common-options.html#time-units)) | + +## Resolves + +A [`SearchResult`](sdk/js/6/core-classes/search-result) object containing the retrieved [`User`](/sdk/js/6/core-classes/user) objects. + +## Usage + +<<< ./snippets/search-users.js + diff --git a/doc/6/controllers/security/search-users/snippets/search-users.js b/doc/6/controllers/security/search-users/snippets/search-users.js new file mode 100644 index 000000000..1d9279a40 --- /dev/null +++ b/doc/6/controllers/security/search-users/snippets/search-users.js @@ -0,0 +1,23 @@ +try { + const results = await kuzzle.security.searchUsers({ + term: { + status: 'student' + } + }); + + console.log(results); + /* + UserSearchResult { + aggregations: undefined, + hits: + [ User { _kuzzle: [Kuzzle], _id: 'user2', content: [Object] }, + User { _kuzzle: [Kuzzle], _id: 'user1', content: [Object] }, + User { _kuzzle: [Kuzzle], _id: 'user3', content: [Object] } ], + fetched: 3, + total: 3 } + */ + + console.log(`Successfully retrieved ${results.total} users`); +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/search-users/snippets/search-users.test.yml b/doc/6/controllers/security/search-users/snippets/search-users.test.yml new file mode 100644 index 000000000..cce40d830 --- /dev/null +++ b/doc/6/controllers/security/search-users/snippets/search-users.test.yml @@ -0,0 +1,19 @@ +name: security#searchUsers +description: search users +hooks: + before: | + for i in 1 2 3; do + curl -H "Content-type: application/json" -d '{ + "content": { + "profileIds": [ "default" ], + "status": "student" + }, + "credentials": {} + }' kuzzle:7512/users/user${i}/_create?refresh=wait_for + done + after: | + for i in 1 2 3; do + curl -XDELETE kuzzle:7512/users/user${i} + done +template: default +expected: ^Successfully retrieved 3 users$ diff --git a/doc/6/controllers/security/update-credentials/index.md b/doc/6/controllers/security/update-credentials/index.md new file mode 100644 index 000000000..4d98456a9 --- /dev/null +++ b/doc/6/controllers/security/update-credentials/index.md @@ -0,0 +1,56 @@ +--- +code: true +type: page +title: updateCredentials +description: Updates a user credentials for the specified authentication strategy. +--- + +# updateCredentials + +Updates a user credentials for the specified authentication strategy. + +
+ +```js +updateCredentials(strategy, kuid, credentials, [options]); +``` + +
+ +| Property | Type | Description | +| --- | --- | --- | +| `strategy` |
string
| Strategy to use | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `credentials` |
object
| New credentials | +| `options` |
object
| Query options | + +### credentials + +The credentials to send. The expected properties depend on the target authentication strategy. + +Example for the `local` strategy: + +```js +{ + username: 'foo', + password: 'bar' +} +``` + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the credentials are indexed | + +## Resolves + +An `object` representing the new credentials. +The content depends on the authentication strategy. + +## Usage + +<<< ./snippets/update-credentials.js diff --git a/doc/6/controllers/security/update-credentials/snippets/update-credentials.js b/doc/6/controllers/security/update-credentials/snippets/update-credentials.js new file mode 100644 index 000000000..afe476a8e --- /dev/null +++ b/doc/6/controllers/security/update-credentials/snippets/update-credentials.js @@ -0,0 +1,17 @@ +try { + const response = await kuzzle.security.updateCredentials( + 'local', + 'john.doe', + { + username: 'jdoe', + password: 'newPassword' + } + ); + + console.log(response); + /* + { username: "jdoe" } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-credentials/snippets/update-credentials.test.yml b/doc/6/controllers/security/update-credentials/snippets/update-credentials.test.yml new file mode 100644 index 000000000..b089d1136 --- /dev/null +++ b/doc/6/controllers/security/update-credentials/snippets/update-credentials.test.yml @@ -0,0 +1,18 @@ +name: security#updateCredentials +description: update credentials +hooks: + before: > + curl -H "Content-type: application/json" -f -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "pass" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^{ username: ''jdoe'', kuid: ''john.doe'' }$' diff --git a/doc/6/controllers/security/update-profile-mapping/index.md b/doc/6/controllers/security/update-profile-mapping/index.md new file mode 100644 index 000000000..4b5c020df --- /dev/null +++ b/doc/6/controllers/security/update-profile-mapping/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: updateProfileMapping +description: Updates the internal profile storage mapping. +--- + +# updateProfileMapping + +Updates the internal profile storage mapping. + +
+ +```js +updateProfileMapping(mapping, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `mapping` |
object
| Profile collection [mapping definition](/core/1/guides/essentials/database-mappings) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/update-profile-mapping.js + diff --git a/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.js b/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.js new file mode 100644 index 000000000..4703c7c24 --- /dev/null +++ b/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.js @@ -0,0 +1,14 @@ +try { + const response = await kuzzle.security.updateProfileMapping({ + properties: { + description: { type: 'text' } + } + }); + + console.log(response); + /* + { acknowledged: true } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.test.yml b/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.test.yml new file mode 100644 index 000000000..9c52a838e --- /dev/null +++ b/doc/6/controllers/security/update-profile-mapping/snippets/update-profile-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#updateProfileMapping +description: update profile mapping +template: default +expected: '^{ acknowledged: true }$' diff --git a/doc/6/controllers/security/update-profile/index.md b/doc/6/controllers/security/update-profile/index.md new file mode 100644 index 000000000..c7e47f31a --- /dev/null +++ b/doc/6/controllers/security/update-profile/index.md @@ -0,0 +1,40 @@ +--- +code: true +type: page +title: updateProfile +description: Updates a security profile definition +--- + +# updateProfile + +Updates a security profile definition. + +
+ +```js +updateProfile(id, profile, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `id` |
string
| Profile identifier | +| `profile` |
object
| [Profile definition content](/core/1/guides/essentials/security/#defining-profiles) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the created profile is indexed | + +## Resolves + +A [`Profile`](/sdk/js/6/core-classes/profile/introduction) object representing the updated profile. + +## Usage + +<<< ./snippets/update-profile.js + diff --git a/doc/6/controllers/security/update-profile/snippets/update-profile.js b/doc/6/controllers/security/update-profile/snippets/update-profile.js new file mode 100644 index 000000000..926c8ac24 --- /dev/null +++ b/doc/6/controllers/security/update-profile/snippets/update-profile.js @@ -0,0 +1,42 @@ +try { + const response = await kuzzle.security.updateProfile( + 'myProfile', + { + policies: [ + { + roleId: 'default' + }, + { + roleId: 'privileged', + restrictedTo: [ + { + index: 'someIndex' + }, + { + index: 'anotherIndex', + collections: [ + 'coll1', + 'coll2' + ] + } + ] + } + ] + } + ); + + console.log(response); + /* + Profile { + _id: 'myProfile', + policies: + [ { roleId: 'default' }, + { roleId: 'privileged', + restrictedRo: + [ { index: 'someIndex' }, + { index: 'anotherIndex', collections: [ 'coll1', 'coll2' ] } ] } ] + */ + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-profile/snippets/update-profile.test.yml b/doc/6/controllers/security/update-profile/snippets/update-profile.test.yml new file mode 100644 index 000000000..153b82ecb --- /dev/null +++ b/doc/6/controllers/security/update-profile/snippets/update-profile.test.yml @@ -0,0 +1,10 @@ +name: security#updateProfile +description: update profile +hooks: + before: > + curl -H "Content-type: application/json" -d '{ + "policies": [] + }' kuzzle:7512/profiles/myProfile/_create + after: curl -XDELETE kuzzle:7512/profiles/myProfile +template: default +expected: '^ { roleId: ''privileged'', restrictedTo: \[Array\] } \] }$' diff --git a/doc/6/controllers/security/update-role-mapping/index.md b/doc/6/controllers/security/update-role-mapping/index.md new file mode 100644 index 000000000..5d247782f --- /dev/null +++ b/doc/6/controllers/security/update-role-mapping/index.md @@ -0,0 +1,37 @@ +--- +code: true +type: page +title: updateRoleMapping +description: Updates the internal role storage mapping. +--- + +# updateRoleMapping + +Updates the internal role storage mapping. + +
+ +```js +updateRoleMapping(mapping, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `mapping` |
object
| Role collection [mapping definition](/core/1/guides/essentials/database-mappings) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/update-role-mapping.js diff --git a/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.js b/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.js new file mode 100644 index 000000000..3bc9dc520 --- /dev/null +++ b/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.js @@ -0,0 +1,14 @@ +try { + const response = await kuzzle.security.updateRoleMapping({ + properties: { + description: { type: 'text' } + } + }); + + console.log(response); + /* + { acknowledged: true } + */ +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.test.yml b/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.test.yml new file mode 100644 index 000000000..161f83f5f --- /dev/null +++ b/doc/6/controllers/security/update-role-mapping/snippets/update-role-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#updateRoleMapping +description: update role mapping +template: default +expected: '^{ acknowledged: true }$' diff --git a/doc/6/controllers/security/update-role/index.md b/doc/6/controllers/security/update-role/index.md new file mode 100644 index 000000000..49fae30c7 --- /dev/null +++ b/doc/6/controllers/security/update-role/index.md @@ -0,0 +1,47 @@ +--- +code: true +type: page +title: updateRole +description: Updates a security role definition +--- + +# updateRole + +Updates a security role definition. + +**Note**: partial updates are not supported for roles, this API route will replace the entire role content with the provided one. + +
+ +```js +updateRole(id, body, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `id` |
string
| Role identifier | +| `body` |
object
| Role definition content | +| `options` |
object
| Query options | + +### body + +| Property | Type | Description | +| --- | --- | --- | +| `controllers` |
object
| [Role definition](/core/1/guides/essentials/security/#defining-roles) | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the updated role is indexed | + +## Resolves + +A [`Role`](/sdk/js/6/core-classes/role) object representing the updated role. + +## Usage + +<<< ./snippets/update-role.js diff --git a/doc/6/controllers/security/update-role/snippets/update-role.js b/doc/6/controllers/security/update-role/snippets/update-role.js new file mode 100644 index 000000000..ca54743d2 --- /dev/null +++ b/doc/6/controllers/security/update-role/snippets/update-role.js @@ -0,0 +1,51 @@ +try { + const response = await kuzzle.security.updateRole( + 'read-only', + { + controllers: { + auth: { + actions: { + getCurrentUser: true, + getMyCredentials: true, + getMyRights: true, + logout: true + } + }, + collection: { + actions: { + getMapping: true, + list: true + } + }, + document: { + actions: { + count: true, + get: true, + mGet: true, + scroll: true, + search: true + } + }, + index: { + actions: { + list: true + } + } + } + } + ); + + console.log(response); + /* + Role { + _id: 'read-only', + controllers: + { auth: { actions: [Object] }, + collection: { actions: [Object] }, + document: { actions: [Object] }, + index: { actions: [Object] } } } + */ + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-role/snippets/update-role.test.yml b/doc/6/controllers/security/update-role/snippets/update-role.test.yml new file mode 100644 index 000000000..e865c6c1b --- /dev/null +++ b/doc/6/controllers/security/update-role/snippets/update-role.test.yml @@ -0,0 +1,16 @@ +name: security#updateRole +description: update role +hooks: + before: > + curl -f -H "Content-type: application/json" -d '{ + "controllers": { + "*": { + "actions": { + "*": false + } + } + } + }' kuzzle:7512/roles/read-only/_create + after: curl -f -XDELETE kuzzle:7512/roles/read-only +template: default +expected: '^ { auth: { actions: \[Object\] },$' diff --git a/doc/6/controllers/security/update-user-mapping/index.md b/doc/6/controllers/security/update-user-mapping/index.md new file mode 100644 index 000000000..395b33ae1 --- /dev/null +++ b/doc/6/controllers/security/update-user-mapping/index.md @@ -0,0 +1,38 @@ +--- +code: true +type: page +title: updateUserMapping +description: Updates the internal user storage mapping. +--- + +# updateUserMapping + +Updates the internal user storage mapping. + +
+ +```js +updateUserMapping(mapping, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `mapping` |
object
| User collection [mapping definition](/core/1/guides/essentials/database-mappings) | +| `options` |
object
| Query options | + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +An acknowledgment message. + +## Usage + +<<< ./snippets/update-user-mapping.js + diff --git a/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.js b/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.js new file mode 100644 index 000000000..2cab3b27d --- /dev/null +++ b/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.js @@ -0,0 +1,20 @@ +try { + const response = await kuzzle.security.updateUserMapping({ + properties: { + firstName: { type: 'text' }, + lastName: { type: 'text' }, + birthDate: { + type: 'date', + format: 'yyyy-mm-dd' + } + } + }); + + console.log(response); + /* + { acknowledged: true } + */ + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.test.yml b/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.test.yml new file mode 100644 index 000000000..3ad4e32bb --- /dev/null +++ b/doc/6/controllers/security/update-user-mapping/snippets/update-user-mapping.test.yml @@ -0,0 +1,4 @@ +name: security#updateUserMapping +description: update user mapping +template: default +expected: '^{ acknowledged: true }$' diff --git a/doc/6/controllers/security/update-user/index.md b/doc/6/controllers/security/update-user/index.md new file mode 100644 index 000000000..ea10c6771 --- /dev/null +++ b/doc/6/controllers/security/update-user/index.md @@ -0,0 +1,58 @@ +--- +code: true +type: page +title: updateUser +description: Updates a user definition. +--- + +# updateUser + +Updates a user definition. + +
+ +```js +updateUser(kuid, body, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `body` |
object
| User content | +| `options` |
object
| Query options | + +### body + +The `body` contains the list of profile ids to attach the user to and potential additional information. +Any other attribute can be added. +Make sure to [update the user mapping](/sdk/js/6/controllers/security/update-user-mapping) collection to match your custom attributes. + +Example: + +```js +{ + profileIds: [ + 'default' + ], + firstName: 'John', + lastName: 'Doe' +} +``` + +### options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | +| `refresh` |
boolean

(`false`) | If set to `wait_for`, Kuzzle will not respond until the updated user is indexed | + +## Resolves + +A [`User`](sdk/js/6/core-classes/user/introduction) object containing information about the updated user. + +## Usage + +<<< ./snippets/update-user.js + diff --git a/doc/6/controllers/security/update-user/snippets/update-user.js b/doc/6/controllers/security/update-user/snippets/update-user.js new file mode 100644 index 000000000..d02ecb9e7 --- /dev/null +++ b/doc/6/controllers/security/update-user/snippets/update-user.js @@ -0,0 +1,27 @@ +try { + const response = await kuzzle.security.updateUser( + 'john.doe', + { + profileIds: ['default'], + firstName: 'John', + lastName: 'Doe' + } + ); + + console.log(response); + /* + User { + _id: 'john.doe', + content:, + { profileIds: [ 'default' ], + fullName: 'John Doe', + _kuzzle_info: + { author: '-1', + createdAt: 1561379086534, + updatedAt: null, + updater: null } } } + */ + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/update-user/snippets/update-user.test.yml b/doc/6/controllers/security/update-user/snippets/update-user.test.yml new file mode 100644 index 000000000..bc1cc0125 --- /dev/null +++ b/doc/6/controllers/security/update-user/snippets/update-user.test.yml @@ -0,0 +1,13 @@ +name: security#updateUser +description: update user +hooks: + before: > + curl -f -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { } + }' kuzzle:7512/users/john.doe/_create + after: curl -f -XDELETE kuzzle:7512/users/john.doe +template: default +expected: '^ firstName: ''John'',$' diff --git a/doc/6/controllers/security/validate-credentials/index.md b/doc/6/controllers/security/validate-credentials/index.md new file mode 100644 index 000000000..54357bf86 --- /dev/null +++ b/doc/6/controllers/security/validate-credentials/index.md @@ -0,0 +1,55 @@ +--- +code: true +type: page +title: validateCredentials +description: Checks if the provided credentials are well-formed. Does not actually save credentials. +--- + +# validateCredentials + +Checks if the provided credentials are well-formed. Does not actually save credentials. + +
+ +```js +validateCredentials(strategy, kuid, credentials, [options]); +``` + +
+ +| Property | Type | Description | +|--- |--- |--- | +| `strategy` |
string
| Strategy identifier | +| `kuid` |
string
| User [kuid](/core/1/guides/essentials/user-authentication/#kuzzle-user-identifier-kuid) | +| `credentials` |
object
| New credentials | +| `options` |
object
| Query options | + +### credentials + +The credentials to check. The expected properties depend on the target authentication strategy. + +Example for the `local` strategy: + +```js +{ + username: 'foo', + password: 'bar' +} +``` + +### options + +Additional query options + +| Property | Type
(default) | Description | +| --- | --- | --- | +| `queuable` |
boolean

(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | + +## Resolves + +A `boolean` telling whether credentials are valid. + +## Usage + +<<< ./snippets/validate-credentials.js + diff --git a/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.js b/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.js new file mode 100644 index 000000000..1a31f7348 --- /dev/null +++ b/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.js @@ -0,0 +1,18 @@ +try { + const response = await kuzzle.security.validateCredentials( + 'local', + 'john.doe', + { + username: 'jdoe', + password: 'password' + } + ); + + console.log(response); + /* + true + */ + +} catch (e) { + console.error(e); +} diff --git a/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.test.yml b/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.test.yml new file mode 100644 index 000000000..5fd0cb927 --- /dev/null +++ b/doc/6/controllers/security/validate-credentials/snippets/validate-credentials.test.yml @@ -0,0 +1,18 @@ +name: security#validateCredentials +description: validate credentials +hooks: + before: > + curl -f -H "Content-type: application/json" -d '{ + "content": { + "profileIds": ["default"] + }, + "credentials": { + "local": { + "username": "jdoe", + "password": "password" + } + } + }' kuzzle:7512/users/john.doe/_create + after: curl -f -XDELETE kuzzle:7512/users/john.doe +template: default +expected: ^true$ diff --git a/doc/docker-compose.yml b/doc/docker-compose.yml new file mode 100644 index 000000000..2404e52de --- /dev/null +++ b/doc/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' + +services: + doc: + image: kuzzleio/documentation:dev + ports: + - 8080:8080 + tty: true + volumes: + - cache:/var/app/node_modules/@vuepress/core/node_modules/.cache + - ./6:/var/app/src/sdk/js/6 + +volumes: + cache: diff --git a/package.json b/package.json index c05998ded..8f4d97e80 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "prepublish": "npm run build", "test": "npm run --silent lint && npm run unit-testing && npm run functional-testing", "unit-testing": "nyc --reporter=text-summary --reporter=lcov mocha", + "doc": "docker-compose -f doc/docker-compose.yml up", "doc-testing": "bash test-docs.sh", "functional-testing": "cucumber-js --exit --fail-fast", "lint": "eslint --max-warnings=0 ./src ./test", @@ -61,6 +62,7 @@ "should-sinon": "0.0.6", "sinon": "^7.3.0" }, + "engines": { "node": ">= 6.9.1" } diff --git a/test-docs.sh b/test-docs.sh index 8cafa5887..122d2e261 100644 --- a/test-docs.sh +++ b/test-docs.sh @@ -1,7 +1,11 @@ #!/bin/bash + +here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +cd "$here" + docker-compose -f .ci/doc/docker-compose.yml pull docker-compose -f .ci/doc/docker-compose.yml run doc-tests node index EXIT=$? docker-compose -f .ci/doc/docker-compose.yml down -exit $EXIT \ No newline at end of file +exit $EXIT