시큐리티 세팅
sercurity dependency를 사용하면 어떤 링크로 접속해도 /login으로 들어오게 된다 = 단일진입점 형성(redirection)
http 403 : forbidden -> 권한x
@EnableWebSecurity //해당 파일로 시큐리티를 활성화
@Configuration //IOC
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//super삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화 됨
http.authorizeRequests()
.antMatchers("/","/user/**","/image/**","/subscribe/**","/comment/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin() //일반적인 ID,PASSWORD로 구성 되어있는 것
.loginPage("/auth/signin")
.defaultSuccessUrl("/");
}
}
1. 어노테이션으로 어떤 동작 실행시킬건지 정의
2. extends web...
3. override
4. super.configure(http) 삭제 -> 기존 시큐리티(모든 경로를 login으로 가게 만든다) 비활성화 후
5. 새롭게 정의
super : 부모를 상속했을때 부모의 생성자를 사용하거나 부모의 메서드를 사용할때 사용된다
ex) super(), super.method(http)
회원가입 구현
회원가입 => post 동작 ( db에 새로운 데이터 생성)
.jsp 디폴트 경로에 파일 생성(jsp파일은 클라이언트의 req를 처리할때 서버에서 실행된다)
action ="경로", method="POST" -> 특정경로에서 아래의 컨텐트를 POST방식으로 다룬다
%@controller,@restcontroller -> IOC + 컨트롤러
CSRF토큰
1. 클라이언트에서 singup page를 요청하면 서버를 감싸고 있는 시큐리티가
CSRF토큰을 signup.jsp파일안에 있는 input태그에 csrf="ex" 를 붙여서 리턴한다
(이때 .JSP를 리턴한다는건 클라이언트에 바로 주는게 아니라
.HTML파일로 렌더링 하기전에 리턴하는 것이라고 생각하자)
2. 클라이언트가 signup을 요청하면 시큐리티는 csrf가 있는지 없는지 확인한다
만약 postman을 사용해서 csrf토큰을 받지 못한다면 403을 띄워서 들어오지 못하게 한다
즉 정상정인 접근인지 아닌지 구분할때 사용
회원가입 User 모델 만들기
DTO = Data Transfer Object -> 통신할때 데이터를 담는 오브젝트
x-www-form-urlencoded 형식(key-value)을 받아주기 위해선 매개변수로 Dto를 사용해야한다
public String signup(SignupDto signupDto){}
@Data -> getter,setter만들어주는 어노테이션
클라이언트에서 받은 데이터를 db에서 저장하기 위해선 model이 필요하다
domain->user 만들고
@Entity : 디비에 테이블 생성
@id : pk 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다.
@PrePersist 디비에 insert되기 직전에 실행되고 같이 insert된다
ddl-auto : update -> 재실행 해도 남아있음
ORM을 사용할려 하기에 JPA를 사용한다 : 자바에서 객체를 만들면 DB에 저장된다
ORM(Object-Relational Mapping)
JPA(Java Persistence API)
post->dto로 데이터 받기(@Data 사용)->컨트롤러에서 데이터 받기(파라미터에 dto넣기)->DB에 넣기 위한 model(domain package안에 만들고 @Entity,@Data,@생성)
회원가입-완료
Dto에서 model로 데이터 보내기
User model에 가장위에 @Builder
dto에서 함수 만들고 빌드 패턴 사용
public User toEntity() {
return User.builder()
.username(username)
.password(password)
.email(email)
.name(name)
.build();
}
모델은 데이터를 담는 객체를 생성하기 때문에 빌더패턴을 사용하고
컨트롤러는 요청에대한 응답을 처리하기 때문에 빌더패턴을 비교적 덜 사용한다
model에서 객체까지 만들었으면 데이터베이스에 넣기 위해선 service가 필요하다
@service -> IOC, 트랜잭션 관리
serviceRepository필요 -> Interface생성 extends jpaRepository(IOC 자동)<object,pk type>
authservice에서 회원가입 하기 위해선 authcontroller에서 회원가입 요청을 해야한다
->컨트롤러에 DI로 service를 불러온다
@Authowired
private AuthService authService;
private AuthService authService;
public AuthController( AuthService authService ){
this.authService= authService ;
}
//2번째 방법으로 사용하면
//1. 컨트롤러 IOC
//2. 컨트롤러 생성자 보면 SERVICE있으니까 SERVICE가 컨테이너에 올라왔는지 확인
//3. 이때 SERVICE.JAVA에 @SERVICE가 있으면 DI성공
//하지만 spring에서 가장 권장되는 방법은 @RequiredArgsConsturctor이다
@RequiredArgsConstructor //알아서 final필드의 생성자를 생성해준다
private fianl AuthService authService;
@RequiredArgsConstructor를 사용해야 하는 이유에는 https://brio-sw.tistory.com/57 참고하기
//컨트롤러에서
authService.회원가입(user);
//서비스에서
private final UserRepository userRepository;
public User회원가입(User user){
User userEntity = userRepository.save(user);
return userEntity;
}
//.save(user)로 db에 저장, db에 저장하면서 그대로 리턴도 가능하다
//.save(user)에서의 user는 통신으로 전해 받은 것
//userEnitity는 db에 저장한 형식의 데이터
Logger Log 만들어서 확인하니까 훨씬 보기 편하다
비밀번호 해쉬
@Transactional // Write(insert,update,delete)할때는 걸어주자
securityconfig에 @Bean-bcryptpw ->처음 클래스가 IOC로 생성될때 같이 걸린다 -> DI해서 다른데서 쓰기 가능
pw=user.getpw로 받아오고, bcryp.encode(pw)암호화->user.setpw(pw) : 다시 유저 pw에 적용
데이터 날릴때 : application.yml에서 ddl-auto를 create로 변경
유저모델에 @Column(unique=true)걸어줘서 중복 방지
'SpringBoot > Photogram(Meta)' 카테고리의 다른 글
ch3-3. SpringBoot-로그인 (0) | 2024.04.09 |
---|---|
ch3-2 SpringBoot-회원가입 + a (0) | 2024.03.11 |
CH2 SpringBoot Controller (0) | 2024.02.16 |
1-환경설정 (0) | 2024.02.14 |