로그인 URL 등록
먼저 스프링 시큐리티에 로그인 URL을 등록
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().antMatchers("/**").permitAll()
.and()
.csrf()
.ignoringAntMatchers("/h2-console/**")
.and()
.headers()
.addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
.and()
.formLogin()
.loginPage("/user/login")
.defaultSuccessUrl("/");
return http.build();
}
UserSecurityService
UserController 로그인 추가
//로그인 post는 시큐리티 처리
@GetMapping("/login")
public String login() {
return "login_form";
}
login_form.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout::head"></head>
<body>
<nav th:replace="layout::nav"></nav>
<div class="container my-3">
<div class="my-3 border-bottom">
<div>
<h4>로그인</h4>
</div>
</div>
<form th:action="@{/user/login}" method="post">
<div th:if="${param.error}">
<div class="alert alert-danger">
사용자ID 또는 비밀번호를 확인해 주세요.
</div>
</div>
<div class="mb-3">
<label for="username" class="form-label">사용자ID</label>
<input
type="text"
name="username"
id="username"
class="form-control"
/>
</div>
<div class="mb-3">
<label for="password" class="form-label">비밀번호</label>
<input
type="password"
name="password"
id="password"
class="form-control"
/>
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
</body>
</html>
UserRepository 에 유저이름(id)으로 조회 기능 추가
package com.mysite.sbb.user;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<SiteUser, Long> {
Optional<SiteUser> findByusername(String username);
}
package com.mysite.sbb.user;
import lombok.Getter;
@Getter
public enum UserRole {
//로그인 유저들의 권한 설정
ADMIN("ROLE_ADMIN"),
USER("ROLE_USER");
UserRole(String value){
this.value = value;
}
private String value;
}
UserRole은 열거 자료형(enum)으로 작성했다. ADMIN은 "ROLE_ADMIN", USER는 "ROLE_USER" 라는 값을 가지도록 했다. 그리고 상수 자료형이므로 @Setter없이 @Getter만 사용가능하도록 했다.
//로그인 유저들의 권한 설정 : 관리자 / 회원
UserSecurityService 생성
package com.mysite.sbb.user;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserSecurityService implements UserDetailsService{
@Autowired
private UserRepository userRepo;
//스프링 시큐리티가 인증에 사용하는 메소드
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<SiteUser> _siteUser = this.userRepo.findByusername(username);
if(_siteUser.isEmpty()) {
throw new UsernameNotFoundException("사용자를 찾을 수 없습니다.");
}
SiteUser siteUser = _siteUser.get();
List<GrantedAuthority> authorities = new ArrayList<>();
//권한 리스트에 이름이 admin과 같을 경우에만 "Role_Admin"권한을 부여하고 나머지는 유저권한 부여
if("admin".equals(username)) {
authorities.add(new SimpleGrantedAuthority(UserRole.ADMIN.getValue()));
} else {
authorities.add(new SimpleGrantedAuthority(UserRole.USER.getValue()));
}
//시큐리티가 유저를 찾아서 검증 후 있을 경우 새 유저(이름, 패스워드, 권한)를 생성
return new User(siteUser.getUsername(), siteUser.getPassword(), authorities);
}
}
스프링 시큐리티에 등록하여 사용할 UserSecurityService는 스프링 시큐리티가 제공하는 UserDetailsService 인터페이스를 구현(implements)해야 한다.
스프링 시큐리티의 UserDetailsService는 loadUserByUsername 메서드를 구현하도록 강제하는 인터페이스이다. loadUserByUsername 메서드는 사용자명으로 비밀번호를 조회하여 리턴하는 메서드이다.
사용자가 있으면 그 사용자의 이름과 패스워드와 권한까지 설정한다.
권한이 리스트로 되어있음 (여러가지 권한이 있을거니까 )
만약에 admin일 경우에만 관리자 권한을 주고 나머지는 다 user권한을 준다.
시큐리티 유저 객체임
SecurityConfig 에 아래의 내용 추가
스프링 시큐리티 등록
@Autowired
private UserSecurityService userSecurityService;
@Bean
AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
AuthenticationManager는 스프링 시큐리티의 인증을 담당한다.
AuthenticationManager 빈 생성시 스프링의 내부 동작으로 인해 위에서 작성한 UserSecurityService와 PasswordEncoder가 자동으로 설정된다.
테스트하기
1. 아이디 비밀번호 잘못 입력
2. 아이디 비밀번호 정상 입력-> 기본 페이지로 감
'BACKEND > SpringBoot' 카테고리의 다른 글
엔티티 변경 글쓴이 추가 및 글 목록,상세보기,답변에 반영하기 (0) | 2023.11.10 |
---|---|
로그아웃 처리 (0) | 2023.11.10 |
회원가입 처리(유효성검사, 비밀번호 암호화, 중복회원가입처리) (0) | 2023.11.10 |
스프링 시큐리티 (0) | 2023.11.10 |
답변 개수 표시 (0) | 2023.11.09 |