ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에 담아라

     

    MemberMapper.xml

     

    resultMap으로 맵핑하지 않으면 첫 번째 줄만 맵핑이 되어서 List처리도 안 되고 원하는 대로 주루루 안 나온다.

    join

     

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

    persistent_logins

    login.jsp 

    			<label>
    				<input type="checkbox" name="remember-me"> 로그인유지
    			</label>

     

    로그인 유지 체크하고 로그인하기

    쿠키에 만료기한이 부여된 remember-me가 보인다.

     

     

     

     

     

    난리남


     

    ComponentScan을 하지 않아서 발생한 500 오류!! ❗

    RootConfig에서 service가 동작하도록 수정

    이 녀석 autowired가 scan이 안 됨
    수정!

     

    이제 회원정보를 DB에 등록할 땐

    Mapper xml에 insert 작업 (member, auth 두 번)

     

    파일업로드 기능도 추가하장

Designed by Tistory.