Skip to content

Commit d1ca2e4

Browse files
committed
Fix per @rwinch comments
1 parent 694d2d0 commit d1ca2e4

File tree

10 files changed

+95
-215
lines changed

10 files changed

+95
-215
lines changed

9/part1/chat/src/main/java/com/greglturnquist/learningspringboot/chat/GatewayConfig.java

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.greglturnquist.learningspringboot.chat;
1717

18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
1820
import org.springframework.cloud.gateway.filter.factory.WebFilterFactory;
1921
import org.springframework.context.annotation.Bean;
2022
import org.springframework.context.annotation.Configuration;
@@ -29,16 +31,13 @@
2931
@Configuration
3032
public class GatewayConfig {
3133

34+
private static final Logger log = LoggerFactory.getLogger(GatewayConfig.class);
35+
3236
@Bean
3337
SaveSessionWebFilterFactory saveSessionWebFilterFactory() {
3438
return new SaveSessionWebFilterFactory();
3539
}
3640

37-
@Bean
38-
EmbedSessionHeaderWebFilterFactory embedSessionHeaderWebFilterFactory() {
39-
return new EmbedSessionHeaderWebFilterFactory();
40-
}
41-
4241
/**
4342
* Force the current WebSession to get saved
4443
*/
@@ -47,31 +46,14 @@ static class SaveSessionWebFilterFactory implements WebFilterFactory {
4746
public WebFilter apply(Tuple args) {
4847
return (exchange, chain) -> exchange.getSession()
4948
.map(webSession -> {
50-
System.out.println("Session id: " + webSession.getId() + " Attributes: " + webSession.getAttributes());
51-
webSession.getAttributes().entrySet().forEach(entry -> System.out.println(entry.getKey() + " => " + entry.getValue()));
49+
log.debug("Session id: " + webSession.getId());
50+
webSession.getAttributes().entrySet().forEach(entry ->
51+
log.debug(entry.getKey() + " => " + entry.getValue()));
5252
return webSession;
5353
})
5454
.map(WebSession::save)
5555
.then(chain.filter(exchange));
5656
}
5757
}
58-
59-
/**
60-
* Add a "SESSION" header with the current WebSession id.
61-
*/
62-
static class EmbedSessionHeaderWebFilterFactory implements WebFilterFactory {
63-
@Override
64-
public WebFilter apply(Tuple args) {
65-
return (exchange, chain) -> exchange.getSession()
66-
.map(webSession -> exchange
67-
.mutate()
68-
.request(exchange.getRequest()
69-
.mutate()
70-
.header("SESSION", webSession.getId())
71-
.build())
72-
.build())
73-
.flatMap(chain::filter);
74-
}
75-
}
7658
}
7759
// end::code[]

9/part1/chat/src/main/java/com/greglturnquist/learningspringboot/chat/SecurityConfiguration.java

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
*/
1616
package com.greglturnquist.learningspringboot.chat;
1717

18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
20+
import org.springframework.boot.CommandLineRunner;
1821
import org.springframework.context.annotation.Bean;
22+
import org.springframework.data.mongodb.core.MongoOperations;
1923
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
2024
import org.springframework.security.config.web.server.HttpSecurity;
21-
import org.springframework.security.core.userdetails.MapUserDetailsRepository;
22-
import org.springframework.security.core.userdetails.UserDetails;
2325
import org.springframework.security.web.server.SecurityWebFilterChain;
2426

2527
/**
@@ -29,43 +31,33 @@
2931
@EnableWebFluxSecurity
3032
public class SecurityConfiguration {
3133

32-
// tag::mongodb-users[]
33-
// @Autowired
34-
// public void globalUserDetails(AuthenticationManagerBuilder auth,
35-
// SpringDataUserDetailsService userDetailsService)
36-
// throws Exception {
37-
//
38-
// auth.userDetailsService(userDetailsService);
39-
// }
40-
41-
// @Bean
42-
// CommandLineRunner initializeUsers(UserRepository repository) {
43-
// return args -> {
44-
// repository.save(new User(null, "greg", "turnquist",
45-
// new String[]{"ROLE_USER", "ROLE_ADMIN"}));
46-
//
47-
// repository.save(new User(null, "phil", "webb",
48-
// new String[]{"ROLE_USER"}));
49-
// };
50-
// }
34+
private static final Logger log = LoggerFactory.getLogger(SecurityConfiguration.class);
5135

36+
// tag::mongodb-users[]
5237
@Bean
53-
MapUserDetailsRepository userDetailsRepository(SpringDataUserDetailsService userDetailsService,
54-
UserRepository repository) throws Exception {
55-
repository.deleteAll();
56-
repository.save(new User(null, "greg", "turnquist",
57-
new String[]{"ROLE_USER", "ROLE_ADMIN"}));
38+
CommandLineRunner initializeUsers(MongoOperations operations) {
39+
return args -> {
40+
operations.dropCollection(User.class);
5841

59-
repository.save(new User(null, "phil", "webb",
60-
new String[]{"ROLE_USER"}));
61-
62-
UserDetails greg = userDetailsService.loadUserByUsername("greg");
63-
UserDetails phil = userDetailsService.loadUserByUsername("phil");
64-
65-
return new MapUserDetailsRepository(greg, phil);
42+
operations.insert(
43+
new User(
44+
null,
45+
"greg", "turnquist",
46+
new String[]{"ROLE_USER", "ROLE_ADMIN"}));
47+
operations.insert(
48+
new User(
49+
null,
50+
"phil", "webb",
51+
new String[]{"ROLE_USER"}));
52+
53+
operations.findAll(User.class).forEach(user -> {
54+
log.info("Loaded " + user);
55+
});
56+
};
6657
}
6758
// end::mongodb-users[]
6859

60+
// tag::security-filter-chain[]
6961
@Bean
7062
SecurityWebFilterChain springWebFilterChain(HttpSecurity http) {
7163
return http
@@ -74,15 +66,6 @@ SecurityWebFilterChain springWebFilterChain(HttpSecurity http) {
7466
.and()
7567
.build();
7668
}
77-
// protected void configure(HttpSecurity http) throws Exception {
78-
// http
79-
// .httpBasic()
80-
// .and()
81-
// .formLogin()
82-
// .and()
83-
// .authorizeRequests()
84-
// .antMatchers("/**").authenticated();
85-
// }
86-
69+
// end::security-filter-chain[]
8770
}
8871
// end::code[]

9/part1/chat/src/main/java/com/greglturnquist/learningspringboot/chat/SessionConfig.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,19 @@
1616
package com.greglturnquist.learningspringboot.chat;
1717

1818
import org.springframework.context.annotation.Bean;
19-
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
20-
import org.springframework.session.EnableSpringWebSession;
21-
import org.springframework.session.data.mongo.AbstractMongoSessionConverter;
2219
import org.springframework.session.data.mongo.JdkMongoSessionConverter;
23-
import org.springframework.session.data.mongo.ReactiveMongoOperationsSessionRepository;
20+
import org.springframework.session.data.mongo.config.annotation.web.reactive.EnableMongoWebSession;
2421

2522
/**
2623
* @author Greg Turnquist
2724
*/
2825
// tag::code[]
29-
@EnableSpringWebSession
26+
@EnableMongoWebSession
3027
public class SessionConfig {
3128

3229
@Bean
3330
JdkMongoSessionConverter mongoSessionConverter() {
3431
return new JdkMongoSessionConverter();
3532
}
36-
37-
@Bean
38-
public ReactiveMongoOperationsSessionRepository reactiveMongoOperationsSessionRepository(
39-
ReactiveMongoOperations operations, AbstractMongoSessionConverter sessionConverter) {
40-
ReactiveMongoOperationsSessionRepository repository = new ReactiveMongoOperationsSessionRepository(operations);
41-
repository.setMongoSessionConverter(sessionConverter);
42-
return repository;
43-
}
4433
}
4534
// end::code[]

9/part1/chat/src/main/java/com/greglturnquist/learningspringboot/chat/SessionHeaderLoadingZuulPreFilter.java

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,34 @@
1515
*/
1616
package com.greglturnquist.learningspringboot.chat;
1717

18+
import reactor.core.publisher.Mono;
1819
import org.springframework.security.core.authority.AuthorityUtils;
1920
import org.springframework.security.core.userdetails.User;
2021
import org.springframework.security.core.userdetails.UserDetails;
21-
import org.springframework.security.core.userdetails.UserDetailsService;
22-
import org.springframework.security.core.userdetails.UsernameNotFoundException;
22+
import org.springframework.security.core.userdetails.UserDetailsRepository;
2323
import org.springframework.stereotype.Component;
2424

2525
/**
2626
* @author Greg Turnquist
2727
*/
2828
// tag::code[]
2929
@Component
30-
public class SpringDataUserDetailsService implements UserDetailsService {
30+
public class SpringDataUserDetailsRepository implements UserDetailsRepository {
3131

3232
private final UserRepository repository;
3333

34-
public SpringDataUserDetailsService(UserRepository repository) {
34+
public SpringDataUserDetailsRepository(UserRepository repository) {
3535
this.repository = repository;
3636
}
3737

3838
@Override
39-
public UserDetails loadUserByUsername(String username)
40-
throws UsernameNotFoundException {
39+
public Mono<UserDetails> findByUsername(String username) {
4140
return repository.findByUsername(username)
4241
.map(user -> new User(
4342
user.getUsername(),
4443
user.getPassword(),
4544
AuthorityUtils.createAuthorityList(user.getRoles())
46-
))
47-
.block();
45+
));
4846
}
4947
}
5048
// end::code[]

9/part1/chat/src/main/resources/bootstrap.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ spring:
1717
- RewritePath=/imagesService/(?<segment>.*), /$\{segment}
1818
- RewritePath=/imagesService, /
1919
- SaveSession
20-
- EmbedSessionHeader
2120
- id: images
2221
uri: lb://IMAGES
2322
predicates:

9/part1/images/src/main/java/com/greglturnquist/learningspringboot/HomeController.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@
2020
import java.util.Map;
2121

2222
import reactor.core.publisher.Mono;
23-
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
24-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2523
import org.springframework.stereotype.Controller;
2624
import org.springframework.ui.Model;
2725
import org.springframework.web.bind.annotation.GetMapping;
28-
import org.springframework.web.bind.annotation.RequestHeader;
2926
import org.springframework.web.bind.annotation.ResponseBody;
27+
import org.springframework.web.server.WebSession;
3028

3129
import com.greglturnquist.learningspringboot.images.CommentHelper;
3230
import com.greglturnquist.learningspringboot.images.ImageService;
@@ -51,19 +49,18 @@ public HomeController(ImageService imageService,
5149

5250
@GetMapping("/")
5351
public Mono<String> index(Model model,
54-
@RequestHeader("SESSION") String sessionId,
55-
@AuthenticationPrincipal Mono<UsernamePasswordAuthenticationToken> user) {
52+
WebSession webSession) {
5653
// tag::owner[]
57-
System.out.println("sessionId = " + sessionId);
58-
System.out.println("user = " + user.block());
5954
model.addAttribute("images",
6055
imageService
6156
.findAllImages()
6257
.map(image -> new HashMap<String, Object>() {{
6358
put("id", image.getId());
6459
put("name", image.getName());
6560
put("owner", image.getOwner());
66-
// put("comments", commentHelper.getComments(image, sessionId));
61+
put("comments",
62+
commentHelper.getComments(image,
63+
webSession.getId()));
6764
}})
6865
);
6966
// end::owner[]
@@ -72,7 +69,7 @@ public Mono<String> index(Model model,
7269

7370
@GetMapping("/token")
7471
@ResponseBody
75-
public Mono<Map<String, String>> token(@RequestHeader("SESSION") String sessionId) {
76-
return Mono.just(Collections.singletonMap("token", sessionId));
72+
public Mono<Map<String, String>> token(WebSession webSession) {
73+
return Mono.just(Collections.singletonMap("token", webSession.getId()));
7774
}
7875
}

0 commit comments

Comments
 (0)