38
Course Management System mit Groovy & Grails

Course Management System€“ (OpenID Spring Kurzreferenz)

Embed Size (px)

Citation preview

Course Management System

mit Groovy & Grails

DAS PROJEKT

1

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

Datenmodell

0..1

TECHNOLOGIEN Groovy&Grails, Spring, Hibernate, Spring Security Plugins, …

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)

Grails Components

9

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 SECURITY

Spring Security Grails

ACLs

17

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

• User Domain Class:

– Beschreibt User des Systems

21

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

27

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

31

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

34

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

Ende

Sind Fragen offen geblieben?

Course Management System

mit Groovy & Grails