1. Local Tomcat 설정

1.1 Tomcat 폴더의 server.xml 설정

1.1.1 GlobalNamingResources 추가

driverClassName엔 사용하는 드라이버를 입력하면된다.

오라클일 경우 : oracle.jdbc.driver.OracleDriver 등.

global과, name 변수에는 똑같은 이름을 넣어준다. 

url이 오라클일 경우 : jdbc:oracle:thin:@IP:PORT:스키마이름

<GlobalNamingResources>

...

<Resource 
auth="Container" 
driverClassName="com.mysql.jdbc.Driver" // mysql, oracle, mariadb, tibero 등등 드라이버입력 
global="global과 name 똑같은 이름" 
maxActive="8"
maxIdle="8" 
maxWait="-1" 
minIdle="0" 
name="global과 name 똑같은 이름" 
password="DB패스워드" 
type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/myDB" username="DB아이디"/>

</GlobalNamingResources>

 

1.2 Tomcat 폴더의 context.xml 설정

1.2.1 ResourceLink 추가

name과 global 변수엔 server.xml에서 설정한 name,과 global 이름을 똑같이 넣는다.

<Context>

...
<ResourceLink name="위에 설정한 name, global이름과 동일" global="위에 설정한 name, global이름과 동일"
		auth="Container" type="javax.sql.DataSource" />

</Context

 

2. 개발 프로젝트(Eclipse 설정)

2.1 xml 파일에 설정

2.1.1 root-context.xml or context-datasource.xml

root-context.xml 또는 context-datasource.xml에 기존 DB접근하는 설정들을 지우거나 주석처리하고 아래의 코드를 추가한다.

또한, <value>에는 java:comp/env/jdbc/를 붙이고 server.xml에서 설정한 name, global이름과 동일하게 작성한다.

ex) server.xml에서 설정한 이름이 test라면 - java:comp/env/jdbc/test 

<bean id="dataSource"
		class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>java:comp/env/jdbc/name,global 이름과 동일</value>
		</property>
</bean>

 

3. 에러 발생 시 처리

3.1 DB Connection 에러

3.1.1 DB connector lib 가 없을 경우

만약 실행 시 connector에러가 발생한다면, Tomcat 폴더에 각 DB의 connector 라이브러리를 추가한다.

톰캣의 lib폴더에 접근한다.

경로 - apache-tomcat-8.5.59\lib

MySQL을 사용한다면 아래의 jar 파일을 톰캣의 lib폴더에 넣는다.

MySQL - mysql-connector-java.jar

 

 

3.2 UserDatabaseRealm 에러

3.2.1 org.apache.catalina.realm.UserDatabaseRealm Start 에러

만약 시작시 org.apache.catalina.realm.UserDatabaseRealm Start 에러가 발생한다면

Tomcat의 server.xml에 Realm부분의 className="org.apache.catalina.realm.UserDatabaseRealm" 을 아래와 같이 주석 처리한다.

<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" -->
<!-- resourceName="UserDatabase" /> -->
</Realm>

 

'Develop > Spring' 카테고리의 다른 글

Spring Tomcat JNDI 설정  (0) 2020.11.17
Spring Security Custom Filter  (0) 2020.11.09
Spring security 로그인(DB에 있는 아이디 조회)  (0) 2019.11.02
Spring Mybatis + MariaDB(HikariCP) 설정  (0) 2019.10.24
Spring 3 에서 4로 migration  (0) 2019.10.22

1. Spring Security Custom Filter

Spring Security 에 Custom Filter를 추가할 수 있다.

1.1 GenericFilterBean

기본 로그인 세팅 후 클래스를 생성하여 GenericFilterBean을 상속 받은 뒤 security-context.xml에 설정해주면 된다.

public class CustomFilter extends GenericFilterBean {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub

		chain.doFilter(request, response);
		
	}

}

 

1.2 security-context.xml

security-context.xml에 생성한 filter를 추가해 주면 된다.

	<security:http auto-config='true' use-expressions="true">
		<security:csrf disabled="true" />
		<security:intercept-url  />
		<security:form-login />
		<security:logout  />

		<security:custom-filter before="FORM_LOGIN_FILTER" ref="customFilter" />
	</security:http>

	<bean id="customFilter"
		class="com.test.app.filter.CustomFilter" />

 

before 대신 after, position을 사용할 수 있다. ref 에는 생성한 filter 클래스를 입력한다.

(현재 예제 : FORM_LOGIN_FILTER - 로그인 폼 인증 처리)

before - FORM_LOGIN_FILTER 인증 전에 생성한 filter 호출

after - FORM_LOGIN_FILTER 인증 후에 생성한 filter 호출

position - FORM_LOGIN_FILTER 대체를 생성한 filter로 대체 함.

position을 사용할 경우 security auto-config를 사용하지 않으므로 auto-config를 false로 해야 한다.

(auto-config : Automatically registers a login form, BASIC authentication, anonymous authentication, logout services, remember-me and servlet-api-integration. If set to "true", all of these capabilities are added (although you can still customize the configuration of each by providing the respective element). If unspecified, defaults to "false".)

 

2. Standard Filter Aliases and Ordering

FORM_LOGIN_FILTER 대신에 사용할 수 있는 항목들은 아래와 같다.

CHANNEL_FILTER ChannelProcessingFilter http/intercept-url@requires-channel
SECURITY_CONTEXT_FILTER SecurityContextPersistenceFilter http
CONCURRENT_SESSION_FILTER ConcurrentSessionFilter session-management/concurrency-control
LOGOUT_FILTER LogoutFilter http/logout
X509_FILTER X509AuthenticationFilter http/x509
PRE_AUTH_FILTER AstractPreAuthenticatedProcessingFilter Subclasses N/A
CAS_FILTER CasAuthenticationFilter N/A
FORM_LOGIN_FILTER UsernamePasswordAuthenticationFilter http/form-login
BASIC_AUTH_FILTER BasicAuthenticationFilter http/http-basic
SERVLET_API_SUPPORT_FILTER SecurityContextHolderAwareRequestFilter http/@servlet-api-provision
JAAS_API_SUPPORT_FILTER JaasApiIntegrationFilter http/@jaas-api-provision
REMEMBER_ME_FILTER RememberMeAuthenticationFilter http/remember-me
ANONYMOUS_FILTER AnonymousAuthenticationFilter http/anonymous
SESSION_MANAGEMENT_FILTER SessionManagementFilter session-management
EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter http
FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor http
SWITCH_USER_FILTER SwitchUserFilter N/A

 

참고 :

www.baeldung.com/spring-security-custom-filter

docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-custom-filters

'Develop > Spring' 카테고리의 다른 글

Spring Tomcat JNDI 설정  (0) 2020.11.17
Spring Security Custom Filter  (0) 2020.11.09
Spring security 로그인(DB에 있는 아이디 조회)  (0) 2019.11.02
Spring Mybatis + MariaDB(HikariCP) 설정  (0) 2019.10.24
Spring 3 에서 4로 migration  (0) 2019.10.22

1. 먼저 필요한 Maven을 설치합니다.

아래의 메이븐저장소에 들어가서 spring-security-core, spring-security-web, spring-security-config, pring-security-taglibs 검색하여 pom.xml에 추가합니다.

https://mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

Reactivewizard Binding Last Release on Oct 31, 2019

mvnrepository.com

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

 

2. web.xml 에 들어가 아래와 같이 추가합니다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml
		/WEB-INF/spring/security-context.xml
	</param-value>
</context-param>

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

 

3. 로그인 창을 하나 만듭니다.

파일이름은 login.jsp로 만들었습니다.

<!-- login.jsp -->
<form action="loginProcess" method="post">
<input type="text" name="userId">
<input type="password" name="userPw">
<input type="submit" value="ok">
</form>

 

4. /WEB-INF/spring 폴더 밑에 security-context.xml을 생성하고 아래와 같이 설정합니다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

	xmlns:security="http://www.springframework.org/schema/security"

	xmlns:context="http://www.springframework.org/schema/context"

	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd

        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


	<security:http auto-config='true' use-expressions="true">
		<security:csrf disabled="true" />
        
		<security:intercept-url pattern="/login"
			access="permitAll" />

		<security:intercept-url pattern="/**"
			access="isAuthenticated()" />

		<security:form-login login-page="/login"
			username-parameter="userId" password-parameter="userPw"
			login-processing-url="/loginProcess" default-target-url="/test"
			authentication-failure-url="/login?failure"
			always-use-default-target='true' />
            
		<security:logout invalidate-session="true"
			logout-url="/logout" logout-success-url="/login?logout" />
	</security:http>


</beans>

대충 설명하자면 /login 주소는 권한이없어도 접속을 허용하겠다는 뜻이고

그 외 주소는 로그인 인증이 되어야 접속할 수 있도록 하겠다는 뜻입니다.

그 외를 알고싶으시면 use-expressions(SpEL) 을 찾아보시면 됩니다.

그리고 3번에서 만든 로그인페이지를 등록하고 3번에서 만든 각각 id, passwordname들을 지정합니다.

또한 login-proccessing-url에 3번에서 만든 action 의 주소를 입력합니다. 여기서는 loginProcess로 되어있지만 아무거나 해도됩니다.

login-proccessing-url은 로그인 처리를 해주는 url인데 이름만 정해주면 security 측에서 알아서 만들어주는 url으로써  이름만 정하면 따로 저희가 할 일은 없이 spring security가 로그인처리를 진행 해줍니다.

default-target-url은 로그인성공시 접속할 주소를 입력합니다.

auauthentication-failure-url 은 로그인 실패시 처리할 주소를 입력하시면 됩니다.
always-use-default-target='true' 로그인 성공후 default-target-url에 설정한 곳으로 갈지 선택하는 것입니다.

invalidate-session="true" logout-url="/logout" logout-success-url="/login?logout" 로그아웃 입니다. 로그아웃 경로를 저장하고 로그아웃 성공시 돌아갈 경로를 저장해주면 로그아웃이 됩니다. 이 로그아웃url 또한 security 측에서 알아서 만들어주는 url으로써 여기서 이름만 정하면 따로 저희가 만들일 없이 spring security가 알아서 로그아웃을 진행해 줍니다.

 

5. 그리고 위의 security-context.xml 안에 로그아웃 밑에 바로 아래와 같이 추가합니다.

	<security:authentication-manager>

		<security:authentication-provider

			user-service-ref="loginService">

			<security:password-encoder

				ref="bcryptPasswordEncoder" />

		</security:authentication-provider>

	</security:authentication-manager>


	<bean id="loginService" class="net.test.test.service.testService" />

	<bean id="bcryptPasswordEncoder"

		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

로그인 진행시 아이디를 가지고 비밀번호를 비교할 서비스클래스를 정하는 것입니다.

또한 데이터베이스에 비빌번호가 bcrypt로 저장되어 있을 경우 비밀번호 비교시 bcrypt로 비밀번호를 비교하기 위해 설정해줍니다.

 

6. 위에서 아이디를 가지고 비밀번호를 비교할 서비스를 생성합니다.

여기서 DB베이스에서 회원정보를 불러와 암호화되어있는 비밀번호를 비교하게됩니다.

public class testService implements UserDetailsService {

	@Autowired
	TestDAO testDAO;

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		// TODO Auto-generated method stub
		loginVO userVO = testDAO.selectLogin(username);

		if (userVO == null) {
			throw new UsernameNotFoundException("No user found with id");

		}

		Collection<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>();

		roles.add(new SimpleGrantedAuthority("ROLE_USER"));

		UserDetails user = new User(userVO.getId(), userVO.getPassword(), roles);
		return user;

	}

}

UserDetailsService라는 것을 implements합니다.

그리고 username을 통해 데이터베이스에서 회원정보를 가져오고

roles에 유저를 선택한 다음 UserDetails를 생성하여 return 만 해주면 Spring Security가 알아서 비밀번호를 데이터베이스에 있는 것과 form에서 넘어온 비밀번호를 비교하여 맞으면 로그인성공해주고 아니면 로그인실패를 해줍니다.(그냥 조회만 했을 뿐인데 알아서 다 해줌)

 

이렇게 bean설정과 UserDetails만 설정하면 로그인form에서 아이디하고 비밀번호를 전달한 뒤 아이디만 조회했을 뿐인데 spring security가 로그인처리까지 다 진행해줍니다.

다음 controller에서 Authentication을 통해 로그인한 정보(아이디)를 가져와 사용할 수 있습니다.

'Develop > Spring' 카테고리의 다른 글

Spring Tomcat JNDI 설정  (0) 2020.11.17
Spring Security Custom Filter  (0) 2020.11.09
Spring security 로그인(DB에 있는 아이디 조회)  (0) 2019.11.02
Spring Mybatis + MariaDB(HikariCP) 설정  (0) 2019.10.24
Spring 3 에서 4로 migration  (0) 2019.10.22

1. 먼저 필요한 Maven을 설치합니다.

아래의 메이븐저장소에 들어가서 

mybatis, mybatis-spring, spring-jdbc, mariadb, hikaricp를 검색하여 maven을 pom.xml dependency에 추가합니다.

https://mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

AWS Java SDK :: Regions Last Release on Oct 18, 2019

mvnrepository.com

예시)

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.2</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
			<version>2.5.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.4.0</version>
		</dependency>

 

2.  webapp/WEB-INF/spring/ 에 있는 root-context.xml에 들어갑니다.

Namespaces에 들어가여 아래와 같이 체크해주고 저장합니다.

 

3. 다시 root-context에서 Source에 들어가 아래와 같이 입력해줍니다.

	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="org.mariadb.jdbc.Driver"></property>
		<property name="jdbcUrl"
			value="jdbc:mariadb://127.0.0.1:3306/spring?useSSL=false&amp;serverTimezone=Asia/Seoul"></property>
		<property name="username" value="DB계정입력"></property>
		<property name="password" value="DB비밀번호입력"></property>
	</bean>

	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean> 

	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations"
			value="classpath:mappers/**/*.xml"></property>
	</bean>

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

		<property name="basePackage" value="net.test.test.dao" />
	</bean>

간단한 설명을하자면 먼저 아래의 xml 코드는 DB커넥션풀을 hikariCP를 사용하고 DB에 연결하겠다는 뜻입니다.

	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="org.mariadb.jdbc.Driver"></property>
		<property name="jdbcUrl"
			value="jdbc:mariadb://127.0.0.1:3306/spring?useSSL=false&amp;serverTimezone=Asia/Seoul"></property>
		<property name="username" value="DB계정입력"></property>
		<property name="password" value="DB비밀번호입력"></property>
	</bean>

	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean> 

아래의 xml코드는 sqlSession을 연결할 수 있게하며, 데이터베이스 쿼리를 갖고있는 mapper들을 연결시켜주겠다는 의미입니다.(아래에 작성되어있음.)

<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations"
			value="classpath:mappers/**/*.xml"></property>
	</bean>

아래는 mapper에 작성되어있는 쿼리들을 불러오는 dao들을 스캔하는 의미입니다. value는 꼭 패키지에 맞춰 쓸 수 있도록 합니다.

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

		<property name="basePackage" value="net.test.test.dao" />
	</bean>

 

4. 아래와 같이 패키지와 controller 및 dao를 작성합니다.

임의로 작성한것입니다. 꼭 이렇게 안하셔도됩니다.

DAO파일은 인터페이스로 생성해야합니다.

 

5. 이제 쿼리를 작성할 mapper를 생성합니다. 

아래의 resources/ 폴더 밑에 mappers와 그 아래 xml 파일을 생성합니다.

xml파일에 아래와 같이입력합니다.

mapper의 namespace는 아까 작성한 TestDAO의 경로와 똑같이 해야합니다.

여기서 DB쿼리들을 작성합니다. DB접속이 잘 되었는지 확인만 하기위해 현재 시간을 나타내주는 쿼리를 작성해봅니다.

6. TestDAO를 열어 아래와 같이 TestMapper.xml에서 작성한 selectNow함수를 작성해줍니다.

그리고는 작성한 controller 에 들어갑니다.(현재 글에는 TestController입니다.)

아래와 같이 작성합니다.

MVC패턴을 이용하는 Spring에서는 아래와같이 controller에서 불러오면 안되는 것은 아니지만 패턴의 규칙이 있기때문에 controller에서 직접 불러오는 것을 추천드리지는 않지만, 테스트목적이라 여기서는 불러서 사용합니다.

 

이것을 실행하여 localhost:8080/test에 접속하면 db에서 불러온 현재 시간이 console창에  나타나는 것을 볼 수 있습니다.

'Develop > Spring' 카테고리의 다른 글

Spring Tomcat JNDI 설정  (0) 2020.11.17
Spring Security Custom Filter  (0) 2020.11.09
Spring security 로그인(DB에 있는 아이디 조회)  (0) 2019.11.02
Spring Mybatis + MariaDB(HikariCP) 설정  (0) 2019.10.24
Spring 3 에서 4로 migration  (0) 2019.10.22

1. 먼저 아래에 접속해 STS 3.9.X버전을 설치한다.

https://spring.io/tools3/sts/all

 

Spring Tool Suite™ 3 (STS 3) Download page

Use one of the links below to download an all-in-one distribution for your platform. Choose either a native installer or simple archive, they contain equivalent functionality

spring.io

그리고 최신버전 또는 옛날

버전을 설치한다.

2. 프로젝트 생성에서 MVC PROJECT를 설치한다.

3. 프로젝트의 pom.xml에 들어가 밑줄친 부분을 1.8버전, 4.3.x버전으로 변경한다

아래와 같이 변경

4. maven-compiler-plugin을 1.8버전으로 변경한다

아래와 같이 변경한다

 

전부 변경하였다면 저장해준다.

5. 프로젝트 우클릭 후 Properties를 클릭한다.

Project Facets에서 1.6으로 되어있는 Java버전을 1.8로 변경한다

Dynamic Web Module 또한 3.0으로 변경하여도 상관없으나 만약 변경한다면 프로젝트의 web.xml파일에 들어가서

web.xml 파일 상단에 web-app version="2.5" 버전을 web-app version="3.0"으로 같이 변경해준다.

6. Java Compiler 에 접속하여 버전을 1.8버전으로 변경해준다

만약 변경되어 있지 않거나 없다면 아래 사진의 파란색부분인 Java Build Path을 클릭한다.

Java Build Path에서 Add Library를 클릭해준다.

JRE System Library를 선택한다.

Installed JREs를 클릭한다.

Add를 클릭한다.

Standard VM을 선택한다.

Directory를 클릭하여 Java 1.8버전이 있는 폴더를 선택하여 Apply버튼을 눌러주어 1.8버전을 선택하고 다시 6번의 Proejct Facets에 들어가 1.8로 수정해주면 된다.

7. 프로젝트 우클릭 후 Update Project를 해준 뒤 실행해보면 잘 실행이된다.

 

참고로 pom.xml에 있는 servlet-api 버전이나, jsp, jstl 버전을 최신버전으로 변경해주어도 좋다

'Develop > Spring' 카테고리의 다른 글

Spring Tomcat JNDI 설정  (0) 2020.11.17
Spring Security Custom Filter  (0) 2020.11.09
Spring security 로그인(DB에 있는 아이디 조회)  (0) 2019.11.02
Spring Mybatis + MariaDB(HikariCP) 설정  (0) 2019.10.24
Spring 3 에서 4로 migration  (0) 2019.10.22

+ Recent posts