일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- @PreAuthorize("isAuthenticated()")
- 함수
- SQL 튜닝
- StringBuffer
- 스프링시큐리티 로그아웃
- 식별자
- 연산자
- 비교 연산자
- 객체
- 예약어
- 배열
- spring 게시판 삭제
- 친절한 SQL
- 친절한 SQL 튜닝
- 인텔리제이 Web 애플리케이션
- join
- 객체지향
- 오버로딩
- 반복문
- SQL
- 상속
- SQL튜닝
- SpringSecurity 로그아웃
- java
- 자바의정석
- SpringSecurity 로그인
- 이클립스 설치
- 산술 연산자
- 오버라이딩
- 논리 연산자
Archives
- Today
- Total
gi_dor
로그인 SpringSecurity, MySQL , MyBatis 본문
728x90
지금까지는 로그인 버튼을 클릭하게되면 해당하는 로그인 페이지의 URL로
@PostMapping을 통해 POST 요청이 전송 되었습니다
이후 서버에서는 해당 URL로 온 요청을 처리해 로그인을 수행했었다
이제는 로그인 페이지에서 로그인을 할때 url호출없이
service를 이용할수 있는 로직을 spring security에서 제공해준다
이를 가능케 하는 것은 Spring Security의 UsernamePasswordAuthenticationFilter 때문이다
특정한 URL로 요청이 들어오면 사용자의 인증정보를 검사하고 인증에 성공하면 사용자를 인증해 세션에 저장한다
이를 통해 URL호출 없이 로그인 처리를 할수 있다
SpringSecurity를 통해 구현된 로그인페이지에서 사용자가 로그인 버튼을 누르면 페이지가
새로고침 되거나 URL이 변경되지 않아도 내부적으로 제공하는 서비스를 통해 로그인 처리되고 사용자가 인증된다
XML
<resultMap id="UserResultMap" type="com.example.bookhub.user.vo.User">
<id column="user_no" property="no" />
<result column="user_id" property="id" />
<result column="user_password" property="password" />
<result column="user_name" property="name" />
<result column="user_email" property="email" />
<result column="user_created_date" property="createdDate" />
<result column="user_updated_date" property="updatedDate" />
<result column="user_tel" property="tel" />
<result column="user_zip_code" property="zipCode" />
<result column="user_address" property="address" />
<result column="user_address_detail" property="addressDetail" />
<result column="user_del_yn" property="delYn" />
</resultMap>
<select id="selectUserById" parameterType="string" resultMap="UserResultMap">
SELECT user_no ,
user_id ,
user_password ,
user_name ,
user_email ,
user_tel ,
user_zip_code ,
user_address,
user_address_detail ,
user_created_date ,
user_updated_date
FROM USER
WHERE user_id = #{id}
</select>
SERVICE
@Service
@RequiredArgsConstructor
public class UserService implements UserDetailsService {
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;
/**
* 주어진 사용자 아이디를 기준으로 사용자의 데이터를 가져와 UserDetails 객체로 반환합니다.
* @param id 사용자 아이디
* @return UserDetails 객체
* @throws UsernameNotFoundException 주어진 아이디에 해당하는 사용자를 찾을 수 없는 경우 발생합니다.
*/
@Override
public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {
// 사용자 아이디를 기준으로 데이터베이스에서 사용자 정보를 가져옵니다. 이 정보는 user 객체에 저장
User user = userMapper.selectUserById(id);
// 데이터베이스에서 가져온 사용자 정보가 없다면(null이면) 예외를 발생시킵니다.
if(user == null) {
throw new UsernameNotFoundException("Id 찾을수 없습니다 : " +id);
}
// UserDetailsImpl 클래스의 객체를 생성합니다. 이 객체는 사용자의 인증 및 권한 정보를 제공하기위해 사용한다
UserDetailsImpl userDetails = new UserDetailsImpl();
// 객체에서 가져온 사용자 아이디와 비밀번호를 userDetails 객체에 설정
userDetails.setId(user.getId());
userDetails.setPassword(user.getPassword());
userDetails.setAuthorities(List.of(new SimpleGrantedAuthority("ROLE_USER")));
return userDetails;
}
}
UserService 클래스가 UserDetailsService 인터페이스를 구현하고 있으므로 Spring Security는 UserService 를 통해
사용자의 인증 정보를 가져온다
UserService의 loadUserByUsername 메서드가 사용자 인증을 처리하고, 이를 통해 로그인이 이루어진다
HTML
<body class="container">
<div class="row text-center">
<div class="col-2"></div>
<div class="col-8">
<div class="form-signin">
<form action="/user/login" method="post">
<img class="mb-4" src="/image/login/logo.png" alt="" width="auto" height="250">
<h1 class="h3 mb-3 fw-normal">BookHub Login</h1>
<div class="form-floating">
<input type="text" class="form-control" id="id" name="id" placeholder="아이디 입력...">
<label for="id">아이디</label>
</div>
<div class="form-floating">
<input type="password" class="form-control" id="pwd" name="password" placeholder="Password">
<label for="pwd">비밀번호</label>
</div>
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> 아이디 저장
</label>
</div>
<button class="w-100 btn btn-lg btn-dark" type="submit" style="margin-bottom: 8px;">로그인</button>
<a href="/user/register" class="w-100 btn btn-lg btn-secondary">회원가입</a> <!-- 회원가입 버튼 -->
<br>
<br>
<a href="/passwordReset" class="text-center" style="display: block;">비밀번호를 잊으셨나요?</a>
<div class="text-center mt-3">
<a class="naver" href="" style="margin: 0 10px;"><img th:src="@{/image/login/naverLogin.png}" style="width: 40px; height: 40px"></a>
<a class="kakao" href="" style="margin: 0 10px;"><img th:src="@{/image/login/kakaoLogin.png}" style="width: 40px; height: 40px"></a>
<a class="google" href="" style="margin: 0 10px;"><img th:src="@{/image/login/googleLogin.png}" style="width: 40px; height: 40px"></a>
</div>
</form>
<p class="mt-5 mb-3 text-muted">© 2024–2024</p>
</div>
</div>
<div class="col-2"></div>
</div>
</body>
아이디 입력에 name = "username" 이 입력되야 한다
익숙하지도 않고 id가 편해서 securityconfig 파일을 수정해서
name="id"를 사용하겠다
SecurityConfig
// 폼기반 로그인을 활성화
// 사용자가 로그인 한다면 /user/login 경로로 이동하게되는데 로그인 성공시 ("/") 로 리다이렉트
http.formLogin(formLogin -> formLogin.loginPage("/user/login").usernameParameter("id").defaultSuccessUrl("/"));
usernameParameter("id")를 설정
loginForm.html
<input type="text" class="form-control" id="id" name="id" placeholder="아이디 입력..."> name = "id"사용
728x90
'Back_End > SpringBoot' 카테고리의 다른 글
마이페이지 ver.1- SpringSecurity, MySQL , MyBatis @PreAuthorize("isAuthenticated()") (0) | 2024.04.22 |
---|---|
시큐리티로 로그인한 회원 정보 조회 , 수정 - SpringSecurity, MySQL , MyBatis (0) | 2024.04.17 |
로그아웃 - SpringSecurity, MySQL , MyBatis (0) | 2024.04.17 |
회원가입 - SpringSecurity , @Valid , MySQL , MyBatis (0) | 2024.04.12 |
Regex를 활용한 입력 유효성 검사 (0) | 2024.04.09 |