Signatur
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
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);
?>
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";
}
}
?>
// 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.