[Spring_Security] 회원가입하기

JiMin LEE·2022년 11월 24일
0

스프링시큐리티

목록 보기
3/4

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 사용

}
  • 실행하면 mysql에 security 속에 user table 생성되어 있다.

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 정보가 들어갔다. + 비밀번호도 암호화되어서 들어갔다.

0개의 댓글