Start · Sprachen · PHP · Referenz · radius_get_attr

radius_get_attr

Funktion

Extrahiert das nächste Attribut aus einer RADIUS-Antwort und gibt Typ und Wert als Array zurück.

seit PHP 4.0.5 Kategorie: misc

Signatur

radius_get_attr(resource $radius_handle): array|int

Beschreibung

radius_get_attr() liest das nächste Attribut aus der RADIUS-Antwort, die zuvor mit radius_send_request() empfangen wurde. Die Funktion wird typischerweise in einer Schleife aufgerufen, um alle Attribute einer RADIUS-Antwort der Reihe nach zu verarbeiten.

Der Rückgabewert ist ein assoziatives Array mit den Schlüsseln attr (Attributtyp als Integer) und data (Attributwert als roher Binärstring). Mit den passenden radius_cvt_*-Funktionen lassen sich die rohen Daten in nutzbare PHP-Typen umwandeln.

Die Funktion gibt 0 zurück, wenn keine weiteren Attribute vorhanden sind, und einen negativen Wert, wenn ein Fehler aufgetreten ist. Letzteres kann mit radius_strerror() näher beschrieben werden.

Diese Funktion gehört zur PECL-Erweiterung radius und ermöglicht es, RADIUS-basierte Authentifizierungs- und Autorisierungsabläufe (z. B. nach RFC 2865) direkt aus PHP heraus zu implementieren.

Parameter

Name Typ Default Beschreibung
$radius_handle Pflicht resource Eine gültige RADIUS-Ressource, die zuvor mit radius_auth_open() oder radius_acct_open() erzeugt und über die bereits eine Antwort mit radius_send_request() empfangen wurde.

Rückgabewert

Typ
array|int
Beschreibung
Gibt ein assoziatives Array mit den Schlüsseln attr (Integer, Attributtyp) und data (String, roher Attributwert) zurück, solange weitere Attribute vorhanden sind. Gibt 0 zurück, wenn alle Attribute verarbeitet wurden. Bei einem Fehler wird ein negativer Integer-Wert zurückgegeben.

Beispiele

Alle RADIUS-Antwort-Attribute auslesen

<?php
$radius = radius_auth_open();

if (!radius_add_server($radius, 'radius.example.com', 1812, 'geheimes_secret', 3, 3)) {
    die('Fehler: ' . radius_strerror($radius));
}

radius_create_request($radius, RADIUS_ACCESS_REQUEST);
radius_put_attr($radius, RADIUS_USER_NAME, 'benutzer@example.com');
radius_put_attr($radius, RADIUS_USER_PASSWORD, 'passwort123');

$result = radius_send_request($radius);

if ($result === RADIUS_ACCESS_ACCEPT) {
    echo "Zugang gewährt. Attribute der Antwort:\n";
    while (true) {
        $attr = radius_get_attr($radius);
        if ($attr === 0) {
            // Keine weiteren Attribute
            break;
        }
        if (!is_array($attr)) {
            echo 'Fehler beim Lesen: ' . radius_strerror($radius) . "\n";
            break;
        }
        echo 'Attribut-Typ: ' . $attr['attr'] . ', Wert (hex): ' . bin2hex($attr['data']) . "\n";
    }
} else {
    echo "Zugang verweigert oder Fehler.\n";
}

radius_close($radius);
?>
Zugang gewährt. Attribute der Antwort: Attribut-Typ: 6, Wert (hex): 00000001 Attribut-Typ: 8, Wert (hex): c0a80101

Attributwerte mit radius_cvt_* konvertieren

<?php
// Voraussetzung: $radius ist bereits geöffnet und Antwort empfangen.

while (true) {
    $attr = radius_get_attr($radius);
    if ($attr === 0) {
        break; // Keine weiteren Attribute
    }
    if (!is_array($attr)) {
        echo 'Fehler: ' . radius_strerror($radius) . "\n";
        break;
    }

    switch ($attr['attr']) {
        case RADIUS_FRAMED_IP_ADDRESS:
            // Rohen Wert in lesbare IP-Adresse umwandeln
            echo 'Framed-IP-Address: ' . radius_cvt_addr($attr['data']) . "\n";
            break;
        case RADIUS_SESSION_TIMEOUT:
            // Rohen Wert in Integer umwandeln
            echo 'Session-Timeout: ' . radius_cvt_int($attr['data']) . ' Sekunden' . "\n";
            break;
        case RADIUS_REPLY_MESSAGE:
            // Rohen Wert in lesbaren String umwandeln
            echo 'Reply-Nachricht: ' . radius_cvt_string($attr['data']) . "\n";
            break;
        default:
            echo 'Unbekanntes Attribut ' . $attr['attr'] . "\n";
    }
}
?>
Framed-IP-Address: 192.168.1.1 Session-Timeout: 3600 Sekunden Reply-Nachricht: Willkommen!

// Wichtig · Fallstricke

Wichtig: Die Funktion ist zustandsbehaftet – sie liest intern immer das nächste Attribut aus dem Puffer. Eine erneute Iteration über alle Attribute ist ohne einen neuen Request nicht möglich.

Der zurückgegebene Wert in data ist ein roher Binärstring. Für eine sinnvolle Weiterverarbeitung müssen die passenden Konvertierungsfunktionen radius_cvt_addr(), radius_cvt_int() oder radius_cvt_string() je nach Attributtyp verwendet werden.

Die radius-Erweiterung ist eine PECL-Erweiterung und muss separat installiert werden (pecl install radius). Sie ist nicht Teil der PHP-Standarddistribution.

Im Fehlerfall (negativer Rückgabewert) sollte stets radius_strerror() zur Diagnose aufgerufen werden.