#16 board : security config
This commit is contained in:
@@ -1,8 +1,18 @@
|
||||
package com.example.board.config;
|
||||
|
||||
import com.example.board.dto.UserAccountDto;
|
||||
import com.example.board.dto.security.BoardPrincipal;
|
||||
import com.example.board.repository.UserAccountRepository;
|
||||
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
|
||||
@Configuration
|
||||
@@ -11,10 +21,37 @@ public class SecurityConfig {
|
||||
@Bean
|
||||
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
|
||||
http
|
||||
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
|
||||
.mvcMatchers(
|
||||
HttpMethod.GET,
|
||||
"/",
|
||||
"/articles",
|
||||
"/articles/search-hashtag"
|
||||
).permitAll()
|
||||
.anyRequest().authenticated()
|
||||
)
|
||||
.formLogin()
|
||||
.and()
|
||||
.logout()
|
||||
.logoutSuccessUrl("/")
|
||||
.and()
|
||||
;
|
||||
|
||||
return http.build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public UserDetailsService userDetailsService(UserAccountRepository userAccountRepository) {
|
||||
return username -> userAccountRepository
|
||||
.findById(username)
|
||||
.map(UserAccountDto::from)
|
||||
.map(BoardPrincipal::from)
|
||||
.orElseThrow(() -> new UsernameNotFoundException("유저를 찾을 수 없습니다. - username: " + username));
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.example.board.dto.security;
|
||||
|
||||
import com.example.board.dto.UserAccountDto;
|
||||
import lombok.Getter;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public record BoardPrincipal(
|
||||
String username,
|
||||
String password,
|
||||
Collection<? extends GrantedAuthority> authorities,
|
||||
String email,
|
||||
String nickname,
|
||||
String memo
|
||||
) implements UserDetails {
|
||||
|
||||
public static BoardPrincipal of(String username, String password, String email, String nickname, String memo) {
|
||||
|
||||
Set<RoleType> roleTypes = Set.of(RoleType.USER);
|
||||
|
||||
return new BoardPrincipal(
|
||||
username,
|
||||
password,
|
||||
roleTypes.stream()
|
||||
.map(RoleType::getName)
|
||||
.map(SimpleGrantedAuthority::new)
|
||||
.collect(Collectors.toUnmodifiableSet()),
|
||||
email,
|
||||
nickname,
|
||||
memo
|
||||
);
|
||||
}
|
||||
|
||||
public static BoardPrincipal from(UserAccountDto dto) {
|
||||
return BoardPrincipal.of(
|
||||
dto.userId(),
|
||||
dto.userPassword(),
|
||||
dto.email(),
|
||||
dto.nickname(),
|
||||
dto.memo()
|
||||
);
|
||||
}
|
||||
|
||||
public UserAccountDto toDto() {
|
||||
return UserAccountDto.of(
|
||||
username,
|
||||
password,
|
||||
email,
|
||||
nickname,
|
||||
memo
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||
return authorities;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
@Override public boolean isAccountNonExpired() { return true; }
|
||||
@Override public boolean isAccountNonLocked() { return true; }
|
||||
@Override public boolean isCredentialsNonExpired() { return true; }
|
||||
@Override public boolean isEnabled() { return true; }
|
||||
|
||||
public enum RoleType {
|
||||
USER("ROLE_USER");
|
||||
|
||||
@Getter
|
||||
private final String name;
|
||||
|
||||
RoleType(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user