복붙노트

[SPRING] `springSecurityFilterChain` 빈은 어디에 정의해야합니까?

SPRING

`springSecurityFilterChain` 빈은 어디에 정의해야합니까?

web.xml에 springSecurityFilterChain에 대한 bean 정의를 배치하면 springSecurityFilterChain에 대한 중복 bean 정의가 있기 때문에 Tomcat 7이 시작되지 않는다는 오류가 발생합니다. 전체 스택 추적을 파일 공유 사이트에 업로드했습니다.이 링크를 클릭하면 읽을 수 있습니다. 그러나 web.xml의 springSecurityFilterChain 빈 정의를 주석 처리하고 서버를 다시 시작하려고하면 springSecurityFilterChain에 대한 bean 정의가 없음을 나타내는 다른 오류 메시지가 나타납니다. 이 링크를 클릭하면 파일 공유 사이트에서 두 번째 스택 추적을 읽을 수 있습니다.

SpringSecurityFilterChain에 대한 bean 정의를 어디에 두어야하며, 구문은 무엇이되어야 하는가?

나는이 접근법을 테스트하기 위해 사용하고있는 spring petclinic 샘플 애플리케이션이 clinicservice와 자체 XML 설정 파일을 사용하여 애플리케이션 시작과 리소스 관리를 처리하는 자체 방식을 가지고 있다고 생각한다. 이 링크에서 봄 Petclinic 앱의 전체 코드를 볼 수 있습니다.

petclinic 앱에 대한 변경 사항은 다음과 같습니다.

pom.xml에 다음을 추가했습니다.

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</artifactId>
  <version>3.2.2.RELEASE</version>
</dependency>

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

web.xml에 다음을 추가했습니다.

<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>

Java 리소스의 src / main / java에 org.springframework.security.samples.knowledgemanager.config 패키지를 추가 한 다음 다음 두 클래스를 추가했습니다.

MessageSecurityWebApplicationInitializer.java:

@Order(2)
public class MessageSecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}  

SecurityConfig.java:

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private UserDetailsService myCustomUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .and()
        .userDetailsService(myCustomUserDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers("/app/**").hasRole("ADMIN")
            .and()
        .formLogin()
            .loginPage("/index.jsp")
            .defaultSuccessUrl("/app/")
            .failureUrl("/index.jsp")
            .permitAll()
            .and()
        .logout()
            .logoutSuccessUrl("/index.jsp");
    }
}

해결법

  1. ==============================

    1.이는 web.xml 또는 AbstractSecurityWebApplicationInitializer 중 하나 (둘 다 아님)로 springSecurityFilterChain을 정의해야하기 때문입니다. Java Configuration을 사용하는 것처럼 보일 때 web.xml 항목을 제거합니다.

    이는 web.xml 또는 AbstractSecurityWebApplicationInitializer 중 하나 (둘 다 아님)로 springSecurityFilterChain을 정의해야하기 때문입니다. Java Configuration을 사용하는 것처럼 보일 때 web.xml 항목을 제거합니다.

    SecurityConfig를 어떻게 든 참조해야하기 때문입니다. 일반적으로 Java 구성을 사용할 때이 작업을 수행하는 가장 쉬운 방법은 MessageSecurityWebApplicationInitializer의 수퍼 클래스 생성자에 구성을 전달하는 것입니다.

    그러나 애완 동물 클리닉은 web.xml에서 XML 구성을 사용하므로 참조로 설명한대로 Java 및 XML 구성을 결합하여이 작업을 수행해야합니다. 이 예제의 경우 src / main / resources / business-config.xml 내에 다음을 포함 할 수 있습니다.

    <bean class="thepackage.SecurityConfig"/>
    

    당연히 SecurityConfig에 사용중인 패키지로 패키지를 대체해야합니다.

    business-config.xml에 구성을 포함시킬 수있는 이유는 web.xml에로드 할 contextConfiguration으로 지정 되었기 때문입니다. 당신은 또한 당신 자신의 Spring bean XML 파일을 생성하고, 위에서 보인 것처럼 SecurityConfig 빈을 추가 할 수 있으며, 새로운 Spring 빈 XML 파일을 가리 키도록 web.xml을 업데이트 할 수있다.

  2. from https://stackoverflow.com/questions/22670646/where-do-i-define-springsecurityfilterchain-bean by cc-by-sa and MIT license