webentwicklung-frage-antwort-db.com.de

@PreAuthorize Annotation funktioniert nicht mit Federsicherheit

Ich habe viele ähnliche Fragen gefunden, aber keine hat mein Problem gelöst. Mein Problem ist, dass ROLE_USER auf Funktionen von ROLE_ADMIN zugreifen kann.

Mein spring-security.xml-Code folgt.

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:s="http://www.springframework.org/schema/security"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/security
                    http://www.springframework.org/schema/security/spring-security-3.0.xsd">   

<s:http auto-config="true" use-expressions="true">
    <s:intercept-url pattern="/index.jsp" access="permitAll" />
    <s:intercept-url pattern="/welcome*" access="hasRole('ROLE_USER')" />
    <s:intercept-url pattern="/helloadmin*" access="hasRole('ROLE_ADMIN')" />

    <s:form-login login-page="/login" default-target-url="/welcome"
        authentication-failure-url="/loginfailed" />
    <s:logout logout-success-url="/logout" />
</s:http>

<s:authentication-manager>
  <s:authentication-provider>
    <s:user-service>
        <s:user name="asif" password="123456" authorities="ROLE_USER,ROLE_ADMIN" />
        <s:user name="raheel" password="123456" authorities="ROLE_USER" />          
    </s:user-service>
  </s:authentication-provider>
</s:authentication-manager>

wenn ich <s:global-method-security pre-post-annotations="enabled"/>my hinzufüge, zeigt der Fehler "Ressource nicht gefunden" an und wenn ich meinen Code entferne, wird er erfolgreich ausgeführt, ROLE_USER kann jedoch auf ROLE_ADMIN-Funktionen zugreifen

Meine Controller-Funktion ist.

@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

    org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities());
    return "deleteUsers";

}
23
Raheel

Du solltest haben

<s:global-method-security pre-post-annotations="enabled"/>

Wenn Sie möchten, dass die @PreAuthorize-Anmerkungen funktionieren.


Um den Kommentar zu beantworten:

Anscheinend fehlt Ihnen die spring-aop-Abhängigkeit.

Wenn Sie Maven verwenden, benötigen Sie:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

Wenn nicht, können Sie das Glas von hier bekommen.

26
Simeon

Wenn Sie die XML-Konfiguration verwenden, vergessen Sie nicht, das folgende Attribut hinzuzufügen:

<s:global-method-security pre-post-annotations="enabled"/>

Wenn Sie Java Configuration verwenden, vergessen Sie nicht, die folgende Anmerkung hinzuzufügen:

@EnableGlobalMethodSecurity(prePostEnabled = true)

32

Ich stand vor demselben Problem. Mein Problem wurde behoben, als ich das untere Element von applicationContext.xml in * -servlet.xml (die Konfigurations-XML meines Dispatchers) verschoben habe. 

<security:global-method-security secured-annotations="enabled"/>

Sie müssen dieses Element in die XML-Datei Ihres dispatchers aufnehmen, NICHT in die XML-Datei Ihrer Anwendung.
Frühling FAQ

14

Ich hatte das gleiche Problem mit Annotationen, das Problem war, dass sich in meinem Controller keine @Controller Annotation befand.


So wie es scheint, brauchen Sie:

  • Diese Anmerkungen in Ihrer Spring Security-Konfiguration:

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    
  • Diese Anmerkungen in Ihrem Controller:

    @Controller
    public class ServiceRS {
    
        @RequestMapping(value = "/admin", method = RequestMethod.GET)
        @PreAuthorize("hasAuthority('ROLE_ADMIN')")
        public void wsAdmin() {
            [...]
        }
    }
    

Wenn Sie weiterhin Probleme haben, können Sie dies Ihrer log4j2-Konfiguration hinzufügen:

    <Logger name="org.springframework.security" level="trace" additivity="false">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingRandomAccessFile" />
    </Logger>

Sie sehen in Protokollen, ob Ihre Anmerkungen von Spring berücksichtigt werden:

TRACE org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] Looking for Pre/Post annotations for method 'wsAdmin' on target class '***.ServiceRS' 
DEBUG org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] @org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority('ROLE_ADMIN')) found on specific method: public void ***.ServiceRS.wsAdmin() 
DEBUG org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource {} [main] Caching method [CacheKey[***.ServiceRS; public void ***.ServiceRS.wsAdmin()]] with attributes [[authorize: 'hasAuthority('ROLE_ADMIN')', filter: 'null', filterTarget: 'null']] 

Natürlich können Sie auch in org.springframework.security.access.expression.SecurityExpressionRoot - Haltepunkte hinzufügen, um zu sehen, ob ein Aufruf mit der Bedingung in Ihrer Anmerkung erfolgt.

Grüße.

3
Alexandre Hamon

Versuchen Sie es mit @Secured Annotation.

Dann hast du es

@Secured("ROLE_ADMIN")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

  ...

}

Hier ist ein ausführlicher Blogbeitrag dazu .

3
Martin Spa

Keine der obigen Antworten hat für mich funktioniert. Ich musste den Weg des Sicherheitsdekorators hinzufügen. 

Dekorateure werden in Beans in Datei servlet-context.xml platziert.

Fügen Sie zunächst dem XML-Namespace ein Sicherheitsschema hinzu:

<beans:beans xmlns="http://www.springframework.org/schema/mvc"
...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

Dann wenden Sie den Dekorator auf die Implementierung der Service-Bean an.

<beans:bean id="myService" class="my.service.impl.MyServiceImpl" scope="request">
    <security:intercept-methods>
        <security:protect access="ROLE_USER" method="get*"/>
        <security:protect access="ROLE_ADMIN" method="set*"/>
    </security:intercept-methods>
</beans:bean>
2
user2601995

Das könnte Ihnen helfen: 

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>

Grüße.

1
rweiller

Dieses Problem tritt auf, wenn Servlet 3 mit Web Async Support verwendet wird. Spring Security 3.1.4 und niedriger verlieren ihren Sicherheitskontext, sobald die anonyme Methode der Callable-Methode aktiviert wird. 

Ein Upgrade von Spring Security auf 3.2.0 RC1 wird Ihre Probleme lösen.

Maven-Abhängigkeit:

<dependencies>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
1
user2601995

unter dem Tag in einer anderen Federkonfigurationsdatei einfügen, nicht in der Federkonfigurationsdatei.

Ich bekam auch den gleichen Fehler.

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>
0
pradipgarala