Extension de services Load Attributes (existante)
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.
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
}