Double enregistrement pour springSecurityFilterChain lors du déploiement sur tomcat en dehors d'eclipse
Je suis un peu nouveau pour le printemps et encore confus par toutes les configurations. Je suis passé par plusieurs tutoriels et il semble que tout le monde fait les choses différemment. J'ai un printemps de l'application qui fonctionne très bien grâce à Eclipse en utilisant le plugin tomcat. Cependant lors de l'exportation d'un fichier war dans tomcat lui-même tomcat ne démarre pas et jette
SÉVÈRE: ContainerBase.addChild: démarrer org.apache.catalina.LifecycleException: impossible de démarrer le composant
Causés par: java.lang.IllegalStateException: Double Filtre d'enregistrement pour "springSecuirtyFilterChain'. Assurez-vous que le Filtre est configuré une fois!
Voir l'image pour plein de trace de pile.
Après commentant springSecurityFilterChain dans web.xml, si la source de données est autocâblés ou non donne une ou deux erreurs.
-
Si la source de données est autocâblés alors je viens d'obtenir un message d'erreur indiquant que la création d'
bean securityConfig a échoué et qu'il n'y a pas de fève trouvée pour
la dépendance. -
Si je laisse dataSource pas autocâblés (comme le code que j'ai qui fonctionne dans Eclipse), puis-je obtenir une IllegalArgumentException: la Propriété "source de données" est nécessaire.
Aussi afin de ne pas obtenir un multiple ContextLoader définition de l'erreur que j'ai pour commenter la ContextLoaderListener web xml.
De ce que j'ai vu, le problème réside dans l'utilisation de xml et java pour les configurations, mais je ne peux pas déterminer exactement ce qui est mal.
J'ai trouvé une question similaire, mais a été incapable de résoudre mon problème.
Où puis-je définir " springSecurityFilterChain` haricot?
L'ajout d'une classe d'haricot pointant vers mon securityConfig mettre en spring-security.xml n'a pas aidé.
Merci!
photo de plein de trace de pile
Ci-dessous est le code qui fonctionne très bien lors de l'exécution dans Eclipse.
web.xml
<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">
<!-- Spring MVC -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>servlet.InitServlet</servlet-class>
<init-param>
<param-name>configfile</param-name>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>servlet.admin.AdminServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>servlet.user.UserServlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet>
<servlet-name>SignupUserServlet</servlet-name>
<servlet-class>servlet.user.SignupUserServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet>
<servlet-name>ReceiveFile</servlet-name>
<servlet-class>servlet.user.ReceiveFile</servlet-class>
<load-on-startup>6</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/pages/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/AdminServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SignupUserServlet</servlet-name>
<url-pattern>/SignupUserServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ReceiveFile</servlet-name>
<url-pattern>/ReceiveFile</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-security.xml,
/WEB-INF/spring-database.xml
</param-value>
</context-param>
<!-- Spring Security -->
<!-- This is to allow enctype="multipart/form-data" to upload and not throw an access denied page.
See bottom of http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html for more info.-->
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<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>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
SecuirtyConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
DataSource dataSource;
/* @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
} */
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username,password, enabled from test_users where username=?")
.authoritiesByUsernameQuery("select username, role from test_user_roles where username=?");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/res/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginDatabase.html")
.permitAll();
}
}
AppConfig.java
@EnableWebMvc
@Configuration
@ComponentScan({"security.spring"})
@Import({ SecurityConfig.class })
public class AppConfig {
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
driverManagerDataSource.setUrl("****");
driverManagerDataSource.setUsername("**");
driverManagerDataSource.setPassword("**");
return driverManagerDataSource;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
spring-security.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
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.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="spring.*" />
<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">
<!-- login page must be available to all. The order matters, if this is after something which secures the page this will fail. -->
<!-- <intercept-url pattern="/SignupUserServlet" access="permitAll"/> -->
<!-- <intercept-url pattern="/pages/ReceiveFile" access="permitAll()"/>
<intercept-url pattern="/pages/fileUpdate2" access="permitAll()"/>
<intercept-url pattern="/pages/login" access="permitAll()" /> -->
<intercept-url pattern="/pages/admin/**" access="hasRole('_admin')" />
<intercept-url pattern="/pages/trade/**" access="hasRole('_trader')" />
<intercept-url pattern="/pages/discover/**" access="hasRole('_users')" />
<!-- access denied page -->
<access-denied-handler error-page="/pages/403" />
<form-login
login-page="/pages/login"
default-target-url="/pages/common/redirectportal"
authentication-failure-url="/pages/login?error"
username-parameter="username"
password-parameter="password" />
<logout logout-url="/pages/logout" logout-success-url="/pages/login?logout" />
<!-- enable csrf protection -->
<!-- currently off for testing... <csrf/> -->
</http>
<!-- Select users and user_roles from database -->
<authentication-manager>
<authentication-provider ref="customAuthenticationProvider"/>
<!--<jdbc-user-service data-source-ref="dataSource"
users-by-username-query=
"select email,pwhash, enabled from users where email=?"
authorities-by-username-query=
"select email, groupname from usergroups where email =? " />
</authentication-provider> -->
</authentication-manager>
</beans:beans>
OriginalL'auteur farnett | 2014-09-18
Vous devez vous connecter pour publier un commentaire.
Il semble que vous avez deux instances de la
springSecurityFilterChain
défini: une Fois dansSecurityConfig.java
, et une fois dansspring-security.xml
. Vous avez seulement besoin d'une de ces fichiers.Le filtre en ligne web.xml raconte le moteur de servlet (Tomcat) pour charger ce filtre, mais l'instance de ce filtre est configuré dans le Ressort du contexte. Le problème, c'est le Printemps contexte ne peut pas démarrer, parce que vous avez deux configurations pour le
springSecurityFilterChain
. En prendre une, et vous permettra de faire des progrès.Votre configuration dans le fichier XML semble plus globale et fine, mais je vous recommande de déplacer cette configuration dans le fichier Java et d'éliminer le fichier XML.
Une fois que vous retirez votre dupliquer la configuration, vous pouvez toujours avoir des erreurs, mais vous devriez être capable de trouver une solution à ceux qui sont sur ce site ou n'hésitez pas à poster une question distincte!
Remarque: Il est également possible d'obtenir de Printemps pour enregistrer automatiquement la chaîne de filtre pour vous, de sorte que vous n'avez pas besoin de la définir dans web.xml. Voir ici pour savoir comment faire:
http://www.mkyong.com/spring-security/spring-security-hello-world-annotation-example/
Cependant, je vous recommande d'obtenir la configuration actuelle de travail d'abord, avant de les jeter que dans le mélange.
mise à jour de ma réponse!
J'avais quelque chose comme la SpringSecurityInitializer dans votre exemple, dans mon application, mais je n'étais pas à l'utiliser car il parle déjà de multiples filtres prédéfinis. Je suis en train d'essayer de changer ma configuration de java pour voir si cela fonctionne...
bonne chance, de rendre compte de ce que vous trouverez. Comme je l'ai dit, vous pouvez laisser votre web.xml le chemin que vous avez et et ne vous inquiétez pas SpringSecurityInitializer pour l'instant. Nous avons un de notre programme d'installation d'applications comme ceci (avec la Sécurité de Java config, chaîne de filtre dans web.xml) et il fonctionne très bien.
Tout en travaillant à modifier mon projet et de se débarrasser de l'xml, eclipse s'est écrasé avec une perm gen espace d'erreur et de perdre tous mes fenêtre/afficher (et je suppose que d'autres) préférences. D'une certaine manière cela doit ont changé la façon dont la guerre de fichier a été exporté, parce que, après que, avec le même code il, tout d'un coup commencé à travailler. Malheureusement, je ne suis pas sûr de ce qui s'est passé. Je vais marquer votre réponse comme correcte, car il m'a mis sur un chemin que quelque il a commencé à travailler. Normalement quelque chose d'explicable qui se passe et mon code pauses, heureusement, cela semble être l'exception des cas où il est allé dans l'autre sens.
OriginalL'auteur JBCP
Je pense qu'il n'y a pas de réponse exacte à cette question. L'affichage de toute façon peut-être cela aiderait quelqu'un.
Deux choses pour l'approche xml -
1. se débarrasser de SpringSecurityInitializer classe parce que les u sont à l'aide de xml et avoir de la cartographie dans web.xml
2. Dans AppConfig fichier supprimer @Import({ SecurityConfig.class })
Si vous voulez les garder pour eux ne reserse c'est à dire supprimer le mappage de web.xml fichier et de se débarrasser de xml.
OriginalL'auteur Mohammad Adnan