Original von uhrknall
danke für den tipp! habe tatsächlich in letzter zeit auch mit spring security gearbeitet. hab das aber bisher für nen overkill gehalten für nen browsergame. aber werde ich dann auch nochmal drüber nachdenken.
Das ist sinnvoll, zumal z.B. das Security-Plugin auch gleich noch die Login/Logout-Controller erstellt uvam, was dann als gute Vorlage zum customizing dienen kann.
Wie verbindest du das ganze denn mit dem ajax request? der ajax request muss ja dann einem principal / user zugeordnet werden. bzw macht grails das für dich? habe noch nie mit grails gearbeitet.
Wenn ich in einem Request den User brauche, benutze ich so etwas hier:
Groovy:
User fetchUser() {
User user = authenticateService.principal().domainClass
user = User.get(user.id) // reload detached user instance
return user
}
Die Zuordnung ajax <=> session macht Grails / das Plugin, welches auch authenticateService bereitstellt.
Im Prinzip läuft das so ab:
In einer Klasse habe ich:
Groovy:
@Secured(['ROLE_USER'])
def describe = {
def pc = fetchPc(session)
Guild guild = Guild.get(params.guild)
if(! guild){
return render(status:503, text:message(code:'error.guild.not_found'))
}
return render(template:"/guild/guild_description", model:[guild:guild])
}
Ajax request wird an /guild/describe geschickt.
Grails ordnet das der Methode "describe" im GuildController zu. Wenn es eine Session für diesen User gibt, wird sie gesetzt, ansonsten schlägt der Request fehl [Ajax-Auth ist noch in Arbeit...].
Die Variable params enthält Key-Value-Mappings der übergebenen Parameter (also POST mit guild=id), man greift auf die einzelnen Werte mit params.$parameterName zu.
Wäre dies eine normale HTML-Seite, würde automatisch das template /guild/describe.gsp aufgerufen. Aber in diesem Fall will ich ja nur einen kleinen Snippet senden (oder lediglich die entsprechend der Sprache im Client lokalisierte Fehlermeldung).
Auf dem Client wird dann - je nachdem, ob der Request erfolgreich war, oder upgedated.
Der Code zum Erzeugen des Ajax-Links:
GSP:
update="[success:'guild_description', failure:'message']"
params="[guild:guild.id]">
(remoteLink ist ein Standard-Tag von Grails, das mit diversen JavaScript-Bibliotheken funktioniert).