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é lemode="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.
Vous devez vous connecter pour publier un commentaire.
Comme suggéré par @Luke Taylor dans les commentaires de la balise
<sec:global-method-security/>
doit être défini dans le dispatcher-servlet.xml(webmvc-config.xml dans le cas présent) fichier. Et il n'est pas nécessaire d'avoir attributmode="aspectj"
.Grâce.