Skip to content

Commit 7b20b19

Browse files
committed
default
1 parent 2b5f4f7 commit 7b20b19

File tree

85 files changed

+1215
-1334
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1215
-1334
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
# spring-security-oauth2
1+
# spring-security

build.gradle

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
plugins {
2-
id 'org.springframework.boot' version '2.7.1'
3-
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
42
id 'java'
3+
id 'org.springframework.boot' version '3.3.4'
4+
id 'io.spring.dependency-management' version '1.1.6'
55
}
66

77
group = 'nextstep'
88
version = '0.0.1-SNAPSHOT'
9-
sourceCompatibility = '11'
9+
10+
java {
11+
toolchain {
12+
languageVersion = JavaLanguageVersion.of(21)
13+
}
14+
}
1015

1116
repositories {
1217
mavenCentral()
1318
}
1419

1520
dependencies {
16-
// implementation 'org.springframework.boot:spring-boot-starter-security'
1721
implementation 'org.springframework.boot:spring-boot-starter-web'
22+
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
23+
implementation 'org.springframework.boot:spring-boot-starter-aop'
1824
testImplementation 'org.springframework.boot:spring-boot-starter-test'
19-
testImplementation 'org.springframework.security:spring-security-test'
20-
21-
testImplementation 'io.rest-assured:rest-assured:4.4.0'
2225
}
2326

24-
tasks.named('test') {
27+
test {
2528
useJUnitPlatform()
26-
}
29+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip
4+
networkTimeout=10000
5+
validateDistributionUrl=true
46
zipStoreBase=GRADLE_USER_HOME
5-
zipStorePath=wrapper/dists
7+
zipStorePath=wrapper/dists

settings.gradle

Lines changed: 0 additions & 1 deletion
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package nextstep;
1+
package nextstep.app;
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55

66
@SpringBootApplication
7-
public class SecurityAuthenticationApplication {
7+
public class SecurityApplication {
88

99
public static void main(String[] args) {
10-
SpringApplication.run(SecurityAuthenticationApplication.class, args);
10+
SpringApplication.run(SecurityApplication.class, args);
1111
}
1212

1313
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package nextstep.app;
2+
3+
import nextstep.app.domain.Member;
4+
import nextstep.app.domain.MemberRepository;
5+
import nextstep.security.access.AnyRequestMatcher;
6+
import nextstep.security.access.MvcRequestMatcher;
7+
import nextstep.security.access.RequestMatcherEntry;
8+
import nextstep.security.access.hierarchicalroles.RoleHierarchy;
9+
import nextstep.security.access.hierarchicalroles.RoleHierarchyImpl;
10+
import nextstep.security.authentication.AuthenticationException;
11+
import nextstep.security.authentication.BasicAuthenticationFilter;
12+
import nextstep.security.authentication.UsernamePasswordAuthenticationFilter;
13+
import nextstep.security.authorization.*;
14+
import nextstep.security.config.DefaultSecurityFilterChain;
15+
import nextstep.security.config.DelegatingFilterProxy;
16+
import nextstep.security.config.FilterChainProxy;
17+
import nextstep.security.config.SecurityFilterChain;
18+
import nextstep.security.context.SecurityContextHolderFilter;
19+
import nextstep.security.userdetails.UserDetails;
20+
import nextstep.security.userdetails.UserDetailsService;
21+
import org.springframework.context.annotation.Bean;
22+
import org.springframework.context.annotation.Configuration;
23+
import org.springframework.context.annotation.EnableAspectJAutoProxy;
24+
import org.springframework.http.HttpMethod;
25+
26+
import java.util.ArrayList;
27+
import java.util.List;
28+
import java.util.Set;
29+
30+
@EnableAspectJAutoProxy
31+
@Configuration
32+
public class SecurityConfig {
33+
34+
private final MemberRepository memberRepository;
35+
36+
public SecurityConfig(MemberRepository memberRepository) {
37+
this.memberRepository = memberRepository;
38+
}
39+
40+
@Bean
41+
public DelegatingFilterProxy delegatingFilterProxy() {
42+
return new DelegatingFilterProxy(filterChainProxy(List.of(securityFilterChain())));
43+
}
44+
45+
@Bean
46+
public FilterChainProxy filterChainProxy(List<SecurityFilterChain> securityFilterChains) {
47+
return new FilterChainProxy(securityFilterChains);
48+
}
49+
50+
@Bean
51+
public SecuredMethodInterceptor securedMethodInterceptor() {
52+
return new SecuredMethodInterceptor();
53+
}
54+
55+
@Bean
56+
public SecurityFilterChain securityFilterChain() {
57+
return new DefaultSecurityFilterChain(
58+
List.of(
59+
new SecurityContextHolderFilter(),
60+
new UsernamePasswordAuthenticationFilter(userDetailsService()),
61+
new BasicAuthenticationFilter(userDetailsService()),
62+
new AuthorizationFilter(requestAuthorizationManager())
63+
)
64+
);
65+
}
66+
67+
@Bean
68+
public RoleHierarchy roleHierarchy() {
69+
return RoleHierarchyImpl.with()
70+
.role("ADMIN").implies("USER")
71+
.build();
72+
}
73+
74+
@Bean
75+
public RequestAuthorizationManager requestAuthorizationManager() {
76+
List<RequestMatcherEntry<AuthorizationManager>> mappings = new ArrayList<>();
77+
mappings.add(new RequestMatcherEntry<>(new MvcRequestMatcher(HttpMethod.GET, "/members"), new AuthorityAuthorizationManager(roleHierarchy(), "ADMIN")));
78+
mappings.add(new RequestMatcherEntry<>(new MvcRequestMatcher(HttpMethod.GET, "/members/me"), new AuthorityAuthorizationManager(roleHierarchy(), "USER")));
79+
mappings.add(new RequestMatcherEntry<>(new MvcRequestMatcher(HttpMethod.GET, "/search"), new PermitAllAuthorizationManager()));
80+
mappings.add(new RequestMatcherEntry<>(AnyRequestMatcher.INSTANCE, new PermitAllAuthorizationManager()));
81+
return new RequestAuthorizationManager(mappings);
82+
}
83+
84+
@Bean
85+
public UserDetailsService userDetailsService() {
86+
return username -> {
87+
Member member = memberRepository.findByEmail(username)
88+
.orElseThrow(() -> new AuthenticationException("존재하지 않는 사용자입니다."));
89+
90+
return new UserDetails() {
91+
@Override
92+
public String getUsername() {
93+
return member.getEmail();
94+
}
95+
96+
@Override
97+
public String getPassword() {
98+
return member.getPassword();
99+
}
100+
101+
@Override
102+
public Set<String> getAuthorities() {
103+
return member.getRoles();
104+
}
105+
};
106+
};
107+
}
108+
}

src/main/java/nextstep/app/application/MemberUserDetailsService.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/main/java/nextstep/app/config/AuthConfig.java

Lines changed: 0 additions & 87 deletions
This file was deleted.

src/main/java/nextstep/app/domain/MemberRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ public interface MemberRepository {
77
Optional<Member> findByEmail(String email);
88

99
List<Member> findAll();
10+
11+
Member save(Member member);
1012
}

src/main/java/nextstep/app/infrastructure/InmemoryMemberRepository.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@Repository
1111
public class InmemoryMemberRepository implements MemberRepository {
1212
public static final Member ADMIN_MEMBER = new Member("[email protected]", "password", "a", "", Set.of("ADMIN"));
13-
public static final Member USER_MEMBER = new Member("[email protected]", "password", "b", "", Collections.emptySet());
13+
public static final Member USER_MEMBER = new Member("[email protected]", "password", "b", "", Set.of("USER"));
1414
private static final Map<String, Member> members = new HashMap<>();
1515

1616
static {
@@ -27,4 +27,10 @@ public Optional<Member> findByEmail(String email) {
2727
public List<Member> findAll() {
2828
return members.values().stream().collect(Collectors.toUnmodifiableList());
2929
}
30+
31+
@Override
32+
public Member save(Member member) {
33+
members.put(member.getEmail(), member);
34+
return member;
35+
}
3036
}

0 commit comments

Comments
 (0)