[Spring_Security] Error creating bean with name 'org.springframework.security.filterChains

2022. 12. 20. 17:47[Error]_

728x90
반응형

환경 

Eclipse 최신버전 2022-09 (4.25.0)

Tomcat - 10.0.23  v

maven Artifact ID : maven-archetype-webapp 1.4v

Spring 6.0.2 ver

Spring Security 6.0.0 ver

spring-jdbc : 6.0.2 ver

mybatis : 3.5.11ver

mybatis-spring : 3.0.1ver

 

문제상황

오류코드

Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0]

원인 파악

 

원래 intercept-url 이 한줄일 경우에는 오류가 나지 않았습니다.

<intercept-url pattern="/login/**"  access="permitAll" />

 

여러군대 intercept 지정시 오류발생하였습니다.

		<intercept-url pattern="/login/**"  access="permitAll" />
		<intercept-url pattern="/menu1" access="hasRole('ROLE_ADMIN')" />
		<intercept-url pattern="/**"  access="permitAll" />

원인

spring security 6.0.0 버전 부터는

http 태그에 다음과 같은 항목이 추가되었습니다.

 

 

번역

  • request-matcherRequestMatcher 수신 요청과 일치시키기 위해 에서 사용되는 전략 FilterChainProxy과 에서 생성된 빈 을 정의합니다 intercept-url. 옵션은 현재 Spring MVC mvc, ant ant, regular-expression 및 case-insensitive regular-expression에 대해 각각 , 및 입니다 regex. pattern , method  servlet-path 속성 을 사용하여 ciRegex각 intercept-url 요소 에 대해 별도의 인스턴스가 생성됩니다. Ant 경로는 를 사용하여 일치 하고 정규 표현식은 를 사용하여 일치 하며 Spring MVC 경로는AntPathRequestMatcherRegexRequestMatcherMvcRequestMatcher사용. 일치가 수행되는 방법에 대한 자세한 내용은 이러한 클래스에 대한 Javadoc를 참조하십시오. 개미 경로는 기본 전략입니다.

원본 링크

https://docs.spring.io/spring-security/reference/6.0.0-M3/servlet/appendix/namespace/http.html#nsa-http-attributes

 

Web Application Security :: Spring Security

Adds support for concurrent session control, allowing limits to be placed on the number of active sessions a user can have. A ConcurrentSessionFilter will be created, and a ConcurrentSessionControlAuthenticationStrategy will be used with the SessionManagem

docs.spring.io

 

이전 버전에서는 request-matcher 를 부여하지 않아도

intercept-url 이 여러개 사용 가능하였으나

 

6.0.0 이상버전에는 ant,mvc,regex,ciRegex 중 선택하여 지정해야 합니다.

 

저의 경우 절대경로를 사용하였기 때문에 ant 를 지정하니 오류가 해결되고 정상적으로

intercept - url 이 작동하였습니다.

 

securityContext 전문

<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:b="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security.xsd">


<!-- 	<global-method-security -->
<!-- 		pre-post-annotations="enabled"> -->
<!-- 		<expression-handler ref="expressionHandler" /> -->
<!-- 	</global-method-security> -->

	<!-- http 요청시 처리 로직 -->
	<http request-matcher="ant" auto-config="true">
	
	<!-- url intercept 설정 -->
		<intercept-url pattern="/login/**"  access="permitAll" />
		<intercept-url pattern="/menu1" access="hasRole('ROLE_ADMIN')" />
		<intercept-url pattern="/**"  access="permitAll" />
	
	<!-- 로그인 페이지 설정 -->	
		<form-login login-page="/login/login"
			username-parameter="username" password-parameter="password"
			login-processing-url="/loginProcessing"
			authentication-success-handler-ref="loginSuccessHandler"
			authentication-failure-handler-ref="loginFailureHandler" />
		<!--  엑세스 거부시 설정 -->
		<access-denied-handler ref="accessDeniedHandler" />
		
		<!--  로그아웃 설정 페이지 아직 미구현 -->
		<logout logout-url="/logout" logout-success-url="/login/login"
			invalidate-session="true" />
		
		<csrf disabled="true"/> 
		
	</http>

	<!-- 엑세스 거부 프로세스 객체 (빈) 등록 -->
	<!-- 구현체의 defaultDeniedUrl 에 value 의 값을 대입 -->
	<b:bean id="accessDeniedHandler"
		class="com.yoon.loginHelp.security.CustomAccessDeniedHandler">
		<b:property name="defaultDeniedUrl" value="/login/login"></b:property>
	</b:bean>
	
<!-- 로그인 성공시 작동할 객체(빈) 등록-->
	<b:bean id="loginSuccessHandler"
		class="com.yoon.loginHelp.security.LoginSuccessHandler">
	</b:bean>

<!-- 로그인 실패시 작동할 객체(빈) 등록-->
<!-- 해당 클래스의(구현체의) defaultFailureUrl 에 value 값 대입-->
	<b:bean id="loginFailureHandler"
		class="com.yoon.loginHelp.security.LoginFailureHandler">
		<b:property name="defaultFailureUrl" value="/login/error" />
	</b:bean>

<!-- 로그인 프로세스-->
<!-- 구현체에 기존 security 에서 작동하는 메소드 오버라이드 하여 커스텀화 가능-->
	<authentication-manager>
		<authentication-provider
			ref="customAuthenticationProvider" />  <!-- 로그인 관련 로직 구현 -->
	</authentication-manager>

<!-- 로그인 구현체에 등록한 객체의 빈 등록 -->
 <!-- 로그인 관련 로직 구현 -->
	<b:bean id="customAuthenticationProvider"
		class="com.yoon.loginHelp.security.CustomAuthenticationProvider" />

</b:beans>

 

감사합니다.

728x90
반응형