Extension de services Load Attributes (existante)

Extension de services Load Attributes (existante)

ℹ️
Cette rubrique fait référence à la syntaxe de configuration existante. Les passerelles d’applications sont désormais définies comme des applications Proxy.

Les extensions de services permettent une flexibilité totale dans le processus de contrôle d’accès aux ressources protégées.

Comment les passerelles d’applications gèrent le trafic

Un peu de contexte est nécessaire à la compréhension du chargement des attributs et de sa place dans le flux d’identité d’un utilisateur. Voici comment le trafic circule dans une AppGateway (en pseudocode).

func Serve(appGateway *AppGateway, rw http.ResponseWriter, req *http.Request) {
  if !isAuthenticated(){
    Authenticate(resp, req)
  }
  LoadAttrs()
  if IsAuthorized() {
    SetHeaders()
    Proxy()
  }
}

Il s’agit d’une simplification. La mise en œuvre effective met en cache les informations relatives à la session par souci d’efficacité, y compris les résultats de la vérification de l’authentification et de l’autorisation. Ainsi, ces méthodes ne sont généralement pas sollicitées pour chaque requête, mais uniquement lors du premier passage de l’utilisateur.

Chargement des attributs

Comme le montre le pseudocode ci-dessus, le chargement des attributs s’effectue une fois que l’identité de l’utilisateur a été établie.

Extension de services LoadAttributes

Cette extension de services est utilisée pour charger des informations concernant l’utilisateur authentifié. En règle générale, les informations relatives aux attributs sont stockées dans la session, ce qui permet de les utiliser pour prendre des décisions en matière de politique ou pour les utiliser dans les en-têtes transmis à la ressource protégée.

⚠️
Bien que cette extension de services reçoive le http.ResponseWriter, elle n’envoie généralement pas de réponse directement à l’utilisateur. L’écriture dans le corps ou les en-têtes de http.ResponseWriter peut entraîner un comportement indésirable.
appgateways:
  - name: alpha
    # ...

    attrProviders:
      - connector: ldap

    loadAttrsSE:
      funcName: LoadAttrs
      file: /etc/maverics/extensions/loadAttrs.go

    policies:
      - location: /
        authentication:
          idps:
            - azure
        authorization:
          allowAll: true

/etc/maverics/extensions/loadAttrs.go

package main

import (
	"fmt"
	"net/http"

	"maverics/app"
	"maverics/log"
	"maverics/session"
)

// LoadAttrs loads attributes from LDAP and then stores them on the session for later
// use.
func LoadAttrs(ag *app.AppGateway, rw http.ResponseWriter, req *http.Request) error {
	log.Debug("msg", "loading attributes from LDAP")

	mail := session.GetString(req, "azure.email")
	if mail == "" {
		return fmt.Errorf("failed to find user email required for LDAP query")
	}

	ldap, ok := ag.AttrProviders["ldap"]
	if !ok {
		return fmt.Errorf("failed to find LDAP attribute provider")
	}

	targetAttrs := []string{"cn", "sn", "mobile"}
	attrs, err := ldap.Query(mail, targetAttrs)
	if err != nil {
		return fmt.Errorf("failed to query LDAP: %w", err)
	}

	for k, v := range attrs {
		log.Debug(
			"msg", "setting LDAP attribute on session",
			"attribute", k,
			"value", v,
		)
		session.Set(req, k, v)
	}

	return nil
}