1. 로그인, 회원가입 폼 만들기
templates 아래에 loginForm.html을 만든다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr>
<form>
<input type="text" name="username" placeholder="Username"> <br>
<input type="password" name="password" placeholder="Password"> <br>
<button>로그인</button>
</form>
</body>
</html>
joinForm.html
<!DOCTYPE html>
<html>
<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>
2. User 정보를 저장할 User 오브젝트를 만든다.
package com.pure.security.model;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.CreationTimestamp;
import lombok.Data;
@Data
@Entity
public class User {
@Id // primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
private String role;
@CreationTimestamp
private Timestamp createDate;
}
Id와 GeneratedValue는 아래의 설명이 잘 되어 있다.
https://juntcom.tistory.com/156
com.pure.security.repository 아래에 UserRepository.java도 만들어준다.
package com.pure.security.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.pure.security.model.User;
// @Repository 없어도 IoC됨. JpaRepostory를 상속받았기 때문
public interface UserRepository extends JpaRepository<User, Integer> {
}
3. 컨트롤러 매핑도 수정해준다.
package com.pure.security.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.pure.security.model.User;
import com.pure.security.repository.UserRepository;
@Controller // View를 return 하겠다는 뜻.
public class IndexController {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@GetMapping({"","/"})
public String index() {
//mustache 기본폴더 src/main/resources/
//viewResolver 설정: templates(prefix) .mustache(suffix) (기본 설정이기 때문에 .yml에서 생략가능)
return "index"; //경로 : src/main/resources/templates/index.mustache
}
@GetMapping("/user")
public String user() {
return "user";
}
@GetMapping("/admin")
public String admin() {
return "admin";
}
@GetMapping("/manager")
public String manager() {
return "manager";
}
@GetMapping("/loginForm")
public String loginForm() {
return "loginForm";
}
@PostMapping("/join")
public String join(User user) {
System.out.println(user);
user.setRole("ROLE_USER");
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
user.setPassword(encPassword);
userRepository.save(user);
return "redirect:/loginForm";
}
@GetMapping("/joinForm")
public String joinForm() {
return "joinForm";
}
}
join 함수의 return에 redirect:/ 를 왜 쓰는지 몰랐는데, 그냥 loginForm으로 주소를 돌려주는 거랑 다르게 redirect를 쓰면 모델 데이터를 넘길 수 있다고 함.
4. SecurityConfig 수정
비밀번호 암호화를 위해 BCryptPasswordEncoder 빈에 등록.
package com.pure.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity //스프링 시큐리티 필터 등록
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
};
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll() //위의 세 주소 이외의 나머지는 로그인 없이 접근 가능
.and()
.formLogin()
.loginPage("/loginForm"); // "/login"주소가 올 때는 로그인 페이지 보여주기
}
}
여기까지 하면 회원가입을 할 수 있게 된다.
'취업 준비 > Spring security' 카테고리의 다른 글
6. OAuth2 구글 로그인 (0) | 2022.02.17 |
---|---|
5. 시큐리티 권한처리 (0) | 2022.02.16 |
4. 로그인 만들기 (0) | 2022.02.16 |
2. 시큐리티 기본설정 (0) | 2022.02.10 |
1. 프로젝트 생성 및 설정 (0) | 2022.02.10 |