| « Mastering Grails | Groovy/Grails als Ergänzung zu Java » |
Tutorial: Grails, Plugins und praktische Java-Bibliotheken
Mit dem Grails-Framework entstehen in sehr kurzer Zeit datenbankgestützte Webanwendungen. Grails eignet sich dabei besonders gut als "Klebstoff", um bekannte und bewährte Komponenten zusammenzufügen. Hier also ein kleines Tutorial für die besonders häufig auftretenden Anwendungsfälle:
- Benutzer-Authentifizierung
- Volltextsuche
- Datenexport in Excel-Dateien
- Dynamische Erzeugung von Diagrammen
- Zeitgesteuerte Aufgaben
Fortsetzung:
1. Benutzer-Authentifizierung
Die Authentifizierung kann nur aus einem Login mit Name und Passwort bestehen, aber ebenso kann sie auf Rollen basierende Zugriffsrechte auf bestimmte Seiten beinhalten. Die offizielle Liste der Grails-Plugins enthält im Abschnitt "Security" das AcegiSecurity Plugin. Die Installation ist sehr schnell zu erledigen: im Verzeichnis des betreffenden Grails-Projekts gibt man per Befehlszeile grails install-plugin acegi ein. Nach erfolgreicher Installation erscheint ein Text wie dieser:
Code:
Plugin acegi-0.3 installed | |
Plug-in provides the following new scripts: | |
------------------------------------------ | |
grails create-auth-domains | |
grails generate-manager | |
grails generate-registration |
Das erste Script "create-auth-domains" dient der Erzeugung der Domainklassen für Benutzer und Rollen. Geben Sie z.B. grails create-auth-domains User Role ein, um im Grails-Projekt eine Klasse namens "User" und eine namens "Role" anzulegen. Mit grails generate-manager erhalten Sie einen praktischen Controller für die Benutzerverwaltung.
Bootstrap-Konfiguration
Während der Entwicklung kann man eine lokale Datenbank verwenden, deren Struktur sich automatisch an alle Änderungen anpasst. Bei jedem Neustart dieser Entwicklungsumgebung ist die Datenbank leer. In der Datei BootStrap.groovy kann man jedoch eine Initialisierung mit bestimmten Inhalten bewirken. Dadurch existiert z.B. von Anfang an eine Benutzerrolle "admin", ein entsprechender User und ggf. schon Einschränkungen auf bestimmte Controller. Eine geeignete Bootstrap-Konfiguration könnte so aussehen:
Code:
import org.apache.commons.codec.digest.DigestUtils as DU | |
| |
class BootStrap { | |
| |
def init = { servletContext -> | |
def pass = DU.md5Hex("admin") | |
def adminUser = new User(username: "admin", userRealName:"admin", enabled:true, email:"email@example.com", email_show:true, passwd:pass).save() | |
def adminRole = new Role(username: "admin", authority: "ROLE_ADMIN", description: "Administratoren") | |
adminRole.addToPeople(adminUser) | |
adminRole.save() | |
def requestmap = new Requestmap(url:"/user/**", configAttribute:"ROLE_ADMIN").save() | |
} | |
| |
def destroy = { | |
} | |
} |
In Zeile 6 wird das Administrator-Passwort verschlüsselt, da in der Datenbank nur verschlüsselte Eingaben stehen sollen. Der Administrator-User wird in der Zeile 7 erzeugt, anschließend die Rolle "Administrator" definiert und in Zeile 9 der User dieser Rolle zugeordnet. In Zeile 11 wird der Zugriff auf den User-Controller eingeschränkt, so dass nur Administratoren später in die Benutzerverwaltung gelangen können.
Nach diesen ersten Schritten kann die Grails-Anwendung bereits getestet werden. Nach dem Start im Browser werden zunächst verschiedene Controller angezeigt:
- UserController
- RoleController
- LoginController
- RequestmapController
- LogoutController
Der UserController ist jetzt bereits geschützt. Es erscheint eine Anmeldemaske, in der man sich mit "admin" und "admin" anmelden kann, um zur Benutzerverwaltung zu kommen. Nun kann man in der BootStrap-Datei noch die weiteren Controller Role und Requestmap schützen, so dass auch diese nur für Administratoren zugänglich sind. Die Rollen können dann direkt in der Anwendung erweitert werden, z.B. mit "User", "ReadOnly" usw. Über die Requestmaps steuert man, welche Rolle auf welche Controller zugreifen darf. Die Controllernamen sind dabei immer durchgängig in Kleinbuchstaben zu schreiben.
Sichtbarkeit auf Webseiten steuern
Unabhängig von der Zugriffskontrolle für einzelner Seiten möchte man oft bestimmte Navigationselemente oder Informationen nur für bestimmte Benutzergruppen anzeigen. Dies wird in den Views über ein Tagging wie dieses gesteuert:
Code:
<g:ifAnyGranted role="ROLE_ADMIN">Diesen Text nur Administratoren zeigen</g:ifAnyGranted> |
1 Kommentar
sehr schön, dass Du auch Grails entdeckt hast. Ich hab letztes Jahr einmal ein Tutorial darüber gehalten (siehe http://www.slideshare.net/loffenauer/2007-09-10-fzi-training-groovy-grails-v-ws) und wir haben gerade eine Applikation damit gebaut (siehe http://sti.innoraise.com)
Viele Grüße
Raphael