model - User 만들기
model.User
package com.example.security1.model;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.sql.Timestamp;
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
private String role;
@CreationTimestamp
private Timestamp createDate; // sql Timestamp 사용
}
User Repository
repository.UserRepository
```java
package com.example.security1.repository;
import com.example.security1.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
// CRUD 함수를 JpaRepository가 가지고 있다.
// @Repository라는 애노테이션이 없어도 IoC(빈으로 등록)가 된다. -> JpaRepository를 상속했기 때문이다
public interface UserRepository extends JpaRepository<User, Integer> {
}
```
- CRUD 함수를 JpaRepository가 가지고 있다.
- `@Repository`라는 애노테이션이 없어도 IoC(빈으로 등록)가 된다.
-> **JpaRepository를 상속했기 때문이다**
회원가입 기능 만들기
config.SecurityConfig
→ 보안 관련 모아둔 곳```java
package com.example.security1.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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // 이 파일을 활성화 해주는 코드, 스프링 시큐리티 필터가 스프링 필터 체인에 등록된다.
public class SecurityConfig { // 여기서 스프링 시큐리티 필터는 이 SecurityConfig를 말한다.
**@Bean // 해당 메서드의 리턴되는 객체를 IoC로 등록해준다.
public BCryptPasswordEncoder encodePwd(){
return new BCryptPasswordEncoder();
}**
@Bean
public SecurityFilterChain filterChain(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() // 1차 위처럼 명시된 역할을 가지고 있지 않으면 각 페이지로 접근할 수 없다 -> 403에러
.and()
.formLogin()
.loginPage("/loginForm"); // 2차 여기서는 로그인이 되어있지 않으면 user, manager, admin 페이지에 접근할 시 login 페이지로 연결된다.
// .loginProcessingUrl("/loginProc")
// .defaultSuccessUrl("/");
// .and()
// .oauth2Login()
// .loginPage("/login")
// .userInfoEndpoint();
return http.build();
}
}
```
controller.IndexContoroller
package com.example.security1.controller;
import com.example.security1.model.User;
import com.example.security1.repository.UserRepository;
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 org.springframework.web.bind.annotation.ResponseBody;
@Controller // view를 리턴하겠다
public class IndexController {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@GetMapping({ "", "/" }) // 이건 무슨 문법???
public String index(){
return "index"; // 이 index 파일이 view가 된다.
}
@GetMapping("/user")
public @ResponseBody String user(){
return "user";
}
@GetMapping("/admin")
public @ResponseBody String admin(){
return "admin";
}
@GetMapping("/manager")
public @ResponseBody String manager(){
return "manager";
}
@GetMapping("/loginForm")
public String loginForm(){
return "loginForm";
}
@GetMapping("/joinForm") // 회원가입 페이지
public String joinForm(){
return "joinForm";
}
@PostMapping("/join") // 회원가입
public String join(User user){
System.out.println(user);
user.setRole("ROLE_USER"); // 임시로 강제 역할 넣어줌
// userRepository.save(user); // 회원가입은 잘 되지만 시큐리티로 로그인 할 수 없다 -> 패스워드가 암호화되지 않았기 때문이다.
String rawPassword = user.getPassword(); // 폼을 통해 받은 비밀번호를 변수에 저장
String encPassword = bCryptPasswordEncoder.encode(rawPassword); // 비밀번호를 암호화한다.
user.setPassword(encPassword);// 암호화한 비밀번호를 다시 user 객체의 password 속성에 넣어준다.
userRepository.save(user);
return "redirect:/loginForm"; // redirect를 붙이면 loginForm.html이 아닌 함수 loginForm으로 연결한다.
}
}
결과
—> DB에 잘 user 정보가 들어갔다. + 비밀번호도 암호화되어서 들어갔다.