๋ก๊ทธ์ธ 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 |
| ๋ต๋ณ ๊ฐ์ ํ์ (1) | 2023.11.09 |