Spring으로 JDBC 연동하기

tabi·2023년 7월 5일
0

Spring

목록 보기
8/15
post-thumbnail
  • scott 계정의 member 회원 테이블과 JDBC를 연동해 스프링 시큐리티 인증/권한 처리를 해보자.

1. Spring Security

  • 스프링 시큐리티에는 기본적으로 제공되는 사용자(회원), 권한 테이블이 있으며, 여기에는 이름이 정해져 있다.(users, authorities)
    • users: username(아이디, PK), password(비밀번호), enabled(사용여부)
    • authorities: username(FK), authority
  • 기본테이블을 사용해도 되지만, 대부분의 경우 사용자가 정의한 테이블을 사용하기에 이 게시글에서는 사용자 정의 member 테이블을 연동해보고자 한다.

1. 테이블 생성

  • 테이블을 두 개 만들어보자.

member 테이블

--------------------------------------------------------
--  DDL for Table MEMBER
--------------------------------------------------------

  CREATE TABLE "SCOTT"."MEMBER" 
   (	"ID" VARCHAR2(50 BYTE), 
	"PWD" VARCHAR2(100 BYTE), 
	"NAME" VARCHAR2(50 BYTE), 
	"GENDER" VARCHAR2(10 BYTE), 
	"BIRTH" VARCHAR2(10 BYTE), 
	"IS_LUNAR" VARCHAR2(10 BYTE), 
	"CPHONE" VARCHAR2(15 BYTE), 
	"EMAIL" VARCHAR2(200 BYTE), 
	"HABIT" VARCHAR2(200 BYTE), 
	"REGDATE" DATE, 
	"POINT" NUMBER(10,0) DEFAULT (0), 
	"ENABLED" CHAR(1 BYTE) DEFAULT '1'
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
--------------------------------------------------------
--  DDL for Index PK_MEMBER_ID
--------------------------------------------------------

  CREATE UNIQUE INDEX "SCOTT"."PK_MEMBER_ID" ON "SCOTT"."MEMBER" ("ID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;
--------------------------------------------------------
--  Constraints for Table MEMBER
--------------------------------------------------------

  ALTER TABLE "SCOTT"."MEMBER" ADD CONSTRAINT "PK_MEMBER_ID" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE;

member_authorities 테이블

CREATE TABLE member_authorities(
    username varchar2(50) not null
    , authority varchar2(50) not null
    , constraint fk_member_authorities_username
        FOREIGN KEY(username)
        REFERENCES member(id)
);

2. PasswordEncoder

  • 따로 PasswordEncoder를 사용하지 않고 {noop}으로 임시적으로 처리하는 것도 가능하지만, Spring이 제공하는 기본적인 PasswordEncoder를 사용해보자.
  • security-context.xml에 등록해 줄 것이다.
  1. security-context.xml에 PasswordEncoder bean을 등록
<bean id= "bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
  1. authentication-manager 안에 password-encoder 등록해주자
<security:authentication-manager>
	<security:authentication-provider>
	<security:password-encoder ref="bCryptPasswordEncoder"/>
	</security:authentication-provider>
</security:authentication-manager>

3. joinController 수정

  1. 기존에 만들어놓은 회원가입 controller로 이용해서 회원가입 시 암호화 되도록 PasswordEncoder를 연결해주자.
	@Setter(onMethod=@__({@Autowired})) //PasswordEncoder 연결
	private PasswordEncoder passwordEncoder;
	//회원가입 후 DB에 입력 후 home으로 이동
	@PostMapping("/join.htm")
	public String join(MemberVO member) throws Exception{
		String pwd = member.getPwd();
		member.setPwd(this.passwordEncoder.encode(pwd));
		this.memberDao.insert(member);
		return "redirect:../index.htm"; //redirect: == response.sendRedirect()
	}

4. 회원가입

  1. 계정 추가
  • member 회원 가입을 3개 정도 시켜보자. 비밀번호를 동일하게 '1234'로 맞추어도 암호화에 의해 다르게 표시되는 것을 알 수 있다.
  1. 권한 추가
  • 각 회원별 권한을 입력 폼이 없기에 수동으로 권한을 부여해주자.
INSERT INTO member_authorities VALUES ( 'admin' , 'ROLE_MANAGER' );
      INSERT INTO member_authorities VALUES ( 'admin' , 'ROLE_ADMIN' );
      INSERT INTO member_authorities VALUES ( 'admin' , 'ROLE_USER' );
      INSERT INTO member_authorities VALUES ( 'hj' , 'ROLE_MANAGER' );
      INSERT INTO member_authorities VALUES ( 'hj' , 'ROLE_USER' );
      INSERT INTO member_authorities VALUES ( 'hong' , 'ROLE_USER' );
      COMMIT;

5. JDBC 연결

  • security-context.xml에 jdbc-user-service 태그로 연결해준다.
	<security:authentication-manager>
		<security:authentication-provider>
				<security:jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="SELECT id AS username ,pwd AS password ,enabled FROM MEMBER WHERE id= ? "
				authorities-by-username-query="SELECT username AS userid, authority AS auth FROM member_authorities WHERE username = ?  "
				/> <!-- JDBC 연결 -->
			<security:password-encoder ref="bCryptPasswordEncoder"/>
		</security:authentication-provider>
	</security:authentication-manager>
  • 이제 DB에 가입된 회원 정보와 잘 연동되는 것을 확인할 수 있다.
profile
개발 공부중

0개의 댓글