2010-02-21 5 views

Antwort

0

Sie haben die Datei config/SecurityConfig.groovy konfigurieren (falls es nicht existiert, erstellen Sie es, diese überschreibt die Standard-Sicherheitskonfiguration)

Fügen Sie diesen Eintrag:

requestMapString = """\ 
      CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
      PATTERN_TYPE_APACHE_ANT 
      /=IS_AUTHENTICATED_REMEMBERED 
      /login/auth=IS_AUTHENTICATED_ANONYMOUSLY 
      /login/authajax=IS_AUTHENTICATED_ANONYMOUSLY 
      /login/authfail=IS_AUTHENTICATED_ANONYMOUSLY 
      /js/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /css/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /images/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /plugins/**=IS_AUTHENTICATED_ANONYMOUSLY 
      /**=IS_AUTHENTICATED_REMEMBERED 
      """ 

Dies ist ein Mittel dass du dich anmelden musst, um die Seite zu betreten. Aber auf alle Ressourcen (CSS, JS, Bilder usw.) wird ohne Authentifizierung zugegriffen.

Wenn Sie nur bestimmte Rolle wollen eingeben bestimmte Controller: Zum Beispiel für Usercontroller:

/user/**=ROLE_ADMIN 
    /role/**=ROLE_ADMIN 

Für weitere Informationen: http://www.grails.org/AcegiSecurity+Plugin+-+Securing+URLs

Grüße

+0

Entschuldigung, wenn meine Frage falsch war, habe ich meine Controller bereits mit einer RequestMap (nicht in der SecurityConfig.groovy, aber mit einer Datenbanktabelle) gesichert und das alles funktioniert perfekt. Meine Frage war, wie kann ich überprüfen, ob der aktuelle Benutzer Zugriff auf einen bestimmten Controller und eine Aktion hat. Ich denke dabei: if (currentUserHasAccess (Controller, Aktion)) {do_some_stuff} – Jan

1

Wenn mit Berechtigungen in Ansichten und Taglibs Umgang , können Sie die AuthorizeTagLib verwenden, die vom Plugin zur Verfügung gestellt wird.

Zum Beispiel, wenn Sie nicht über einen Menüpunkt wollen für authentifizierte Benutzer in der Liste angezeigt wird, können Sie verwenden:

<g:isLoggedIn> 
    <li>Restricted Link</li> 
</g:isLoggedIn> 

Wenn Sie spezifischere Rollen definiert haben und diese Rollen sind gebunden an Ihre Controller/Action Request-Mapping, können Sie andere Tags verwenden, wie zum Beispiel:

<g:ifAllGranted role="ROLE_ADMINISTRATOR"> 
    <li>Administrator Link</li> 
</g:ifAllGranted> 

nach meiner Erfahrung ist es noch nicht ein guter Weg, um die Anfrage Zuordnung zu Ihrem Markup zu binden - ich glaube, du gehst zu haben, Verwenden Sie einige der oben genannten Tags, um den Zugriff auf Inhalte innerhalb eines bestimmten GSP zu beschränken.

Ich denke, dass Burt Beckwith hat eine zukünftige Änderung (und bietet derzeit eine beta version) auf das Plugin, das einige ACL-Sachen integriert, die dieses Problem in Zukunft besser lösen könnte, aber für jetzt denke ich, der beste Ansatz ist Hybridanforderungskarte + GSP-Tags eins.

+0

Ich habe dieses TagLib gesehen, aber es löst nicht wirklich mein Problem. Vielleicht könnte ich die Methoden ifAllGranted oder ifAnyGranted verwenden, wenn es eine Möglichkeit gibt, einen Controller und eine Aktion mit einem Eintrag in meiner RequestMap abzugleichen ... Weiß jemand, wie das gemacht wird? – Jan

0

Soweit ich das beurteilen kann, sieht es nicht so aus, als gäbe es einen einfachen Weg dazu.

Sie können eine Instanz des Grails AuthenticatedVetoableDecisionManager injizieren, die diese eine konkrete Klasse des Frühlings ist AbstractAccessDecisionManager die indem:

def accessDecisionManager 

Dies hat eine „entscheiden“ Methode auf, dass

decide(Authentication authentication, Object object, ConfigAttributeDefinition config) 
3 Parameter nimmt

Dies ist wahrscheinlich die Methode, die Sie aufrufen und die richtigen Dinge weitergeben müssen, um herauszufinden, ob der Benutzer mit den Berechtigungsnachweisen auf dieses "Objekt" zugreifen kann (was aussieht, als wäre es normalerweise eine Anfrage/Antwort). Ein paar zusätzliche Umgrabungen könnten sich hier als praktikabel erweisen.

Kurzfristig ist es wahrscheinlich einfacher, die ifAnyGranted Taglib zu verwenden, wie ein anderes Poster erwähnt.

+0

Danke Mann, ich werde nach einer Lösung in dieser Richtung suchen. Jedenfalls würde ich gerne die ifAnyGranted Taglib verwenden, aber dann muss ich noch herausfinden, welche Rollen im aktuellen Fall gelten, dh einen Weg finden, die Rollen für einen bestimmten Controller/eine bestimmte Aktion aus meiner RequestMap zu holen. – Jan

0

Ich bin etwa in Groovy nicht sicher, aber in Java (so gehe ich davon aus Groovy auch ...) Sie könnten (NPE Kontrollen minus) tun:

GrantedAuthority[] authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
boolean isAdmin = false; 
for(GrantedAuthority authority : authorities) { 
    String role = authority.getAuthority(); 
    if(role != null && role.equals("ROLE_ADMIN")) { 
     isAdmin = true; 
     break; 
    } 
} 

Was wissen, ob die Aktion unterstützt wird, müssen Sie den RequestMap-Service aufrufen, um die Rollen für die Zuordnung abzurufen und festzustellen, ob sie die gefundene Benutzerrolle enthält.

+0

Danke für deinen Code, aber ich denke das ist was ifAnyGranted tut ... Der interessante Teil ist dieser "RequestMap Service" - hast du mehr Informationen darüber? Ich konnte nichts mit Google finden ... – Jan

4
 
org.grails.plugins.springsecurity.service.AuthenticateService authenticateService = new org.grails.plugins.springsecurity.service.AuthenticateService() 
def isAdmin = authenticateService.ifAllGranted('ROLE_ADMIN') 

if(isAdmin) { 
    println 'I am Admin' 
} 
3

Diese Frage ist ziemlich alt, aber ich dachte, ich würde mindestens eine Antwort posten, die mit Grails 2.0 zu funktionieren scheint. Wenn Sie das Spring-Sicherheits-Plugin verwenden, ist eine Tag-Lib mit der Bezeichnung grails.plugins.springsecurity.SecurityTagLib enthalten.

Die Tag-Lib hat eine geschützte Methode, hasAccess(), die die gleiche Params-Map verwenden kann, die Sie dem g: link-Tag geben. Wenn Sie also SecurityTagLib erweitern, können Sie hasAccess() aufrufen und das gewünschte Verhalten erhalten. Warum dies nicht in einen Dienst, der injiziert werden kann, externalisiert wird, übersteigt mich, da die Funktionalität ein offensichtliches Bedürfnis zu erfüllen scheint.

Wir diese verwenden, um den g einzuwickeln: link Tag und nur eine Verbindung des Benutzers erzeugen Zugriff auf die Zielseite hat:

def link = { attrs, body -> 
    if(hasAccess(attrs.clone(), "link")) { 
     out << g.link(attrs, body) 
    } 
    else { 
     out << body() 
    } 
} 
+1

Wrapping g: Link ist auch, was wir gemacht haben. BTW Groovy ignoriert "protected" und sogar "private", so dass Sie einfach eine Instanz von 'SecurityTagLib' injizieren und aufrufen können. –

+0

Ich bin mir der Situation nicht sicher, als das beantwortet wurde, aber diese Funktionalität wird nun durch 'SpringSecurityUtils' offengelegt. –

+1

@mattforsythe wo genau ist es ausgesetzt? Weder die [docs] (https://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html#springSecurityUtils) noch der [Quellcode] (https://github.com/grails -plugins/grails-feder-sicherheits-core/blob/master/src/java/grails/plugin/springsecurity/SpringSecurityUtils.java) nennen alle Methoden, die eine Map mit 'controller' und' action' (oder 'url' akzeptieren können)) Argumente und gibt einen booleschen Wert zurück, was 'hasAccess()' tut. – Tobia

6

Rollen im Blick Um zu überprüfen: Spring Security Plugin bietet ifAllGranted , ifAnyGranted, ifNoneGranted usw., Tags Rollen

zum Beispiel um zu überprüfen, Admin Rolle der eingeloggte Benutzer zu überprüfen:

<sec:ifLoggedIn> 
    <sec:ifAllGranted roles="ROLE_ADMIN"> 
     Admin resource 
    </sec:ifAllGranted> 
</sec:ifLoggedIn> 

(in Grails-2.2.2 und SpringSecurityCorePlugin-1.2.7.3 getestet)

+2

... und dann gibt es auch '' – HumanInDisguise

1

Nicht sicher über die Situation, wenn diese Frage ursprünglich gestellt wurde, aber jetzt können Sie überprüfen, ob ein Benutzer in einer bestimmten Rolle ist SpringSecurityUtils.ifAllGranted(), die einen einzelnen String übernimmt, der eine durch Kommata getrennte Liste von Rollen ist. Es wird wahr zurückgegeben, wenn der aktuelle Benutzer zu allen gehört.

if(SpringSecurityUtils.ifAllGranted('ROLE_ADMIN,ROLE_USER')) { 

Offensichtlich können Sie einfach eine Rolle an die Funktion übergeben, wenn das alles ist, was Sie brauchen. SpringSecurityUtils hat auch Methoden wie ifAnyGranted, ifNotGranted, etc, so sollte es für was auch immer es ist, die Sie versuchen zu erreichen arbeiten.

SpringSecurityUtils ist eine statische API, so dass Sie kein privates Mitglied namens springSecurityUtils oder etwas Ähnliches erstellen müssen.

Verwandte Themen