1.SpringSecurity 설정
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
.requestMatchers(new AntPathRequestMatcher("/**")).permitAll())
.csrf((csrf) -> csrf
.ignoringRequestMatchers(new AntPathRequestMatcher("/mysql/**")))
.headers((headers) -> headers
.addHeaderWriter(new XFrameOptionsHeaderWriter(
XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN)));
// login 설정
http
.formLogin((formLogin) -> formLogin
.loginPage("/login")
.usernameParameter("email") // login에 필요한 id 값을 email로 설정 (default는 username)
.passwordParameter("password")// login에 필요한 password 값을 password(default)로 설정
.defaultSuccessUrl("/")); // login에 성공하면 /로 redirect
http
.logout((logout) -> logout
.logoutRequestMatcher(new AntPathRequestMatcher("/member/logout"))
.permitAll()
.logoutSuccessUrl("/")// logout에 성공하면 /로 redirect
.invalidateHttpSession(true));
return http.build();
}
3-07 로그인과 로그아웃
* `[완성 소스]` : [https://github.com/pahkey/sbb3/tree/3-07](https://github.com/pahkey/sbb3/tree/3-07) …
wikidocs.net
2.Customloginform. html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<th:block>
<head>
<meta charset="utf-8">
<meta content="webkit" name="renderer">
<meta content="width=device-width, initial-scale=1" name="viewport">
<link href="https://getbootstrap.com/docs/5.3/examples/blog/" rel="canonical">
<link href="https://cdn.jsdelivr.net/npm/@docsearch/css@3" rel="stylesheet">
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65"
rel="stylesheet">
<script crossorigin="anonymous"
integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3"
src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"></script>
<script crossorigin="anonymous"
integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V"
src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js"></script>
<link href="../css/login.css" rel="stylesheet" type="text/css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function () {
$('.message a').click(function () {
$('form').animate({height: "toggle", opacity: "toggle"}, "slow");
});
});
const url = '/signup';
const data = {
// Your JSON data here
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
</script>
<script type="module" src="js/login.js"></script>
</head>
<div class="login-page">
<a aria-label="오늘의집" class="login_logo" href="#">
<img alt="path" height="100" src="../img/ohouse_logo.jpg" width="360"/>
</a>
<div class="form">
<form action="members/signup" class="register-form" method="post" object="MemberCreateRequest">
<input field="*{email}" id="register-email" name="register-email" placeholder="email address"
type="text"/>
<input field="*{password}" id="register-password" name="register-password" placeholder="password"
type="password"/>
<input field="*{name}" id="register-name" name="register-name" placeholder="name" type="text"/>
<input field="*{nickname}" id="nickname" name="nickname" placeholder="nickname" type="text"/>
<input field="*{birthday}" id="birthday" name="birthday" placeholder="birthday" type="date"/>
<button class="btn btn-primary" type="submit">생성</button>
<p class="message">Already registered? <a class="toggle-form" data-target=".login-form" href="#"
onclick="toggleEvent()">Sign In</a></p>
</form>
<form class="login_form" method="post" th:action="@{/login}">
<div th:if="${param.error}">
<div class="alert alert-danger">
사용자ID 또는 비밀번호를 확인해 주세요.
</div>
</div>
<div class="mb-3">
<label class="form-label" for="login_email">이메일 ID</label>
<input class="form-control" id="login_email" name="login_email" placeholder="email" type="text"/>
</div>
<div class="mb-3">
<label class="form-label" for="login_password">비밀번호</label>
<input class="form-control" id="login_password" name="login_password" placeholder="login_password"
type="password"/>
</div>
<button class="btn btn-primary" href="/"type="submit">로그인</button>
<p class="message">Not registered? <a class="toggle-form" data-target=".register-form" href="#"
onclick="toggleEvent()">Create an account</a></p>
<a class="btn-login join_btn btn_click" id="kakao-login-btn">
<img alt="카카오"
src="https://www.gb.go.kr/Main/Images/ko/member/certi_kakao_login.png" style="max-width: 40%; height: auto;">
</a>
</form>
</div>
</div>
</th:block>
</html>
@Bean
public UserDetailsService userDetailsService(MemberService memberService) {
return email -> memberService
.searchEmail(email) // MemberService에서 email을 기반으로 사용자 정보를 가져오는 메서드를 호출하도록 가정
.map(PostPrincipal::from)
.orElseThrow(() -> new UsernameNotFoundException("유저를 찾을 수 없습니다 - email: " + email));
}
3. test db
insert into member (email, created_at, modified_at, member_no, password, birthday, name, nickname)
values('dawon@gmail.com',now()-1,now(),1,'{noop}12345678','2000-01-01','test','nick test');
insert into post (created_at, modified_at, content, img_path, title, member_email)
VALUES('2000-01-01',now(),'test-content','test-img-path','testtitle','dawon@gmail.com');
4.로그인 에러
내가 만든사이트에 내가 못들어가는 상황이 생겼다....ㅠ
Spring Security Customlogin 로그인 에러
1. 로그인 실패 2. SecurityStrace확인 1. application.yml 파일에 loglevel 추가 logging.level: org.hibernate.SQL: debug org.springframework.security: DEBUG 2. stacktrace 확인 o.s.security.web.FilterChainProxy : Securing POST /login org.hibernate
nodwon.tistory.com
5.로그인
DB에 저장되어있는 이메일을기반으로 로그인을 구현하였다.
<nav class="navbar navbar-expand-lg ">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="btn btn-sm btn-outline-secondary" href="/cart">장바구니</a>
</li>
<li class="nav-item">
<a class="btn btn-sm btn-outline-secondary" sec:authorize="isAnonymous()" th:href="@{/login}">로그인</a>
<a class="btn btn-sm btn-outline-secondary" sec:authorize="isAuthenticated()" th:href="@{/members/logout}">로그아웃</a>
</li>
<li class="nav-item">
<a class="btn btn-sm btn-outline-secondary" sec:authorize="isAnonymous()" th:href="@{/signup}">회원가입</a>
</li>
<li class="nav-item">
<a class="btn btn-sm btn-outline-secondary" sec:authorize="isAnonymous()" th:href="@{/login}">글쓰기</a>
<a class="btn btn-sm btn-outline-secondary" sec:authorize="isAuthenticated()" th:href="@{/posts/form}">글쓰기</a>
</li>
</ul>
</nav>
https://github.com/nodwon/OhouseV1/tree/feature/member
GitHub - nodwon/OhouseV1: 지금까지 공부한것을 기반으로 포트폴리오 제작
지금까지 공부한것을 기반으로 포트폴리오 제작. Contribute to nodwon/OhouseV1 development by creating an account on GitHub.
github.com
'포트폴리오 > ohouseClone' 카테고리의 다른 글
7. 게시판 소셜로그인 만들기(google, naver, kakao)-spring (1) | 2023.11.01 |
---|---|
6. 게시판 서비스 개발(spring + mysql) crud (0) | 2023.10.24 |
4. 게시판 작성 front & member api (0) | 2023.09.05 |
3. 커뮤니티 게시판 서비스 api 개발 & 메인 페이지 (0) | 2023.08.19 |
2. Entity 작성 및 구조도 체크 (0) | 2023.08.16 |