2012-08-07 15 views
21

Znalazłem wiele podobnych pytań, ale żaden nie rozwiązał mojego problemu. Mój problem jest ROLE_USER mogą uzyskać dostęp do funkcji ROLE_ADMIN@PreAuthorize adnotacji nie działa ochrona wiosny

mojego kodu wiosna-security.xml jest następujący.

<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> 

kiedy dodać <s:global-method-security pre-post-annotations="enabled"/> mój kod pokazuje zasobu nie znaleziono błąd i kiedy usunąć mój kod wykonać pomyślnie ale ROLE_USER mogą uzyskać dostęp ROLE_ADMIN funkcje

Moja funkcja jest kontroler.

@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"; 

} 

Odpowiedz

21

Trzeba

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

Jeśli chcesz, @PreAuthorize adnotacje do pracy.


Aby odpowiedzieć na komentarz:

to wygląda tracisz zależność spring-aop.

Jeśli używasz Maven trzeba:

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

Jeśli nie można uzyskać słoik z here.

+0

Tak wiem, ale kiedy dodać mój kod pokazuje zasobu nie znaleziono błąd, wiesz jak to naprawić? – Raheel

+0

Zainicjowane zdarzenie inicjowania kontekstu wyjątku do instancji odbiornika klasy org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanDefinitionStoreException: nieoczekiwane przetwarzanie wyjątku dokumentu XML z zasobu ServletContext [/WEB-INF/spring-security.xml ]; Zagnieżdżony wyjątek to java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor – Raheel

+0

i używam zabezpieczenia spring3.07 – Raheel

3

Spróbuj z @Secured adnotacji,

Wtedy będziesz mieć

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

    ... 

} 

Oto a detailed blog post about it.

1

To może pomóc:

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

Pozdrawiam.

+0

Wielkie dzięki! Rozwiązał moje problemy. – WhiteWater

2

Żadna z powyższych odpowiedzi nie sprawdziła się u mnie. Musiałem iść drogą dodawania dekoratorów bezpieczeństwa.

Dekoratory są umieszczane na ziarnie w pliku servlet-context.xml.

Pierwszy dodać schemat zabezpieczeń do przestrzeni nazw XML:

<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"> 

Następnie stosować dekorator do realizacji fasoli usług, tak jak ..

<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> 
1

Ten problem wystąpi podczas korzystania Servlet 3 z pomocą Async Web Support. Spring Security 3.1.4 i poniżej tracą swój kontekst bezpieczeństwa, gdy zabiorą anonimową metodę z metody Callable.

Uaktualnienie Spring Security to 3.2.0 RC1 rozwiąże Twoje problemy.

Maven zależność:

<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> 
13

byłem stoi ten sam problem. Mój problem został rozwiązany, kiedy przeniosłem poniższy element z applicationContext.xml do * -servlet.xml (konfiguracja xml mojego dispatchera).

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

Trzeba to ten element na xml Twojego dyspozytora nie na aplikacji XML.
Spring FAQ

+1

Jest to z pewnością właściwa odpowiedź, jeśli nie posiadasz przynajmniej metody globalnego bezpieczeństwa zdefiniowanej w konfiguracji xml twojego servlera - – chrismarx

+0

To był dokładny problem, +1 dla wymieniania linku Wiosna FAQ dla wyjaśnienia. –

21

Jeśli używasz konfiguracyjnym XML nie zapomnij dodać następujący atrybut:

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

Jeśli używasz konfiguracji Javy nie zapomnij dodać następującą adnotację:

0

umieścić pod tagiem w innym pliku konfiguracyjnym wiosny, nie w filtrze konfiguracji zabezpieczeń sprężynowych mi.

Otrzymałem również ten sam błąd.

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