[SpringBoot Security] 3. 시큐리티 회원가입 & 4. 로그인

Jimin·2023년 3월 7일
0
post-thumbnail

LoginForm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr/>
<form action="/login" method="POST">
    <input type="text" name="username" placeholder="Username" /> <br />
    <input type="text" name="password" placeholder="Password" /> <br />
    <button>로그인</button>
</form>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
</body>
</html>

JoinForm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>회원가입 페이지</title>
</head>
<body>
<h1>회원가입 페이지</h1>
<hr/>
<form action="/join" method="POST">
    <input type="text" name="username" placeholder="Username" /> <br />
    <input type="password" name="password" placeholder="Password" /> <br />
    <input type="email" name="email" placeholder="Email" /> <br />
    <button>회원가입</button>
</form>
</body>
</html>


PrincipalDetails 클래스 생성

security가 login 주소 요청이 오면 낚아채서 로그인을 진행시킴
로그인을 진행이 완료가 되면 session을 만들어줌 (security ContextHolder)
오브젝트 => Authentication 타입의 객체
Authentication 안에 user정보가 있어야 함
user 오브젝트 타입 => UserDetails 타입 객체

package com.cos.security1.auth;

import com.cos.security1.model.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;

// Security Session => Authentication 객체만 들어갈 수 있음 => UserDetails(principalDetails) 객체
public class PrincipalDetails implements UserDetails {

    private User user;

    public PrincipalDetails(User user) {
        this.user = user;
    }

    //해당 유저의 권한을 리턴
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> collection = new ArrayList<>();
        collection.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return user.getRole();
            }
        });

        return collection;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {

        // 해당 사이트에서 1년동안 회원이 로그인을 안 하면 휴먼계정 전환
        // 현재 시간 - 로그인시간 -> 1년 초과하면 return false;
        return true;
    }
}

PrincipalDetailsService 클래스 생성

security 설정에서 loginProcessingUrl("/login");
login 요청이 오면 자동으로 UserDetailsService 타임으로 loc 되어있는 loadUserByUsername 함수가 실행

package com.cos.security1.auth;

import com.cos.security1.model.User;
import com.cos.security1.repository.UserRepository;
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 org.springframework.stereotype.Service;

@Service
public class PrincipalDetailsService implements UserDetailsService {

    @Autowired
    UserRepository userRepository;
    // username http form 에서 받아오는 name 무조건 username 동일하게 맞춰줘야함
    // 다르게 하고 싶으면 securityConfig 에서 setUsernameParameter 로 설정
    // security session(Authentication(userDetails))
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User userEntity = userRepository.findByUsername(username);
        if (userEntity != null) {
            return new PrincipalDetails(userEntity);
        }
        return null;
    }
}

✨ 회원가입 결과


⚠️ 주의사항

  • 로그인 form html 파일에서 username과 PrincipalDetailsService의 loadUserByUsername 함수의 파라미터명이 다르면 받아올 수 없음
  • 동일한 변수명을 사용해야함

파라미터 명을 바꾸고 싶다면?

  • SecurityConfig 클래스의 config 함수에
 http.csrf().disable();
 http.authorizeRequests()
 	 ...
     .usernameParameter("username2");
        
  • 되도록이면 바꾸지말고 그대로(username) 쓰기

0개의 댓글