Spring Security, Annotation der Methodensicherheit (@Secured) funktioniert nicht (java config)

8

Ich versuche, eine Methoden-Sicherheitsannotation mit @Secured ("ADMIN") einzurichten (ohne XML, nur Java-Konfiguration, Spring-Boot). Der Zugriff über Rollen funktioniert jedoch nicht.

Sicherheitskonfiguration:

%Vor%

Ich möchte den Zugriff auf die Methode des Controllers beschränken:

%Vor%

Beschränken Sie den Zugriff durch die URL funktioniert mit:

%Vor%

Vielleicht habe ich vergessen, anzugeben, dass ich nach Rollen einschränken möchte?

UPD: Nach den Regeln, auf welcher Ebene muss @PreAuthorize("hasRole('ADMIN')") in der Controller-Ebene oder in der Service-Ebene sein?

    
silverhawk 02.07.2015, 14:06
quelle

6 Antworten

0

Dieses Problem wurde behoben.

Ich füge @EnableGlobalMethodSecurity(prePostEnabled = true)

hinzu %Vor%

Und im Controller habe ich @Secured("ADMIN") in @PreAuthorize("hasRole('ADMIN')")

geändert     
silverhawk 07.07.2015, 09:40
quelle
16

Bitte fügen Sie dies

hinzu %Vor%

Dieses Element wird verwendet, um die auf Annotation basierende Sicherheit in Ihrer Anwendung zu aktivieren (indem Sie die entsprechenden Attribute für das Element festlegen) und auch Sicherheitspunktcut-Deklarationen zusammenfasst, die speziell für @Secured im gesamten Anwendungskontext angewendet werden. Daher sollte Ihr Code wie folgt aussehen

%Vor%     
Mudassar 02.07.2015 14:31
quelle
10

Es kann viele Gründe geben, warum die Methoden-Sicherheit auf einem Controller nicht funktioniert.

Erstens, weil es nie als Beispiel in Spring Security Handbuch zitiert wird ... Witze machen, aber es kann schwierig sein, Spring Tools zu nehmen, wo sie nicht gehen wollen.

Im Ernst: Sie sollten die Methodensicherheit wie bereits von @Mudassar beschrieben aktivieren. Das Handbuch sagt:

Annotationsbasierte Sicherheit können wir mithilfe der Annotation @EnableGlobalMethodSecurity für jede @Configuration -Instanz aktivieren. Im folgenden Beispiel wird die @Secured -Anmerkung von Spring Security aktiviert.

%Vor%

Beachten Sie, dass Mudassars Antwort bis hier richtig ist.

Die Methodensicherheit basiert jedoch auf AOP, das standardmäßig JDK-Proxying auf Schnittstellen verwendet. Aus diesem Grund wenden alle Beispiele Methodensicherheit auf der Serviceebene an, da die Serviceklassen normalerweise in Controller als Schnittstellen eingefügt werden.

Sie können es natürlich auf der Controller-Ebene verwenden, aber:

  • entweder alle Ihre Controller implementieren Schnittstellen für Sie alle @Secured annotierte Methoden
  • oder Sie müssen zur Klassenproxys
  • wechseln

Die Regel, der ich zu folgen versuche, ist:

  • Wenn ich eine URL sichern möchte, halte ich mich an HTTPSecurity
  • Wenn ich feineren Zugriff erlauben möchte, füge ich Sicherheit auf Service-Ebene hinzu
Serge Ballesta 02.07.2015 14:49
quelle
5

Ich weiß, dass dieser Thread ziemlich alt ist und meine Antwort spielt auf Teile der Antworten von verschiedenen Leuten in diesem Thread an; Aber hier ist eine Liste von Fallen und Antworten:

  1. Wenn @Secured verwendet wird und der Rollenname (z. B.) ADMIN lautet; Dies bedeutet eine Anmerkung von @Secured ("ROLE_ADMIN").
  2. WebSecurityConfigurerAdapter muss @EnableGlobalMethodSecurity (securedEnabled = true)
  3. haben
  4. Stellen Sie, wie bei den meisten mit Spring verwandten Proxies, sicher, dass die Klasse und die gesicherten Methoden in keiner Weise endgültig sind. Für Kotlin bedeutet das "Öffnen" jeder Methode sowie der Klasse.
  5. Wenn die Klasse und ihre Methoden virtuell ("offen") sind, dann besteht keine Notwendigkeit für eine Schnittstelle.

Hier ist ein Teil eines funktionierenden Kotlin-Beispiels:

%Vor%

und

%Vor%

Grüße

    
user1210708 10.10.2016 16:48
quelle
0

Vielleicht sollten Sie Ihre AppSecurityConfiguration im selben Kontext wie WebMvcConfig (das WebMvcConfigurerAdapter erweitert) registrieren.

%Vor%     
digz6666 03.05.2016 08:16
quelle
0

Sie müssen @secured (ROLE_ADMIN) anstelle von @secured (ADMIN) verwenden. Sie müssen "ROLE _" vor Ihrem Rollennamen schreiben. Bitte beachten Sie das unten genannte Beispiel, das sicherstellt, dass nur ein Benutzer mit Admin-Rolle auf die list () -Methode zugreifen kann.

%Vor%     
Sadiq Ali 10.03.2017 05:55
quelle