JDBCUserDetailsManager : 스프링 시큐리티가 JDBC를 이용하는 경우에 사용하는 클래스
[참고링크]
create table users
(
username varchar2(50) not null primary key,
password varchar2(50) not null,
enabled char(1) default '1'
);
create table authorities
(
username varchar2(50) not null,
authority varchar2(50) not null,
CONSTRAINT fk_authorities_users foreign key(username) REFERENCES users(username)
);
create unique index ix_auth_username on authorities (username, authority);
insert into users (username, password) values ('user00', 'pw00');
insert into users (username, password) values ('member00', 'pw00');
insert into users (username, password) values ('admin00', 'pw00');
insert into authorities (username, authority) values ('user00', 'ROLE_USER');
insert into authorities (username, authority) values ('member00', 'ROLE_MANAGER');
insert into authorities (username, authority) values ('admin00', 'ROLE_MANAGER');
insert into authorities (username, authority) values ('admin00', 'ROLE_ADMIN');
<!--security-context.xml 추가-->
<security:jdbc-user-service data-source-ref="dataSource"/>
인증/권한이 필요한 URI 호출 시 자동으로 필요한 쿼리들이 호출된다. (패스워드 평문이라 예외 발생 - PasswordEncoder 사용)
// PasswordEncoder 구현
@Override
public String encode(CharSequence rawPassword){}
@Override
public boolean matches(CharSequence rawPassword, String){}
<!--security-context.xml 추가-->
<bean id="customPasswordEncoder" class="org.tmkim.security.CustomNoOpPasswordEncoder" />
<security:password-encoder ref="customPasswordEncoder" />
<security:jdbc-user-service> 태그의 속성 중 authorities-by-username-query 속성과 users-by-username-query 속성에 적당한 쿼리문을 지정하면 JDBC를 이용하는 설정을 그대로 사용할 수 있다.
패스워드를 저장하는 용도로 설계된 해시 함수
<!--security-context.xml 추가, 전 코드 제거 -->
<!--스프링 시큐리티에서 bcypt를 이용한 PasswordEncoder 기본 제공-->
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<security:password-encoder ref="bcryptPasswordEncoder" />
<!--최종적인 형태-->
<!--<security:jdbc-user-service data-source-ref="dataSource" />-->
<security:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT userid, userpw, enabled FROM tbl_member WHERE userid=?"
authorities-by-username-query="SELECT userid, auth FROM tbl_member_auth WHERE userid=?"/>
스프링 시큐리티에서 username이라고 부르는 사용자의 정보만을 이용하기 때문에 실제 프로젝트에서 사용자의 이름이나 이메일등의 자세한 정보를 이용할 경우에는 충분하지 않다.