Post on 07-Jun-2018
transcript
FG Meinel Lehre (bisher)
Student Features :
- Einloggen mit Hilfe von OpenID
- Anmelden für verschiedene Übungsgruppen
- Übungsgruppe wechseln
- Punkte einsehen
- Abgabe der Übungen im “Kasten”
2
FG Meinel Lehre (bisher)
Probleme für Studenten: - volle Übungsgruppe keine Anmeldung möglich - Abgabe von Programmieraufgaben per E-mail richtige Benennung sehr wichtig - (Abgabe der Übungen im “Kasten”) - …
Administratoren? Korrektoren? Tutoren?
FG Meinel Lehre (bisher)
Allgemeine Probleme:
- Nur rudimentäre Rollenunterstützung alle Konfigurationen über Terminal in Config-File auf Server
- Keine Mandantenfähigkeit Aufsetzen des Systems für jede Lehrveranstaltung
- Abgabe von Programmieraufgaben
Nutzen von Skripten für Kontrolle nötig
- …
Course Management System – Overview
Administrator - Nutzer und Rollen verwalten
Korrektor - Leistungen verwalten
Punkte für Studenten eintragen
- Lösungen abrufen
- Musterlösungen abrufen
Student - Übungsgruppen anmelden (Warteliste)
- Lösungen abgeben (Deadline)
- Punkte einsehen
- Übungsblatt downloaden
Tutor - Vorlesungen und Seminare
verwalten
anlegen, löschen, editieren
- Übungs-/Projektgruppen verwalten
Teilnehmeranzahl, Ort, Zeit
- Leistungen verwalten
Übungen: max. Punktzahl,
Musterlösung, Lösungen abrufen
Groovy & Grails
Groovy - dynamisch typisierte Skriptsprache
- entwickelt für die JVM
- Java-Syntax verbunden mit Ruby-Konzepten
Grails - Web-Framework
- MVC – Architektur
- Convention over Configuration, DRY (Don‘t Repeat Yourself)
Spring Framework
• Open Source App-Framework für Java
• Beinhaltet u.a. MVC Framework für Web-Applications
• GrailsDispatcherServlet extends DispatcherServlet
• Grails Laufzeitkonfiguration als Spring ApplicationContext
• Verantwortlich für Data Binding und Transaktionsmanagement
10
http: // greatapp.com / tasklist / task / list
Host Application Controller Action
Controller
Model View
TaskController.groovy
Task/list.gsp Task.groovy
11
SiteMesh
• Java Web Layout Framework
• Implementiert als Decorator Model
• Key Elemente: • layoutTitle
• layoutHead
• layoutBody
12
HTML Header
Menü Home Profil Hilfe Kontakt Impressum
Header <title>
Zusätzl. Header-Daten
<title> Home </title>
Willkommen Auf dieser
Seite
Inhalt Layout HTML Header
Willkommen Auf dieser
Seite
Menü Home Profil Hilfe Kontakt Impressum
Header Home
13
Hibernate/GORM
• Object Relational Mapping für Java
(Grails + ORM => GORM)
• Mapping von Grails Domain Klassen auf relationales Datenmodell
• Abstrahiert von der zu Grunde liegenden Datenbankimplementierung
=> DB beliebig austauschbar
14
Task
+name: String +description: String +deadline: Date +Tags: Tag[]
ID Name Descript. Deadl.
1 Essen Weil hungrig
04.02.2012
2 Schlafen Weil müde 31.12.2012
ID Name
1 wichtig
2 sinnlos
Klassendiagramm Domain Class Model Datenbank
Tag
+name: String + task: Task
class Task {
String name
String description
Date deadline
static hasMany = {
tags: Tag
}
}
class Tag {
String name
Task task
}
1
0..*
Task_ID
1
1
15
Weitere GORM Features
• Verwenden von
Legacy Datenbanken
• Verwenden von
Java Klassen
• Eingabevalidierung
• Scaffolding
class Sword {
String manufacturer
Knight knight
static belongsTo = [Knight]
static mapping = {
table 'sword_inventory'
version false
id column : 'serial_number',
generator : 'assigned'
columns {
knight column : 'assignee'
}
}
}
import …;
@Entity
@Table(name="knights"
)
public class Knight implements java.io.Serializable {
private long id;
private String name;
private long numDragonsSlain;
private Set<Sword> swords = new HashSet<Sword>(0);
public Knight() {
}
public Knight(long id, String name, long numDragonsSlain) {
this.id = id;
this.name = name;
this.numDragonsSlain = numDragonsSlain;
}
public Knight(long id, String name, long numDragonsSlain, Set<Sword> swords) {
this.id = id;
this.name = name;
this.numDragonsSlain = numDragonsSlain;
this.swords = swords;
}
@Id
@Column(name="knight_id", nullable=false)
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
@Column(name="name", nullable=false)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="dragon_count", nullable=false)
public long getNumDragonsSlain() {
return this.numDragonsSlain;
}
public void setNumDragonsSlain(long numDragonsSlain) {
this.numDragonsSlain = numDragonsSlain;
}
@OneToMany(fetch=FetchType.LAZY, mappedBy="knight")
public Set<Sword> getSwords() {
return this.swords;
}
public void setSwords(Set<Sword> swords) {
this.swords = swords;
}
}
static constraints = {
name(blank:false, maxSize:100)
url(url:true)
frequentFlyer(blank:true)
notes(maxSize:1500)
}
16
Spring allgemein
Spring...
• ist ein open source App-Framework für Java
• bietet viele nutzbare Module an – Aspektorientiertes Programmieren
– Testing
– MVC
– Remote Management
– Security
– ...
18
Spring Security
• Authentifizierungs- und Authorisationsmodul
• De Fakto Standard für Sicherheit in Springapps
• Viele Erweiterungen verfügbar:
– LDAP, CAPTCHA, Kerberos, ACL, OpenID, ...
– Setzen auf Spring Security Core auf
19
Spring Security Core
• Basiert auf 3 Domainklassen und 2 Controllern • Role, User, RoleUser
– Stellen die nötigen Datenbanktabellen dar (via GORM)
• LoginController, LogoutController – Zuständig für login, logout, Redirects, authentifizieren, ...
• Zur Sicherung und Anpassung werden dann genutzt: – Annotationen (@...) – Tags in den Views (<sec:ifAllGranted>...</...>) – Bereitgestellte Funktionen des Frameworks (z.B.
Sicherheitskontext, Abfrage des CurrentUsers, ...)
20
Spring Security Core
• Role Domain Class:
– Legt mögliche Rollen fest
• „Authority“-Feld, z.B.: „ROLE_USER“, „ROLE_ADMIN“
22
Spring Security Core
• UserRole Domain Class:
– Jointabelle, da n:m Assoziation zwischen User und Role vorliegt
– Dient zum schnellen und effizienten Zuweisen von Rollen
23
Spring Security Core
• Login/Logout-Controller wird dazu genutzt, Sicherheitskontext herzustellen – Erstellen der nötigen Hintergrundobjekte (Authentication Objekt, z.B.)
– Tracken des current Users und dessen Rollen
– ...
Beispiel:
24
Spring Security Core
• Nutzung dieser Klassen geschieht größtenteils transparent für den Programmierer
• Der Programmierer muss nur Rollen Festlegen und passende Tags und Annotationen an passenden Stellen verwenden
25
Spring Security Core
• Annotationen: – Klassische Java Annotationen @Annotation
– Verwendet zur Sicherung von Controllern / Funktionen
26
Spring Security Core
• Tags:
– Werden in den Views verwendet • Z.B. um nur eingeloggten Nutzern etwas anzuzeigen:
<sec:ifNotLoggedIn> <g:link controller='login' action='auth'>Login</g:link> </sec:ifNotLoggedIn>
<sec:ifNotGranted roles="ROLE_USER"> non-user stuff here </sec:ifNotGranted>
28
Spring Security ACL
• Gegebenes Requirement:
– Korrektoren sind Studenten und belegen Veranstaltungen
• Müssen allerdings andere LVs korrigieren...
• ...ohne die eigenen Übungen korrigieren zu können
– Problem: ROLE_CORRECTOR löst das Problem nicht
• Zu allgemein, wir brauchen feinere Rechteabstufungen
– Lösung: Access Control Lists Implementierung für Spring Sec
29
Spring Security ACL
• Access Control List:
– Liste, welche Berechtigungen für ein zu schützendes Objekt enthält • Z.B. read, write, execute, create, administer, ...
• In unserem Falle wäre die Schutzeinheit eine Instanz eines Domainobekts
• Plugin fügt neue Annotationen hinzu
– @{PreAuthorize, PreFilter, PostAuthorize, PostFilter}
– Nutzen Expression Language, um Constraints auszudrücken
30
Spring Security ACL
• Plugin Implementierung benötigt mehrere Domainklassen bzw. Tabellen:
– AclClass:
• Enthält für jede Domainklasse einen Eintrag
– AclSid (Security Identitiy = SID):
• Enthält für alles, was ein Recht zugewiesen bekommen soll einen Eintrag (Z.B. Nutzername oder Rolle)
– AclObjectIdentity:
• Enthält Einträge, welche Domainklassen Instanzen darstellen (ObjektID, AclClassID) 32
Spring Security ACL
• ...
– AclEntry:
• Stellt die eigentlichen Einträge (ACEs) dar (Grant, Deny)
• Verbindet AclObjektId, SID (Empfänger), und Permission
• Enthält Bitmaske, welche die granted oder denied Methods symbolisieren
33
Quellen
Grails Allgemein:
– http://grails.org
– http://grails.org/doc/latest/
GORM:
– http://www.ibm.com/developerworks/java/library/j-grails02128/
– https://github.com/jasonrudolph/bending-gorm
Spring Security :
– http://blog.denksoft.com/?page_id=20 (ACL Tutorial)
– http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html (ACL Kurzreferenz)
– http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/ (Spring Security Docs)
– http://static.springsource.org/spring-security/site/reference.html (Spring Security Referenz)
– http://burtbeckwith.github.com/grails-spring-security-acl/ (ACL Tutorial + Docs des Autors)
– http://grails.org/dist/screencasts/screencast10.mov (Security Screencast)
– http://burtbeckwith.github.com/grails-spring-security-openid/docs/manual/index.html (OpenID Spring Kurzreferenz)
– http://hcklab.blogspot.com/2011/09/grails-137-spring-security-and-openid.html (Spring OpenID Tutorial)
– http://www.enode.com/x/markup/tutorial/mvc.html
35