Skip to content

Commit 91e1d9c

Browse files
authored
Migrate authentication subsystem to the new platform. (#39446)
* Temporary Core workarounds. * Move files to NP Security Plugin. * Fix references. * Migrate to the New Platform. * Review#1: remove unused `loginAttempt` from provider iterator, rely more on RecursiveReadonly, etc. * Integrate latest core changes: isTlsEnabled and get rid of legacy ES config. * Revert `deepFreeze` changes and rely on `src/core/utils`. * Review#2: do not mutate injectedVars in onInit. Integrate latest upstream changes. * Use mocks provided by the Core. * Expect ElasticsearchError instead of Boom errors as 401 Cluster client errors. * Simplify session handling for `login`. * Review#3: properly handle session updates for `login`, remove redundant hapi-auth-cookie deps from x-pack package.json, migrate to new core sessionStorage API, integrate latest Kerberos provider changes from upstream * Do not clear session on login if it does not exist.
1 parent a4bedf0 commit 91e1d9c

File tree

81 files changed

+5771
-5399
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+5771
-5399
lines changed

src/test_utils/kbn_server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function createRootWithSettings(
7575
repl: false,
7676
basePath: false,
7777
optimize: false,
78-
oss: false,
78+
oss: true,
7979
...cliArgs,
8080
},
8181
isDevClusterMaster: false,

x-pack/legacy/plugins/security/__snapshots__/index.test.js.snap

Lines changed: 0 additions & 54 deletions
This file was deleted.

x-pack/legacy/plugins/security/common/model/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ export { Role, RoleIndexPrivilege, RoleKibanaPrivilege } from './role';
88
export { FeaturesPrivileges } from './features_privileges';
99
export { RawKibanaPrivileges, RawKibanaFeaturePrivileges } from './raw_kibana_privileges';
1010
export { KibanaPrivileges } from './kibana_privileges';
11-
export { User, EditUser, getUserDisplayName } from './user';
12-
export { AuthenticatedUser, canUserChangePassword } from './authenticated_user';
11+
export { User, EditUser, getUserDisplayName } from '../../../../../plugins/security/common/model';
12+
export {
13+
AuthenticatedUser,
14+
canUserChangePassword,
15+
} from '../../../../../plugins/security/common/model';
1316
export { BuiltinESPrivileges } from './builtin_es_privileges';

x-pack/legacy/plugins/security/index.d.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,12 @@
66

77
import { Legacy } from 'kibana';
88
import { AuthenticatedUser } from './common/model';
9-
import { AuthenticationResult, DeauthenticationResult } from './server/lib/authentication';
109
import { AuthorizationService } from './server/lib/authorization/service';
1110

1211
/**
1312
* Public interface of the security plugin.
1413
*/
1514
export interface SecurityPlugin {
1615
authorization: Readonly<AuthorizationService>;
17-
authenticate: (request: Legacy.Request) => Promise<AuthenticationResult>;
18-
deauthenticate: (request: Legacy.Request) => Promise<DeauthenticationResult>;
1916
getUser: (request: Legacy.Request) => Promise<AuthenticatedUser>;
20-
isAuthenticated: (request: Legacy.Request) => Promise<boolean>;
2117
}

x-pack/legacy/plugins/security/index.js

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
import { resolve } from 'path';
8-
import { getUserProvider } from './server/lib/get_user';
98
import { initAuthenticateApi } from './server/routes/api/v1/authenticate';
109
import { initUsersApi } from './server/routes/api/v1/users';
1110
import { initExternalRolesApi } from './server/routes/api/external/roles';
@@ -16,10 +15,7 @@ import { initOverwrittenSessionView } from './server/routes/views/overwritten_se
1615
import { initLoginView } from './server/routes/views/login';
1716
import { initLogoutView } from './server/routes/views/logout';
1817
import { initLoggedOutView } from './server/routes/views/logged_out';
19-
import { validateConfig } from './server/lib/validate_config';
20-
import { authenticateFactory } from './server/lib/auth_redirect';
2118
import { checkLicense } from './server/lib/check_license';
22-
import { initAuthenticator } from './server/lib/authentication/authenticator';
2319
import { SecurityAuditLogger } from './server/lib/audit_logger';
2420
import { AuditLogger } from '../../server/lib/audit_logger';
2521
import {
@@ -34,6 +30,7 @@ import { watchStatusAndLicenseToInitialize } from '../../server/lib/watch_status
3430
import { SecureSavedObjectsClientWrapper } from './server/lib/saved_objects_client/secure_saved_objects_client_wrapper';
3531
import { deepFreeze } from './server/lib/deep_freeze';
3632
import { createOptionalPlugin } from '../../server/lib/optional_plugin';
33+
import { KibanaRequest } from '../../../../src/core/server';
3734

3835
export const security = (kibana) => new kibana.Plugin({
3936
id: 'security',
@@ -42,23 +39,12 @@ export const security = (kibana) => new kibana.Plugin({
4239
require: ['kibana', 'elasticsearch', 'xpack_main'],
4340

4441
config(Joi) {
45-
const providerOptionsSchema = (providerName, schema) => Joi.any()
46-
.when('providers', {
47-
is: Joi.array().items(Joi.string().valid(providerName).required(), Joi.string()),
48-
then: schema,
49-
otherwise: Joi.any().forbidden(),
50-
});
51-
5242
return Joi.object({
5343
enabled: Joi.boolean().default(true),
54-
cookieName: Joi.string().default('sid'),
55-
encryptionKey: Joi.when(Joi.ref('$dist'), {
56-
is: true,
57-
then: Joi.string(),
58-
otherwise: Joi.string().default('a'.repeat(32)),
59-
}),
60-
sessionTimeout: Joi.number().allow(null).default(null),
61-
secureCookies: Joi.boolean().default(false),
44+
cookieName: Joi.any().description('This key is handled in the new platform security plugin ONLY'),
45+
encryptionKey: Joi.any().description('This key is handled in the new platform security plugin ONLY'),
46+
sessionTimeout: Joi.any().description('This key is handled in the new platform security plugin ONLY'),
47+
secureCookies: Joi.any().description('This key is handled in the new platform security plugin ONLY'),
6248
authorization: Joi.object({
6349
legacyFallback: Joi.object({
6450
enabled: Joi.boolean().default(true) // deprecated
@@ -67,11 +53,7 @@ export const security = (kibana) => new kibana.Plugin({
6753
audit: Joi.object({
6854
enabled: Joi.boolean().default(false)
6955
}).default(),
70-
authc: Joi.object({
71-
providers: Joi.array().items(Joi.string()).default(['basic']),
72-
oidc: providerOptionsSchema('oidc', Joi.object({ realm: Joi.string().required() }).required()),
73-
saml: providerOptionsSchema('saml', Joi.object({ realm: Joi.string().required() }).required()),
74-
}).default()
56+
authc: Joi.any().description('This key is handled in the new platform security plugin ONLY')
7557
}).default();
7658
},
7759

@@ -112,15 +94,18 @@ export const security = (kibana) => new kibana.Plugin({
11294
'plugins/security/hacks/on_unauthorized_response'
11395
],
11496
home: ['plugins/security/register_feature'],
115-
injectDefaultVars: function (server) {
116-
const config = server.config();
97+
injectDefaultVars: (server) => {
98+
const securityPlugin = server.newPlatform.setup.plugins.security;
99+
if (!securityPlugin) {
100+
throw new Error('New Platform XPack Security plugin is not available.');
101+
}
117102

118103
return {
119-
secureCookies: config.get('xpack.security.secureCookies'),
120-
sessionTimeout: config.get('xpack.security.sessionTimeout'),
121-
enableSpaceAwarePrivileges: config.get('xpack.spaces.enabled'),
104+
secureCookies: securityPlugin.config.secureCookies,
105+
sessionTimeout: securityPlugin.config.sessionTimeout,
106+
enableSpaceAwarePrivileges: server.config().get('xpack.spaces.enabled'),
122107
};
123-
}
108+
},
124109
},
125110

126111
async postInit(server) {
@@ -138,28 +123,29 @@ export const security = (kibana) => new kibana.Plugin({
138123
},
139124

140125
async init(server) {
141-
const plugin = this;
126+
const securityPlugin = server.newPlatform.setup.plugins.security;
127+
if (!securityPlugin) {
128+
throw new Error('New Platform XPack Security plugin is not available.');
129+
}
142130

143-
const config = server.config();
144131
const xpackMainPlugin = server.plugins.xpack_main;
145132
const xpackInfo = xpackMainPlugin.info;
133+
securityPlugin.registerLegacyAPI({
134+
xpackInfo,
135+
isSystemAPIRequest: server.plugins.kibana.systemApi.isSystemApiRequest.bind(
136+
server.plugins.kibana.systemApi
137+
),
138+
});
146139

140+
const plugin = this;
141+
const config = server.config();
147142
const xpackInfoFeature = xpackInfo.feature(plugin.id);
148143

149144
// Register a function that is called whenever the xpack info changes,
150145
// to re-compute the license check results for this plugin
151146
xpackInfoFeature.registerLicenseCheckResultsGenerator(checkLicense);
152147

153-
validateConfig(config, message => server.log(['security', 'warning'], message));
154-
155-
// Create a Hapi auth scheme that should be applied to each request.
156-
server.auth.scheme('login', () => ({ authenticate: authenticateFactory(server) }));
157-
158-
server.auth.strategy('session', 'login');
159-
160-
// The default means that the `session` strategy that is based on `login` schema defined above will be
161-
// automatically assigned to all routes that don't contain an auth config.
162-
server.auth.default('session');
148+
server.expose({ getUser: request => securityPlugin.authc.getCurrentUser(KibanaRequest.from(request)) });
163149

164150
const { savedObjects } = server;
165151

@@ -203,20 +189,17 @@ export const security = (kibana) => new kibana.Plugin({
203189
return client;
204190
});
205191

206-
getUserProvider(server);
207-
208-
await initAuthenticator(server);
209-
initAuthenticateApi(server);
192+
initAuthenticateApi(securityPlugin, server);
210193
initAPIAuthorization(server, authorization);
211194
initAppAuthorization(server, xpackMainPlugin, authorization);
212-
initUsersApi(server);
195+
initUsersApi(securityPlugin, server);
213196
initExternalRolesApi(server);
214197
initIndicesApi(server);
215198
initPrivilegesApi(server);
216199
initGetBuiltinPrivilegesApi(server);
217-
initLoginView(server, xpackMainPlugin);
200+
initLoginView(securityPlugin, server, xpackMainPlugin);
218201
initLogoutView(server);
219-
initLoggedOutView(server);
202+
initLoggedOutView(securityPlugin, server);
220203
initOverwrittenSessionView(server);
221204

222205
server.injectUiAppVars('login', () => {

x-pack/legacy/plugins/security/index.test.js

Lines changed: 0 additions & 116 deletions
This file was deleted.

x-pack/legacy/plugins/security/public/components/management/change_password_form/change_password_form.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { EuiFieldText } from '@elastic/eui';
77
import { ReactWrapper } from 'enzyme';
88
import React from 'react';
99
import { mountWithIntl } from 'test_utils/enzyme_helpers';
10-
import { User } from '../../../../common/model/user';
10+
import { User } from '../../../../common/model';
1111
import { UserAPIClient } from '../../../lib/api';
1212
import { ChangePasswordForm } from './change_password_form';
1313

x-pack/legacy/plugins/security/public/components/management/change_password_form/change_password_form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n';
1919
import { FormattedMessage } from '@kbn/i18n/react';
2020
import React, { ChangeEvent, Component } from 'react';
2121
import { toastNotifications } from 'ui/notify';
22-
import { User } from '../../../../common/model/user';
22+
import { User } from '../../../../common/model';
2323
import { UserAPIClient } from '../../../lib/api';
2424

2525
interface Props {

0 commit comments

Comments
 (0)