스프링 시큐리티의 경우 의존성문제로 사용중인 스프링 버전과 잘맞춰야 문제없이 호환이 된다고 한다
내가 사용중인 스프링의 버전은 4.3.8.RELEASE
인데 maven에서 각 버전마다 맞는 스프링버전을 Compile Dependencies에서 확인할 수 있음
그런데 4.3.8버전에 딱맞는 시큐리티버전이 없음.... 그래서 그냥 하위버전인 4.3.5가 적용되는 시큐리티 4.2.2.RELEASE을 사용할 예정
😂
<properties>
에 시큐리티 버전 추가하기<security-version>4.2.2.RELEASE</security-version>
<dependency>
추가하기<!-- Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>${security-version}</version>
</dependency>
webapp>WEB-INF>spring 에 파일 추가하기
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<beans:bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
</beans:beans>
<servlet>
의 <param-value>
로 spring-security 경로 추가하기
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
/WEB-INF/spring/spring-security.xml
</param-value>
여기까지가 security 설정끝 사용해보기
@Inject
BCryptPasswordEncoder passEncoder;
암복호화를 도와줄 bean
vo.setMemberPassword(passEncoder.encode(vo.getMemberPassword()));
if(passEncoder.matches(memberPassword, vo.getMemberPassword())){
...//복호화한 값과 입력받은 값이 일치할 때
}
간단하쥬
그런데..
@Inject
문제가 발생.
No qualifying bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'
뭐지 이 데자뷰는이전에 이미 서버의 시점문제로 잘 설정해둔 bean을 찾을 수 없다는 전적이 있는 프로그램이다.
그래서 내생각엔spring-security.xml
을 서버가 제대로 읽지 못해서 bean이 없다고 뜨는것같다.
일단 임시방편으로 아예 controller단에서 bean을 가져와줬더니 멀쩡히 돌아간다.. 역시 시점문제구만
설정에서 해결하는 깔끔한 방법도 찾아봐야겠다.@Bean BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
먼저 web.xml 설정이 잘못되었음..
servlet-context.xml이 있는 곳이 아니라 root-context.xml
이 있는 param에 설정해야함! 그리고! ,
로 연결해야함!!!!!!!
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml,
/WEB-INF/spring/spring-security.xml
</param-value>
</context-param>
그런데 이렇게 설정해도 nosuchbean어쩌구는 여전히 에러발생함
그래서 @Inject
이 bean을 찾지못했던 문제를 @Bean
으로 해결해뒀는데 대신에
@Resource(name = "bcryptPasswordEncoder")
BCryptPasswordEncoder passEncoder;
@Resource
를 사용해 bean을 명시해주었다.. 보다 깔끔해졌군
@Inject
를 사용하는 방식은 다른컴퓨터로 똑같은 코드로 사용했을때 정상작동했던것을 보아하니 지금 문제가 발생하는 컴퓨터의 문제같아서 여기까지만하고 마무리해야겠다
참고자료