-
0920. UserDetail카테고리 없음 2023. 9. 21. 18:35
UserDetail
사용자 정보를 데이터베이스에서 처리하기 위해 UserDetail 사용하기
하나의 유저가 여러 권한을 가지고 있다는 뜻
primary key(username, auth),
jsp에서 로그인한 사용자 정보 보여주기
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
principal 본인(주체)
로그인한 당사자를 나타내는 단어
principal 파트가 (로그인 안 해서) null이면 에러가 뜬다.
로그인 url 에서 직접 로그인해서 들어가야 한다.
디비버 DB 추가
drop table if exists tbl_member; create table tbl_member( username varchar(50) primary key, password varchar(128) not null, email varchar(50) not null, reg_date datetime default now(), update_date datetime default now() ); drop table if exists tbl_member_auth; create table tbl_member_auth( username varchar(50) not null, auth varchar(50) not null, primary key(username, auth), constraint fk_authorities_users foreign key (username) references tbl_member(username) ); select distinct writer from tbl_board order by writer; insert into tbl_member(username, password, email) values ('admin', '1234', 'admin@galapgos.org'), ('user00', '1234', 'user00@galapgos.org'), ('newbie', '1234', 'newbie@galapgos.org'), ('newbie0', '1234', 'newbie0@galapgos.org'), ('newbie1', '1234', 'newbie1@galapgos.org'), ('newbie2', '1234', 'newbie2@galapgos.org'), ('newbie3', '1234', 'newbie3@galapgos.org'), ('newbie4', '1234', 'newbie4@galapgos.org'); select * from tbl_member; update tbl_member set password='$2a$10$3Qq8IXg9dvoxV6Muff2qj.PVHrLc60W3gjjpElPizCxli30DEfHc2'; insert into tbl_member_auth(username, auth) values ('admin','ROLE_ADMIN'), ('admin','ROLE_MANAGER'), ('user00','ROLE_MANAGER'), ('newbie','ROLE_USER'), ('newbie1','ROLE_USER'), ('newbie2','ROLE_USER'), ('newbie3','ROLE_USER'), ('newbie4','ROLE_USER'); select * from tbl_member_auth order by username; -- left outer join (username) select * from tbl_member m left outer join tbl_member_auth a on m.username = a.username order by m.username;
1:N의 관계
Member(1) : Auth(N)
Left outer join
MemberMapper.xml
<id property="username" column="username" />
=> username 파트가 같은 값이면 해당 줄은 모두 하나의 줄로 처리한다.
<collection property="authList" resultMap="authMap" />
=> 해당 인스턴스를 List에 담아라
resultMap으로 맵핑하지 않으면 첫 번째 줄만 맵핑이 되어서 List처리도 안 되고 원하는 대로 주루루 안 나온다.
join의 적용 예시
1 : N
- (상세보기 파트) 한 개의 게시글에 첨부파일 여러 개 첨부하기
- 게시글에 달린 댓글들
DB에서 UserDetail 사용하기
MemberMapper 에서 가져올 것
UserDetailsService 인터페이스 사용하기
*메서드 1개 있음
@Autowired로 MemberMapper 추가
UsernameNotFoundException
로그인 시도할 때 예외가 발생한다. security가 이 예외를 확인 : UserDetails에 있는 패스워드가 전달받은 패스워드가 일치하면(=인코더의 매치) return. 일치하지 않으면 redirect
info로 하면 걸러질 수 있어서 warn으로 로그레벨을 올려 username이 잘 전달되는지 확인한다.
package org.galapagos.security; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; import org.galapagos.mapper.MemberMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import lombok.extern.log4j.Log4j; @Log4j public class CustomUserDetailsService implements UserDetailsService { @Autowired private MemberMapper mapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.warn("Load User By Username: " + username); return null; } }
@Autowired private DataSource dataSource;
RootConfig의 Hikari 커넥션 풀을 쓰겠다.
Bean으로 등록해서 정의
auth : UserDetailsService DB를 쓰겠다. 비밀번호 인코더로 쓸 건 passwordEncoder이다.
메서드 : loadUserByUsername
🐲
자동로그인 설정
remember - me
https://marchislike.tistory.com/69
remember-me를 위한 클래스와 db를 따로 만들자
create table persistent_logins( series varchar(64) primary key, username varchar(64) not null, token varchar(64) not null, last_used timestamp not null );
login.jsp
<label> <input type="checkbox" name="remember-me"> 로그인유지 </label>
로그인 유지 체크하고 로그인하기
쿠키에 만료기한이 부여된 remember-me가 보인다.
ComponentScan을 하지 않아서 발생한 500 오류!! ❗
RootConfig에서 service가 동작하도록 수정
이제 회원정보를 DB에 등록할 땐
Mapper xml에 insert 작업 (member, auth 두 번)
파일업로드 기능도 추가하장