2009-06-01 9 views
2

Ich versuche, ein einfaches Forum zu machen, nur um den Sprung der Spring Security und MVC Frameworks zu bekommen.Bedingt rendern in JSP von Benutzer

Der Einfachheit halber wollen wir Ich habe eine JSP einen Forenbeitrag zu sehen, die wie folgt aussieht:

<body> 
    ... 

    Title: ${forumPost.title} <br> 
    Author: ${forumPost.author.name} <br> 
    Message: {forumPost.message} <br> 

    <security:authorize ifAnyGranted="ROLE_ADMIN"> 
     Edit: <a href="/edit">Edit</a> 
    </security:authorize> 

    ... 
</body> 

Mein Problem ist: sollte nicht nur ein Administrator in der Lage sein, diesen Beitrag zu bearbeiten, aber die Originalautor sollte das auch können. Daher möchte ich nur, dass ROLE_ADMIN und der ursprüngliche Autor den Link Bearbeiten sehen können. Aber ich bin nicht sicher, wie man durch Benutzer mit der Sicherheit filtert: autorisieren Sie Umbau, oder wenn ich über dieses eine andere Weise gehen muss.

Alle Vorschläge würden sehr geschätzt werden. Vielen Dank!

+0

Ich sollte hinzufügen, dass ich an der Spring Security Referenzdokumentation sah (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html) und es schien nichts darüber zu haben, oder sogar Dokumentation des -Tags. –

Antwort

3

Unter der Annahme, dass Sie einen Controller haben, die hinter dieser Seite sitzt, würde ich einfach ein canEditPost Feld zum ModelAndView hinzufügen, die so etwas wie (semi-Pseudo-Code) sieht:

private boolean isAdmin() { 
    Authentication currentAuthObj = SecurityContextHolder.getContext().getAuthentication(); 
    List<GrantedAuthority> authorities = Arrays.asList(currentAuthObj.getAuthorites()); 
    for (GrantedAuthority auth : authorities) { 
     if ("ROLE_ADMIN".equals(auth.getAuthority())) { 
      return true; 
     } 
    } 
    return false; 
} 

boolean currentUserIsAuthor = ...; 

modelAndView.addObject("canEditPost", 
    Boolean.valueOf(currentUserIsAuthor || isAdmin()); 

Und dann Ihrer Ansicht nach nur Referenz $ canEditPost.

Es ist im Allgemeinen besser, wenn die Ansicht nur auf ein einfaches Flag im Modell verweist, als dass die Ansicht/das Template die tatsächliche Logik ausführt.

0

Ihr Author Objekt implementieren equals in der Weise, dass jeder Autor einzigartig ist?

Wenn ja, könnten Sie einfach überprüfen, ob die Author die gleiche wie der aktuelle Benutzer ist (Sie hätten zwei Sätze von Tags).

+0

Das würde funktionieren, aber im Idealfall würde ich gerne einen Weg finden, dies im Rahmen des Spring Security Frameworks zu tun. –

0

@matt b's Antwort ist eine gute Möglichkeit, es zu tun und ist wahrscheinlich, was ich am Ende tun werde. Aber ich habe einen anderen Weg gefunden, der etwas komplizierter ist, aber das erreichen wird, was ich in diesen Beitrag geschrieben habe.

Ich habe ein wenig gelesen und herausgefunden, dass Sie Sicherheit auf der Domain-Objekt-Ebene behandeln können und im Wesentlichen Lese-/Schreib-/Löschberechtigungen für eine Rolle oder ein beliebiges Objekt, z. B. die aktuelle Benutzer-ID, geben. In diesem Beispiel würde ich der aktuellen Benutzer-ID Zugriff auf ein Domänenobjekt geben, in diesem Fall ein ForumPost-Objekt, das seine eigene eindeutige ID aus der Datenbank hat.

Der aktuellen Benutzer-ID würde dann Lese-und Schreibzugriff gewährt werden, die (über die XML-Konfiguration) als eine benutzerdefinierte Rolle der Art definiert werden kann (ich glaube, der richtige Begriff ist eigentlich Voter). Ich könnte diesen Wähler dann MESSAGE__EDIT nennen.

in meinem JSP So konnte ich dann verwenden Sie die folgende:

Sicherheit: ifAnyGranted = "MESSAGE_EDIT"

und es wäre (auch hier durch XML-Konfiguration) erhalten Sie die aktuelle Benutzer-ID autorisieren und Geben Sie den Zugriff basierend auf dem aktuellen Domänenobjekt, in diesem Fall einem ForumPost-Objekt, an.

Es ist ein bisschen mehr Arbeit als es klingt, aber es kann auf jeden Fall getan werden.

Einige Dokumentationen zu all dem finden Sie im Abschnitt Domain Object Security in der Spring Security Reference Documentation (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html (aus irgendeinem Grund ist der Link zum Bereich Domain-Objekt Security für jetzt unterbrochen)).

0

Sie können Bedingungen haben

<% if(mycondition.isTrue()){ %> 
<security:authorize ifAnyGranted="ROLE_ADMIN"> 
    Edit: <a href="/edit">Edit</a> 
</security:author 
<% }%> 
+0

Ja, ich weiß. Wie ich bereits bei @TM erwähnt habe, würde ich gerne einen Weg finden, dies innerhalb der Grenzen des Spring Security Frameworks zu tun, vorzugsweise ohne Scriptlets zu verwenden (d. H. Die <% %>). –