Skip to content

Configuring the Educates Backend Plugin#

This guide covers the configuration options available for the Educates backend plugin.

Configuration File#

The plugin is configured through your app-config.yaml. Here's a comprehensive example:

educates:
  # Required: Training portal configurations
  trainingPortals:
    - name: example-portal
      url: https://example-training-portal.com
      robotUsername: robot@educates
      robotPassword: ${EDUCATES_EXAMPLE_ROBOT_PASSWORD}
      clientId: ${EDUCATES_EXAMPLE_ROBOT_CLIENT_ID}
      clientSecret: ${EDUCATES_EXAMPLE_ROBOT_CLIENT_SECRET}

Environment Variables#

Required environment variables for each training portal:

EDUCATES_<PORTAL_NAME>_ROBOT_PASSWORD=your-robot-password
EDUCATES_<PORTAL_NAME>_ROBOT_CLIENT_ID=your-client-id
EDUCATES_<PORTAL_NAME>_ROBOT_CLIENT_SECRET=your-client-secret

Portal Configuration#

Basic Portal Setup#

Minimum required configuration for each portal:

educates:
  trainingPortals:
    - name: portal-name
      url: https://portal-url.com
      robotUsername: robot@educates
      robotPassword: ${EDUCATES_PORTAL_NAME_ROBOT_PASSWORD}
      clientId: ${EDUCATES_PORTAL_NAME_ROBOT_CLIENT_ID}
      clientSecret: ${EDUCATES_PORTAL_NAME_ROBOT_CLIENT_SECRET}

Permission Configuration#

The Educates plugin uses Backstage's resource-based permission system. Configure permissions in your permission policy.

Permission Policy Setup#

Add the following to your permission policy file:

import { 
  portalViewPermission,
  workshopStartPermission,
} from '@terasky/backstage-plugin-educates-common';
import {
  educatesPortalConditions,
  educatesWorkshopConditions,
  createEducatesPortalConditionalDecision,
  createEducatesWorkshopConditionalDecision,
} from '@terasky/backstage-plugin-educates-backend/alpha';

// In your permission policy class
async handle(request: PolicyQuery): Promise<PolicyDecision> {
  if (isPermission(request.permission, portalViewPermission)) {
    // Allow users to view portals they have access to
    return createEducatesPortalConditionalDecision(
      request.permission,
      educatesPortalConditions.hasPortalAccess({
        userRefs: [request.identity.userEntityRef],
        portalName: 'your-portal-name'
      })
    );
  }

  if (isPermission(request.permission, workshopStartPermission)) {
    // Allow users to start workshops they have access to
    return createEducatesWorkshopConditionalDecision(
      request.permission,
      educatesWorkshopConditions.hasWorkshopAccess({
        userRefs: [request.identity.userEntityRef],
        portalName: 'your-portal-name',
        workshopName: 'specific-workshop'
      })
    );
  }

  return { result: AuthorizeResult.ALLOW };
}

Simple Permission Policy#

For a basic setup allowing all authenticated users:

import { 
  portalViewPermission,
  workshopStartPermission,
} from '@terasky/backstage-plugin-educates-common';

// In your permission policy
async handle(request: PolicyQuery): Promise<PolicyDecision> {
  if (isPermission(request.permission, portalViewPermission)) {
    return { result: AuthorizeResult.ALLOW };
  }

  if (isPermission(request.permission, workshopStartPermission)) {
    return { result: AuthorizeResult.ALLOW };
  }

  return { result: AuthorizeResult.ALLOW };
}

Advanced Permission Rules#

You can customize access using the built-in permission rules:

import { rules } from '@terasky/backstage-plugin-educates-backend/alpha';

// Example: Portal ownership rule
const portalOwnershipDecision = createEducatesPortalConditionalDecision(
  request.permission,
  rules.portal.isPortalOwner({
    userRefs: [request.identity.userEntityRef]
  })
);

// Example: Workshop access rule
const workshopAccessDecision = createEducatesWorkshopConditionalDecision(
  request.permission,
  rules.workshop.hasWorkshopAccess({
    userRefs: [request.identity.userEntityRef],
    portalName: 'production-portal',
    workshopName: 'advanced-k8s'
  })
);

Migration from Legacy Permissions#

If you're migrating from the legacy permissions, update your permission policy:

// OLD - Deprecated
// educates.workshops.view
// educates.workshop-sessions.create

// NEW - Resource-based
import { 
  portalViewPermission,      // replaces educates.workshops.view
  workshopStartPermission,   // replaces educates.workshop-sessions.create
} from '@terasky/backstage-plugin-educates-common';

For installation instructions, refer to the Installation Guide.