| 

.NET C# Java Javascript Exception

Rendern einer Action verhindern?

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Rendern einer Action verhindern?

giraffezw - 06.10.2010 10:32
Hi,
ich habe einen download Controller mit folgender action

def datadl = {
        def fileInputStream = null;
        try {
            def smbFile = new SmbFile(params.mergeDocs, new NtlmPasswordAuthentication("XYZ.ABC", session.user.Username, session.user.Password))

            response.setHeader("Content-disposition", "attachment;filename=\"" + smbFile.name + "\"")
            fileInputStream = smbFile.getInputStream();

            response.outputStream << fileInputStream
            response.outputStream.flush()
            log.debug('"' + session.user.Username + '" laedt datei: "' + smbFile.name + '"')
        } catch(SmbAuthException sae) {
			log.error(sae.getMessage());
		} catch(SmbException se) {
            log.error('ERROR: ' + se)
        } finally {
            try {
                fileInputStream.close();
                response.outputStream.close()
            } catch(e) {}

        }
                
    }

Wenn der Benutzer versucht eine Datei zu downloaden die er nicht downloaden darf, bekomme ich auch im log angezeigt
"ERROR kv73.DownloadController - Access is denied."

So weit so gut, allerdings wird dann die action datadl gerendert. Wie kann ich das verhindern?


Re: Rendern einer Action verhindern?

giraffezw - 06.10.2010 10:41
Wie kann ich die ErrorMsg zusätzlich per JSON zurück geben?

Das hier...
def datadl = {
        def fileInputStream = null;
	def msg = '';
        try {
            def smbFile = new SmbFile(params.mergeDocs, new NtlmPasswordAuthentication("XYZ.ABC", session.user.Username, session.user.Password))

            response.setHeader("Content-disposition", "attachment;filename=\"" + smbFile.name + "\"")
            fileInputStream = smbFile.getInputStream();

            response.outputStream << fileInputStream
            response.outputStream.flush()
            log.debug('"' + session.user.Username + '" laedt datei: "' + smbFile.name + '"')
			msg = 'Datei erfolgreich geladen'
        } catch(SmbAuthException sae) {
			log.error(sae.getMessage());
			msg = sae.getMessage()
		} catch(SmbException se) {
            log.error('ERROR: ' + se)
			msg = se
        } finally {
            try {
                fileInputStream.close();
                response.outputStream.close()
            } catch(e) {}

        }

		def jsonMsg = [
            info: msg
        ]
        render jsonMsg as JSON
                
    }
... funktioniert nicht. Er prüft dann gar nicht mehr ob der Benutzer berechtigt ist, sondern läd die Datei einfach herunter.


Re: Rendern einer Action verhindern?

giraffezw - 07.10.2010 09:13
catch(SmbAuthException sae) {
			response.sendError(403);
			log.error(sae.getMessage());
		}

funktioniert, allerdings werd ich dann auf eine Fehlerseite weitergeleitet. Das möchte ich auch nicht.

Ist der User nicht berechtigt, dann mach nix! :(


Re: Rendern einer Action verhindern?

giraffezw - 07.10.2010 12:54
Das Problem ist, ich habe millionen von Dateien per lucene indexiert. Da es hunderte von Mitarbeiter gibt, die alle andere Rechte haben, weiß ich erst ob der Benutzer downloaden darf wenn er es versucht. Alles andere würde den Grund der indexierung (schnell) hinfällig machen.
Da ich Extjs als Frontend einsetze, darf ich

a, die seite nicht neu laden (also kein redirect auf eine action) da sonst die geöffneten fenster weg sind
b, maximal dem benutzer per json in einer alert box darüber informieren das er keine berechtigung hat

trotzdem tausend dank für deine antwort :)

"PS: Im finally den Stream nur schließen, wenn er nicht null ist. Ja, die Exception drunter fängt das ab, aber Exceptions sollte man immer vermeiden und ein leerer catch....naja..zumindest ein Error-Log gehört immer rein - für den Fall der Fälle."

habe ich überlesen, sry :) werd ich gleich ändern. danke


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Rendern einer Action verhindern?" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.