Berechtigungskonzept
Das jadice web toolkit adaptiert das Berechtigungskonzept der jadice document platform. Berechtigungen können analog der jadice document platform serverseitig auf Dokumente oder Annotationen angebracht werden. Beim Transport der Dokumentdaten und Annotationen auf den Client werden die Berechtigungen mit übertragen, so dass die Tools auf Clientseite entsprechend reagieren können.
Binden von Berechtigungen an Objekte
Berechtigungen können an folgende Objekte gebunden sein:
-
Document
: Die Berechtigungen gelten global für das gesamte Dokument.Beispiel: Die Berechtigung
DocumentAnnotationPermission.DENY.ADD
verbietet dem Benutzer das Anbringen von Annotationen auf dem Dokument. -
Annotation
: Die Berechtigungen gelten nur für einzelne Instanzen von Annotationen.Beispiel: Die Berechtigung
IndividualAnnotationPermission.DENY.CHANGE
verbietet dem Benutzer das Verändern einer einzelnen Annotation.
Besonderheit bei Annotationsberechtigungen: Verbietet eine dokumentbezogene Berechtigung eine Aktion, so wird die individuelle Berechtigung erst gar nicht ausgewertet. Erlaubt hingegen die dokumentbezogene Berechtigung eine Aktion, so wird im Anschluss noch die individuelle Berechtigung ausgewertet. Nur wenn diese nicht gesetzt ist oder die Aktion zulässt, so ist die Aktion auch tatsächlich erlaubt.
Berechtigungen
Dokumentberechtigungen
-
DocumentPermission.DENY.ADD_PAGES / ALLOW.ADD_PAGES
-
DocumentPermission.DENY.REMOVE_PAGES / ALLOW.REMOVE_PAGES
-
DocumentPermission.DENY.REORDER_PAGES / ALLOW.REORDER_PAGES
Dokumentbezogene Annotationsberechtigungen
-
DocumentAnnotationPermission.DENY.ADD / ALLOW.ADD
-
DocumentAnnotationPermission.DENY.CHANGE / ALLOW.CHANGE
-
DocumentAnnotationPermission.DENY.REMOVE / ALLOW.REMOVE
Individuelle Annotationsberechtigungen
-
IndividualAnnotationPermission.DENY.CHANGE / ALLOW.CHANGE
-
IndividualAnnotationPermission.DENY.REMOVE / ALLOW.REMOVE
-
IndividualAnnotationPermission.DENY.SHOW / ALLOW.SHOW
-
IndividualAnnotationPermission.DENY.WRITE / ALLOW.WRITE
Typische Szenarien
DENY.REORDER_PAGES
Nach Setzen der Berechtigung
DocumentPermission.DENY.REORDER_PAGES
können Seiten mittels des ThumbnailTools nicht mehr umsortiert werden.
Annotation DENY.CHANGE
Nach Setzen der Berechtigung
IndividualAnnotationPermission.DENY.CHANGE
oderDocumentAnnotationPermission.DENY.CHANGE
können Annotationen nicht mehr verschoben werden. Die Wrangler zum Größer- und Kleinerziehen werden nicht mehr angezeigt und die Annotations-Toolbar bietet keine Annotationseditoren zum Ändern der Annotation (z.B. Farben, Textgröße) mehr an.
Annotation DENY.REMOVE
Nach Setzen der Berechtigung
IndividualAnnotationPermission.DENY.REMOVE
oderDocumentAnnotationPermission.DENY.REMOVE
ist der Löschen-Button in der Annotations-Toolbar deaktiviert, so dass die Annotation nicht mehr gelöscht werden kann.
Annotation DENY.SHOW
Nach Setzen der Berechtigung
IndividualAnnotationPermission.DENY.SHOW
werden die betroffenen Annotationen nicht mehr angezeigt.
Annotation DENY.ADD
Nach Setzen der Berechtigung
DocumentAnnotationPermission.DENY.ADD
ist das Erstellen neuer Annotationen nicht mehr zugelassen. Die Buttons zum Erstellen neuer Annotationen in der AnnotationProfileAwareToolbar sind deshalb inaktiv und ausgegraut. Zusätzlich wird die Berechtigung im CreateAnnotationCommand überprüft.
Annotation DENY.CHANGE und DENY.REMOVE zum Schwärzen von Akten
Die Berechtigungen
DocumentAnnotationPermission.DENY.CHANGE
undDocumentAnnotationPermission.DENY.REMOVE
kann man sich dahingehend zunutze machen, dass der darunterliegende Dokumentinhalt vollständig vor nicht berechtigten Benutzern versteckt wird.
Bei dieser Berechtigungskombination wird, abhängig von der AnnotationRenderStrategy siehe Beeinflussung des Annotationsrendering über eine AnnotationRenderStrategy, die Annotation serverseitig auf das Dokument gerendert. Clientseitig werden nur noch die Bounds der Annotation angezeigt. Sensibler Inhalt bleibt also den Benutzern verborgen. Selbst die listige Abfrage der Data-URLs (z.B. über die DevTools von Chrome oder Firebug für Firefox) verhilft dem Benutzer nicht zum Originaldokument - auch die über diese URLs geladenen Kacheln enthalten bei entsprechend eingeschränkten Berechtigungen bereits die Annotationen, die den Dokumentinhalt maskieren. Es besteht auf diesem Weg also keine Möglichkeit mehr, unautorisierte Daten aus den empfangenen Daten zu sniffen.
Die Annotationen müssen serverseitig im DocumentDataProvider zuerst (also vor dem Dokument) über den Reader geladen werden, damit deren serverseitiges Einbrennen auf dem Dokument sichergestellt ist.
Codebeispiel: Serverseitiges Setzen von Berechtigungen
Mit folgender Änderung im ClassPathWithAnnoDocumentDataProvider in der
Methode read
soll demonstriert werden, wie Berechtigungen serverseitig
gesetzt werden können.
Bitte beachten: Serverseitig sind die Implementierungen
com.levigo.jadice.annotation.auth.DocumentPermission
,
com.levigo.jadice.annotation.auth.DocumentAnnotationPermission
bzw.
com.levigo.jadice.annotation.auth.IndividualAnnotationPermission
zu
verwenden; clientseitig jedoch deren serialisierbare Entsprechungen
com.levigo.jadice.annotation.auth.web.DocumentPermission
,
com.levigo.jadice.annotation.auth.web.DocumentAnnotationPermission
bzw.
com.levigo.jadice.annotation.auth.web.IndividualAnnotationPermission
.
...
import com.levigo.jadice.annotation.auth.DocumentAnnotationPermission;
import com.levigo.jadice.annotation.auth.IndividualAnnotationPermission;
...
private void read(Reader reader, final String resource) throws JadiceException, IOException {
// Variante 1 - Setzen der Permissions pro Annotation
DefaultReaderControls controls = new DefaultReaderControls();
final AnnotationCustomizer annotationCustomizer = new AnnotationCustomizer() {
@Override
public void customize(Annotation a) {
a.getPermissions().getPermissions().add(IndividualAnnotationPermission.DENY.REMOVE);
}
};
controls.getSettings(JadiceAnnotationReaderSettings.class).getAnnotationCustomizers().add(annotationCustomizer);
reader.setReaderControls(controls);
// Variante 2 - Dokumentweites Setzen von Permissions
reader.getDocument().getPermissions().getPermissions().add(DocumentAnnotationPermission.DENY.REMOVE);
// Ab hier kommt der bereits bestehende Code
int targetIndex = reader.getTargetIndex();
{
InputStream in = getClass().getResourceAsStream(resource);
if (in == null) {
in = getClass().getClassLoader().getResourceAsStream(resource);
if (in == null)
throw new IOException("Cant find Resource on Classpath: " + resource);
}
reader.read(in);
}
{
String annoResource = resource + ".xmlanno";
InputStream in = getClass().getResourceAsStream(annoResource);
if (in == null) {
in = getClass().getClassLoader().getResourceAsStream(annoResource);
if (in == null)
return;
}
Format oldFormat = reader.getFormat();
JadiceAnnotationFormat format = new JadiceAnnotationFormat();
reader.setFormat(format);
reader.setTargetIndex(targetIndex);
reader.read(in);
reader.setFormat(oldFormat);
}
Variante 1 zeigt das Aufbringen von Berechtigungen per AnnotationCustomizer; und zwar einzeln pro Annotation (DENY.REMOVE im Beispiel). Dadurch lassen sich gezielt für einzelne Annotationen oder Annotationstypen bestimmte Berechtigungen setzen. In Variante 2 wird eine DocumentAnnotationPermission gesetzt (im Beispiel ebenfalls DENY.REMOVE). Diese ist global für das gesamte Dokument gültig, d.h. in Konsequenz sind alle Annotationen auf dem Client nicht mehr löschbar.
Das Setzen der Berechtigungen muss erfolgen, bevor Reader#read aufgerufen wird.