2011-03-08 4 views
2


J'utilise Spring Security + MVC.
L'annotation @Secured({ "ROLE_ADMIN" }) ne fonctionne correctement que dans la couche de contrôleur.
Si j'essaie de l'utiliser dans des couches plus profondes/autres, je n'obtiens aucune erreur de sécurité.
Ou si j'essaie de l'utiliser sur des méthodes "none mvc mapped", je n'obtiens aucune erreur de sécurité.
les fichiers suivants de configuration de mon xml:
web.xml:Spring Security - @Secured fonctionne uniquement dans le contrôleur mvc

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     /WEB-INF/spring-security.xml 
     /WEB-INF/applicationContext.xml 
     </param-value> 
    </context-param> 
    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/log4j-myapp.properties</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/Management/*</url-pattern> 
    </servlet-mapping> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
</web-app> 

printemps-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- Declare a view resolver --> 
    <bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/pages/" p:suffix=".jsp" /> 
    <context:component-scan base-package="com.affiliates" /> 

</beans> 

printemps-security.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security" 
    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"> 
    <security:global-method-security secured-annotations="enabled" /> 
    <security:http auto-config="true" use-expressions="true" 
     access-denied-page="/Management/auth/denied"> 

     <security:intercept-url pattern="/Management/auth/login" 
      access="permitAll" /> 
     <security:intercept-url pattern="/Management/main/admin" 
      access="hasRole('ROLE_EMPLOYEE')" /> 
     <security:intercept-url pattern="/Management/api/affiliates/**" 
      access="hasRole('ROLE_EMPLOYEE')" /> 

     <security:form-login login-page="/Management/auth/login/" 
      authentication-failure-url="/Management/auth/login?error=true" 
      login-processing-url="/Management/auth/j_spring_security_check" 
      default-target-url="/Management/auth/login?error=false" /> 
     <security:logout invalidate-session="true" 
      logout-success-url="/Management/auth/login/" logout-url="/Management/auth/logout" /> 
    </security:http> 

    <security:authentication-manager> 
     <security:authentication-provider 
      user-service-ref="customUserDetailsService"> 
      <security:password-encoder ref="passwordEncoder" /> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <bean 
     class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" 
     id="passwordEncoder" /> 
    <bean id="customUserDetailsService" class="com.affiliates.service.CustomUserDetailsService" /> 
</beans> 

-mvc dispacher-servlet.xml

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

    <context:component-scan base-package="com.affiliates.controllers" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/pages/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 
</beans> 

applocationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <!-- Activates various annotations to be detected in bean classes --> 
    <context:annotation-config /> 

    <!-- Scans the classpath for annotated components that will be auto-registered 
     as Spring beans. For example @Controller and @Service. Make sure to set the 
     correct base-package --> 
    <context:component-scan base-package="com.affiliates" /> 

    <!-- Configures the annotation-driven Spring MVC Controller programming 
     model. Note that, with Spring 3.0, this tag works in Servlet MVC only! --> 
    <mvc:annotation-driven /> 

</beans> 

Voici comment je l'utilise: la méthode sécurisée:

@Component 
    public class BrandsApi{ 
    @Secured({ "ROLE_ADMIN" }) 
     public ResultContainer getAll() { 
      return brandDao.getAll(getSecurityFilter().getBrandSecurityFilter()); 
     } 
    } 
} 

Le appelant:

@Controller 
@RequestMapping("/api/brands") 
public class BrandsController { 
@RequestMapping(value = "/get") 
    public ModelAndView get(){ 
     BrandsApi brandsApi = new BrandsApi(); 
     brandsApi.getAll(); 
} 
} 

Voici donc ma dernière mise à jour:
Salut, je
un converti ma config dans le fichier javaconfig qui fonctionne très bien.
je débogue mon application dans le temps de chargement et je vois que le paramètre a été transféré.
ce qui signifie que le brandsApi est initialisé
code:

@Configuration 
public class SpringJavaConfig { 
    @Bean 
    public BrandsApi brandsApi(){ 
     return new BrandsApi(); 
    } 
} 

intérieur BrandsApi J'ai une méthode avec @Secured ({ "ROLE_ADMIN"}) au-dessus

c'est comment j'appelle la méthode: code:

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringJavaConfig.class); 
    BrandsApi brandsApi = (BrandsApi)ctx.getBean(BrandsApi.class); 
     brandsApi.getAll(); 

mais pour une raison que je peux obtenir à l'intérieur même si je suis connecté ROLE_EMPLOYEE
c'est ma classe BrandsApi:
code:

class BrandsApi extends BaseApi{ 
    @Secured({ "ROLE_ADMIN" }) 
    public void getAll() { 
     System.out.println("Hello"); 
    } 
} 
+1

Veuillez fournir un exemple de "couches plus profondes/autres" avec leur création. –

+0

@Stas Kurilin - Je modifie mon message, merci – fatnjazzy

Répondre

5

L'annotation n'a d'effet que si l'instance a été créée au printemps. Vous devez transformer chaque classe, où vous voulez l'utiliser, en un bean et l'enregistrer dans le contexte de l'application.

Notez également que l'annotation est ignorée si vous effectuez des appels internes:

Foo foo = context.getBean("foo", Foo.class); 
foo.foo(); // <-- annotatoon works here 

mais si foo() appels this.foo2(), il n'y a pas de contrôle plus. Ainsi, les annotations pour foo2() sont ignorées.

+0

Merci, Pouvez-vous s'il vous plaît me dire dans quel xml ai-je besoin d'enregistrer le haricot. et petit exemple aidera beaucoup, merci – fatnjazzy

+0

Vous devez les ajouter à 'applocationContext.xml' ou vous devez ajouter les annotaions correctes à la classe (puisque vous utilisez' context: component-scan'). Dans ce cas, ça devrait être @Component, je pense. Je suggère de créer un petit test pour s'assurer qu'il fonctionne comme vous le souhaitez. –

+0

Je n'ai pas d'exemple; ceci est de la mémoire :-) –

Questions connexes