2017-07-12 28 views
1

既に投稿されている同様の問題のほとんどを読んだことがありますが、解決策を見つけることができませんでした。エラーが発生しましたアプリケーションを実行しようとしているときに「springSecurityFilterChain」という名前のbeanは使用できません。私はpom.xmlファイルに春のセキュリティの依存関係をインポートしました。私はSecurityConfigクラスの@EnableWebSecurityに注釈を付けましたが、まだ動作していません。問題を見つけることができません。スプリングセキュリティエラー: 'springSecurityFilterChain'という名前のBeanはありません

のpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>app</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>app</name> 
    <packaging>war</packaging> 
    <description>  </description> 

    <properties> 
     <maven.compiler.source>1.8</maven.compiler.source> 
     <maven.compiler.target>1.8</maven.compiler.target> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <failOnMissingWebXml>false</failOnMissingWebXml> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.11.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>4.3.9.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.3.9.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.thymeleaf</groupId> 
      <artifactId>thymeleaf-spring4</artifactId> 
      <version>3.0.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.42</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>5.2.10.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>4.3.9.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>4.3.9.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-taglibs</artifactId> 
      <version>4.0.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>4.2.3.RELEASE</version> 
     </dependency> 


     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>4.2.3.RELEASE</version> 
     </dependency> 


     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>4.2.3.RELEASE</version> 
     </dependency> 



    </dependencies> 

</project> 

securitiConfigクラス

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 



@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{ 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .jdbcAuthentication() 
      .dataSource(dataSource); 
      //.passwordEncoder(bcryptEncoder); 
    } 

    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
      .antMatchers("/login").permitAll() 
      .antMatchers("/admin").hasRole("ADMIN") 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
        .loginPage("/login") 
       .and() 
      .httpBasic(); 
     } 
} 

SecurityWebApplicationInitializerクラス

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; 

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer{ 

} 
+0

クラス '' SecurityConfig'and SecurityWebApplicationInitializer'は、同じパッケージに含まれていますか? – JimHawkins

+0

@JimHawkinsあり –

+0

他のSpring関連クラスではどのようなアノテーションを使用していますか?これらの情報を質問に追加してください。 – JimHawkins

答えて

0

私はあなたが春のルートコンテキストにセキュリティ設定をインポートしていなかったと思います。私のアプリケーションで

、私はこの方法getRootConfigClassesは春のルート設定クラスを返しAbstractAnnotationConfigDispatcherServletInitializerの実装を、持っている(私は1つしかない):

import javax.servlet.*; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.springframework.context.ApplicationContext; 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class MyDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 
{ 
    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException 
    { super.onStartup(servletContext); } 

    @Override 
    protected Class<?>[] getRootConfigClasses() 
    { return new Class[]{MyRoot.class};} 

    @Override 
    protected Class<?>[] getServletConfigClasses() 
    { return null; } 

    @Override 
    protected String[] getServletMappings() 
    { return new String[]{"/"}; } 

    @Override 
    protected String getServletName() 
    { return "myDispatcherServlet"; } 

    @Override 
    protected void customizeRegistration(ServletRegistration.Dynamic registration) 
    { 
     super.customizeRegistration(registration); 
     registration.setLoadOnStartup(1); 
    } 
} 

MyRootは私の春の豆が含まれています。 @Import({MySecurityConfigurer.class, MyWebConfigurer.class})
MySecurityConfigurerで注釈を見てください@Import

@Configuration 
@PropertySource("file:${my.config}") 
@ComponentScan(basePackages = { 
     "com.my.filter", "com.my.controller" 
     , "com.my.registration" 
}) 

@EnableTransactionManagement(mode = AdviceMode.PROXY, proxyTargetClass = false) 
@Import({MySecurityConfigurer.class, MyWebConfigurer.class}) 
public class DmRoot 
{ 
    private final Environment env; 

    @Autowired 
    public MyRoot(Environment env) 
    { 
     Assert.notNull(env, "die Umgebungseinstellungen sind NULL"); 
     this.env = env; 
     dbUserModelPackage = env.getProperty("my.userDbModel"); 
     dbAccountingModelPackage = env.getProperty("my.accountingDbModel"); 
    } 

    // all my Spring beans 
} 

ルックはorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapterの私の拡張機能であり、そしてMyWebConfigurerは、ユーザとウェブUIのために使用されていないorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter

@EnableWebMvc 
@EnableWebSecurity 
public class MySecurityConfigurer extends WebSecurityConfigurerAdapter 
{ 
    private final Environment env; 
    private final UserDetailsService myUserDetailsService; 

    @Autowired 
    public MySecurityConfigurer(Environment env, UserDetailsService myUserDetailsService) 
    { 
     Assert.notNull(env, "die Umgebungseinstellungen sind NULL"); 
     this.env = env; 
     Assert.notNull(myUserDetailsService, "der myUserDetailsService ist NULL"); 
     this.myUserDetailsService = myUserDetailsService; 
    } 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception 
    { 
     String urlPattern = env.getProperty("my.springSecurityPattern"); 
     String realmName = env.getProperty("my.springSecurityRealm"); 
     String reloadPairingUrl = env.getProperty("my.reloadPairingUrl"); 

     HttpSecurity securityAdapter = httpSecurity.httpBasic().realmName(realmName) 
       .and().userDetailsService(myUserDetailsService) 
       .authorizeRequests() 
       .antMatchers(reloadPairingUrl).permitAll() 
       .antMatchers(urlPattern).authenticated() 
       .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and().csrf().disable(); 
    } 

} 

このコードの私の拡張機能ですHTTPS経由の基本認証を持つサービスの場合

+0

私は@ComponentScan(basePackages = {})にそれを認識できない理由を入れていません。私がそれをしたとき、それは働いた! :) –

0

ecurity.xmlはDispatcherServletではなくContextLoaderListenerによってロードされます。 DelegatingFilterProxyは、デリゲートするBeanのルートapplicationcontext(ContextLoaderListenerによってロードされる)だけを調べます。例えば

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring-security.xml 
    </param-value> 
</context-param> 
関連する問題