implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
package com.mysite.sbb;
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.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
.requestMatchers(new AntPathRequestMatcher("/**")).permitAll())
;
return http.build();
}
}
.formLogin((formLogin) -> formLogin // 로그인URL등록,
.loginPage("/user/login")
.defaultSuccessUrl("/category")) // 로그인 성공시 default페이지는 /category로 간다.
public class UserController {
(... 생략 ...)
@GetMapping("/user/login")
public String login() {
return "mainlist";
}
}
<!DOCTYPE html>
<html lang="en" layout:decorate="~{layout}">
<div layout:fragment="content-layout" class="content">
<div class="hero bg-base-200">
<img class="mainjpg" src="/travel-illustrations.jpg"/>
<div class="hero-content flex-col lg:flex-row-reverse">
<div class="text-center lg:text-left">
<h1 class="text-5xl font-bold">Login now!</h1>
<p class="py-6">Provident cupiditate voluptatem et in. Quaerat fugiat ut assumenda excepturi exercitationem quasi. In deleniti eaque aut repudiandae et a id nisi.</p>
</div>
<div class="card flex-shrink-0 w-full max-w-sm shadow-2xl bg-base-100">
<form th:action="@{/user/login}" class="card-body" method="post" >
<div th:if="${param.error}">
<div class="alert alert-danger">
사용자ID 또는 비밀번호를 확인해 주세요.
</div>
</div>
<div class="form-control">
<label class="label">
<span class="label-text">Email</span>
</label>
<input style="width : 330px" type="email" placeholder="email" class="input input-bordered" name="username" required />
</div>
<div class="form-control">
<label class="label">
<span class="label-text">Password</span>
</label>
<input style="width : 330px" type="password" placeholder="password" name="password" class="input input-bordered" required />
<label class="label">
<a href="#" class="label-text-alt link link-hover">Forgot password?</a>
</label>
</div>
<div class="form-control mt-6">
<button class="btn btn-primary" type="submit" >Login</button>
<button class="btn btn-primary" onclick="doJoin(this.form)">Join</button>
</div>
</form>
</div>
</div>
</div>
<script>
function doJoin(form){
form.action = "/user/signup";
form.method = "get";
form.submit();
}
</script>
</div>
</html>
package com.korea.test.user;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<SiteUser, Integer> {
Optional<SiteUser> findByEmail(String username);
}
시큐리티 감독 하에서 post 요청 보낼 때는 csrf 토큰을 같이 보내야함
(th:action 쓰면 됨)
시큐리티는 비밀번호가 평문으로 들어
오면 파업한다.(암호화 하면 됨)
시큐리티는 아이디를 username으로, 비밀번호를 password로 정해놨다.
(임의로 정하면 안됨)