<!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>
<!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>
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;
}
}
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;
}
}
✨ 회원가입 결과
username
과 PrincipalDetailsService의 loadUserByUsername 함수의 파라미터명이 다르면 받아올 수 없음 http.csrf().disable();
http.authorizeRequests()
...
.usernameParameter("username2");