====== Per Attribute Consent für vom SP nicht 'required' Attribute ====== In den allgemeinen Properties (''conf/idp.properties'') des IdP kann man einen //per Attrbute Consent// einstellen (''idp.consent.allowPerAttribute = true''). D.h. der Nutzer kann für jedes Attribut, das nicht explizit von SP über die Metadaten angefordert wird (mit dem Tag ''required="True"'' versehen), über eine Checkbox entscheiden, ob der Wert an den SP übertragen wird oder nicht. In der Default-Konfiguration des IdP werden mit dieser Einstellung auf der Attribute-Release Seite die required-Attribute nicht angezeigt. Folgende Anpassungen sind für eine Anzeige der required-Attribute vorzunehmen: * Ergänzung in der Datei ''views/intercept/attribute-release.vm'' ... #set ($requestClass = $attributeReleaseContext.getClass().forName("jakarta.servlet.http.HttpServletRequest")) #set ($isAttributeRequired = $attributeReleaseContext.getClass().forName("net.shibboleth.idp.consent.logic.impl.IsAttributeRequiredPredicate").getDeclaredConstructor($requestClass).newInstance($request)) ... * Im Velocity Template die Checkbox für non-required Attribute anzeigen. Required Attribute werden ohne Checkbox angezeigt. Dazu wird in der Datei ''views/intercept/attribute-release.vm'' folgende if-Anweisung ersetzt: ... #foreach ($attribute in $attributeReleaseContext.getConsentableAttributes().values()) #if ($attributeReleaseFlowDescriptor.perAttributeConsentEnabled)
#else

$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))

#end ...
* durch: ...                     #foreach ($attribute in $attributeReleaseContext.getConsentableAttributes().values())                         #if ($attributeReleaseFlowDescriptor.perAttributeConsentEnabled)                            
                              #if ($isAttributeRequired.test($attribute))                                                               #else                                                               #end                                                         #else                            

$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))

                                                    #end ...
Wird der AttributeQuery benutzt, muss auch hier der letzte Consent vom Nutzer beachtet werden. Dazu ist in ''conf/intercept/consent-intercept-config.xml'' für die Bean ''shibboleth.consent.AttributeQuery.Condition'' der parent Parameter auf den Wert ''shibboleth.Conditions.TRUE'' zu setzen, siehe hierzu unter [[de:shibidp:config-storage#user_consent_zu_attributfreigabe_bei_attribute_queries_beruecksichtigen|Server-Side-Storage, Sessions, User Consent und Persistent Identifier]]. Damit werden auch AttributeQueries gegen die zuletzt gespeicherte Nutzereinwilligung gefiltert. Hat der Nutzer nur einmal zugestimmt, werden keine Attribute übertragen. Für das Propagieren des zusätzlichen Objektes in den Attribute-Release-Flow ist leider ein Neustart des IdP nötig.