Comment peut - <global-méthode-sécurité> travailler sur mon contrôleur de Printemps-Sécurité?

Je suis coincé dans cette question depuis longtemps. Je veux utiliser @Secure pour ajouter le Contrôle d'Accès à mon contrôleur ArticleController.java comme ceci:

@RequestMapping(headers = "Accept=application/json")
@ResponseBody
@Secured("ROLE_ADMIN")
public ResponseEntity<String> listJson() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");
    List<Article> result = Article.findAllArticles();
    return new ResponseEntity<String>(Article.toJsonArray(result), headers, HttpStatus.OK);
}

listJson retourner un objet Json pour Articles mais seul l'Administrateur peut les lire. OK maintenant j'ai configurer le Printemps de Sécurité pour faire ce travail.

- Je utiliser security setup fonction de Printemps-ROO, le suivant configure généré:

Dans web.xml:

     <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
     </context-param>
....
    <servlet>
        <servlet-name>BabyPortal</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/spring/webmvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

Dans spring/webmvc-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd                 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<tx:annotation-driven/>
<!-- The controllers are autodetected POJOs labeled with the @Controller 
annotation. -->
<context:component-scan base-package="com.tongxinyuan.babyportal"
use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>
<!-- Turns on support for mapping requests to Spring MVC @Controller methods 
Also registers default Formatters and Validators for use across all @Controllers -->
<mvc:annotation-driven conversion-service="applicationConversionService" />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
up static resources -->
<mvc:resources location="/, classpath:/META-INF/web-resources/"
mapping="/resources/**" />
<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static 
resource requests to the container's default Servlet -->
<mvc:default-servlet-handler />
<!-- Register "global" interceptor beans to apply to all registered HandlerMappings -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" />
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
p:paramName="lang" />
</mvc:interceptors>
<!-- Selects a static view for rendering without the need for an explicit 
controller -->
<mvc:view-controller path="/login" />
<mvc:view-controller path="/" view-name="index" />
<mvc:view-controller path="/uncaughtException" />
<mvc:view-controller path="/resourceNotFound" />
<mvc:view-controller path="/dataAccessFailure" />
<!-- Resolves localized messages*.properties and application.properties 
files in the application to allow for internationalization. The messages*.properties 
files translate Roo generated messages which are part of the admin interface, 
the application.properties resource bundle localizes all application specific 
messages such as entity names and menu items. -->
<bean
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
id="messageSource" p:basenames="WEB-INF/i18n/messages,WEB-INF/i18n/application"
p:fallbackToSystemLocale="false" />
<!-- Store preferred language configuration in a cookie -->
<bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
id="localeResolver" p:cookieName="locale" />
<!-- Resolves localized <theme_name>.properties files in the classpath to 
allow for theme support -->
<bean
class="org.springframework.ui.context.support.ResourceBundleThemeSource"
id="themeSource" />
<!-- Store preferred theme configuration in a cookie -->
<bean class="org.springframework.web.servlet.theme.CookieThemeResolver"
id="themeResolver" p:cookieName="theme" p:defaultThemeName="standard" />
<!-- This bean resolves specific types of exceptions to corresponding logical 
- view names for error views. The default behaviour of DispatcherServlet 
- is to propagate all exceptions to the servlet container: this will happen 
- here with all other types of exceptions. -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
p:defaultErrorView="uncaughtException">
<property name="exceptionMappings">
<props>
<prop key=".DataAccessException">dataAccessFailure</prop>
<prop key=".NoSuchRequestHandlingMethodException">resourceNotFound</prop>
<prop key=".TypeMismatchException">resourceNotFound</prop>
<prop key=".MissingServletRequestParameterException">resourceNotFound</prop>
</props>
</property>
</bean>
<!-- Enable this for integration of file upload functionality -->
<bean
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
id="multipartResolver" />
<bean
class="com.tongxinyuan.babyportal.controller.ApplicationConversionServiceFactoryBean"
id="applicationConversionService" />
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"
id="tilesViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"
id="tilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/layouts/layouts.xml</value>
<!-- Scan views directory for Tiles configurations -->
<value>/WEB-INF/views/**/views.xml</value>
</list>
</property>
</bean>
<security:global-method-security mode="aspectj" secured-annotations="enabled" pre-post-annotations="enabled"/>
</beans>

Dans /spring/applicationContext-security.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
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.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<!-- HTTP security configurations -->
<http auto-config="true" use-expressions="true">
<form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" />
<logout logout-url="/resources/j_spring_security_logout" />
<!-- Configure these elements to secure URIs in your application -->
<intercept-url pattern="/choices/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/member/**" access="isAuthenticated()" />
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/*.html" access="hasRole('ROLE_ADMIN')" />
</http>
<!-- Configure Authentication mechanism -->
<authentication-manager alias="authenticationManager">
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_ADMIN" />
<user name="user" password="user" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>

Tout d'abord j'ai essayé d'ajouter le <global-method-security mode="aspectj" secured-annotations="enabled" pre-post-annotations="enabled"/> à /spring/applicationContext-security.xml mais n'a pas fonctionné. Alors peut-être que le contrôleur n'est pas dans le même contexte de contexte de sécurité, j'ai donc ajouter la /spring/webmvc-config.xml qui a commencé avec DispatcherServlet, n'a pas fonctionné.

J'ai aussi ajouté un autre défaut applicationContext.xml, il ne fonctionne pas non plus. Je ne sais pas comment configurer l' <global-method-security> qui peut rendre la méthode de travail en matière de sécurité. Il semble que je utilisez uniquement un contexte, ai-je raté quelque chose? Espérons que l'information est suffisante pour faire de cette question claire.

PS: L'URL générée méthode fonctionne très bien: <intercept-url pattern="/*.html" access="hasRole('ROLE_ADMIN')" />.

Ajouté:
Selon @LukeTaylor commentaires: j'ai ajouté le <global-method-security> à webmvc-config.xml et enlevé le mode="aspectj", ça fonctionne, et j'ai fait des expériences, ont encore quelques questions:

1) Il fonctionne, mais seulement pour ArticleController.java le @Secure tag dans ArticleController_Roo_Controller.aj ne fonctionnent toujours pas, c'est que quelque chose lié à "onduler"?
2) Pouvez-vous m'expliquer pourquoi mode=aspectj faire désordre ici?

  • double possible de @Sécurisé annotations ne travaillant pas dans AspectJ Mode avec Autoproxy
  • Pourquoi ne voulez-vous pas utiliser <intercept-url>? C'est la façon habituelle de faire.
  • vous avez raison, la raison pour laquelle j'utilise roo c'est pour des raisons de commodité, je ne peux pas passer plus de temps sur ce. Mais autre tag @Async ne peut pas travailler, donc je pense de certains configurer l'erreur qui pourrait quelqu'un ici le sait.
  • Comme @axtavt dit, on dirait que vous êtes de façon incorrecte à l'aide de mode="aspectj".
  • J'ai essayé de supprimé la mode, il n'a toujours pas de travail.
  • Avez-vous mis dans votre webmvc-config.xml fichier?
  • reportez-vous à votre astuce, j'ai ajouté le <global-method-security> à webmvc-config.xml et enlevé le mode="aspectj", ça fonctionne, et j'ai fait quelques expériences, veuillez vérifier ma principale question, je vous remercie.
  • veuillez supprimer le commentaire et la réponse à la Réponse que je peux le rang que vous.
  • il serait probablement plus judicieux de demander la suppression de la question, pour être honnête. C'est vraiment un doublon de celui lié par axtavt, ainsi que la commune de la confusion qui est cause par le Printemps de l'enfant et le parent, le contexte de l'application de la relation et de la visibilité de haricots entre eux (également couverts sur soi et au Printemps FAQ sur la Sécurité). J'ai ajouté une autre réponse à l'autre question à clarifier certaines choses, de sorte que vous pouvez voter que si vous le souhaitez :-).
  • Merci tout le monde ça m'a beaucoup aidé. Je suis en fournissant une réponse précise sur la base de vos conversations afin que d'autres utilisateurs comme moi peut facilement identifier la réponse sans passer par les commentaires.

InformationsquelleAutor JerryCai | 2012-07-10