- scott 계정의 member 회원 테이블과 JDBC를 연동해 스프링 시큐리티 인증/권한 처리를 해보자.
1. Spring Security
- 스프링 시큐리티에는 기본적으로 제공되는 사용자(회원), 권한 테이블이 있으며, 여기에는 이름이 정해져 있다.(users, authorities)
- users: username(아이디, PK), password(비밀번호), enabled(사용여부)
- authorities: username(FK), authority
- 기본테이블을 사용해도 되지만, 대부분의 경우 사용자가 정의한 테이블을 사용하기에 이 게시글에서는 사용자 정의 member 테이블을 연동해보고자 한다.
1. 테이블 생성
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" ;
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" ;
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에 등록해 줄 것이다.
- security-context.xml에 PasswordEncoder bean을 등록
<bean id= "bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
- authentication-manager 안에 password-encoder 등록해주자
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder ref="bCryptPasswordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
3. joinController 수정
- 기존에 만들어놓은 회원가입 controller로 이용해서 회원가입 시 암호화 되도록 PasswordEncoder를 연결해주자.
@Setter(onMethod=@__({@Autowired}))
private PasswordEncoder passwordEncoder;
@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";
}
4. 회원가입
- 계정 추가
- member 회원 가입을 3개 정도 시켜보자. 비밀번호를 동일하게 '1234'로 맞추어도 암호화에 의해 다르게 표시되는 것을 알 수 있다.
- 권한 추가
- 각 회원별 권한을 입력 폼이 없기에 수동으로 권한을 부여해주자.
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 = ? "
/>
<security:password-encoder ref="bCryptPasswordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
- 이제 DB에 가입된 회원 정보와 잘 연동되는 것을 확인할 수 있다.