4. 시큐리티 회원가입
by 볼빵빵오춘기IndexController
@GetMapping("/login") public String login(){ return "loginForm"; }
loginForm.html
<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>
더보기

실행결과

위의 페이지를 보면 로그인페이지가 나오는 것을 확인가능하나 회원이 없기때문에 당장은 로그인이 어렵다.
User
@Entity @Data @Table(name = "SECURITY1_USER") 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; }
더보기

실행 결과
Database에 SECURITY1_USER table이 만들어진것을 확인할 수 있다.
※ 강의에서는 @Table() 은 없지만 개인적으로 구분하기 위해 테이블명을 다른 것으로 씀.@Table() 로 만들지 않으면 테이블이름을 User로 될 것이다.

IndexController
- 기존에 login() → loginForm() 으로 변경, /login” → “/loginForm”으로 변경, return값도 “login” → “loginForm” 변경했다.
- joinForm 추가했다.
- joinProc() 은 삭제했다.
@GetMapping("/loginForm") public String loginForm(){ return "loginForm"; } @GetMapping("/joinForm") public String joinForm(){ return "joinForm"; } @PostMapping("/join") public @Response String join(){ return "join"; }
SecurityConfig
.loginPage("/login"); → .loginPage("/loginForm"); 으로 변경했다.
why? 위에 IndexController.java 에서 login하려고 들어가는 페이지를 변경했기 때문이다.
@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"); }
loginForm.html
회원가입 Form으로 가는 a 링크 추가한다.
<form> <input type="text" name="username" placeholder="username"><br> <input type="password" name="password" placeholder="password"><br> <button>로그인</button> </form> <a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
joinFrom.html
loginForm.html 을 파일 복사 후 이름을 joinForm.html으로 변경 후 코드 수정한다.
<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>
IndexController
파라미터로 User 객체 담아온다. (→ 잘 담아져서 왔나 Sysout으로 확인해보기)
@PostMapping("/join") public @Response String join(User user){ System.out.println(user); return "join"; }
UserRepository
※ 간단하게 하기위해서 따로 service 만들지 않고 repository만 만들었다.
// CRUD 함수를 JpaRepository가 들고 있음 // @Repository라는 어노테이션이 없어도 IoC가 된다. why? JpaRepository을 상속 받았기 때문에 public interface UserRepository extends JpaRepository<User, Integer> { }
IndexController
userRepository.save(user); 로 하면 회원가입은 잘되지만 시큐리티 로그인 할 수 없다.
why? 이유는 비번이 암호화가 안되어있어 비밀번호가 맞지않는다고 나와 로그인이 불가하다.
@Autowired private UserRepository userRepository;
@PostMapping("/join") public @Response String join(User user){ System.out.println(user); user.setRole("ROLE_USER"); userRepository.save(user); // 회원가입 잘됨. but : 1234 -> 시큐리티로 로그인 할 수 x, 이유는 비번이 암호화가 안되어있기 때문에 }
SecurityConfig
pw암호화해줄 코드 추가해준다.
// 해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다. @Bean public BCryptPasswordEncoder encodePwd() { return new BCryptPasswordEncoder(); }
IndexController
join() 코드추가 및 BCryptPasswordEncoder DI
@PostMapping("/join") public @Response 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); // 회원가입 잘됨. but : 1234 -> 시큐리티로 로그인 할 수 x, 이유는 비번이 암호화가 안되어있기 때문에 }


블로그의 정보
Hello 춘기's world
볼빵빵오춘기