Skip to content

Commit afaec1b

Browse files
author
kaleidox
committed
improve oauth2 implementation for nextcloud
1 parent d12205a commit afaec1b

3 files changed

Lines changed: 48 additions & 6 deletions

File tree

run/intellij/Prod Run.run.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Prod Run" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
3+
<option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources"/>
4+
<module name="workbench.main"/>
5+
<selectedOptions>
6+
<option name="environmentVariables"/>
7+
</selectedOptions>
8+
<option name="SPRING_BOOT_MAIN_CLASS" value="de.kaleidox.workbench.WorkbenchApplication"/>
9+
<method v="2">
10+
<option name="Make" enabled="true"/>
11+
</method>
12+
</configuration>
13+
</component>

src/main/java/de/kaleidox/workbench/web/SecurityConfig.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@
77
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
88
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
99
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
10+
import org.springframework.boot.context.event.ApplicationStartedEvent;
1011
import org.springframework.context.annotation.Bean;
1112
import org.springframework.context.annotation.Configuration;
13+
import org.springframework.context.event.EventListener;
14+
import org.springframework.context.expression.MapAccessor;
1215
import org.springframework.core.annotation.Order;
16+
import org.springframework.expression.spel.standard.SpelExpressionParser;
17+
import org.springframework.expression.spel.support.SimpleEvaluationContext;
1318
import org.springframework.security.config.Customizer;
1419
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1520
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
@@ -18,6 +23,7 @@
1823
import org.springframework.security.oauth2.client.registration.ClientRegistration;
1924
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
2025
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
26+
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
2127
import org.springframework.security.oauth2.core.AuthorizationGrantType;
2228
import org.springframework.security.web.SecurityFilterChain;
2329

@@ -27,7 +33,7 @@
2733

2834
@Log
2935
@Configuration
30-
public class SecurityConfig {
36+
public class SecurityConfig extends DefaultOAuth2UserService {
3137
@Bean
3238
@ConditionalOnExpression("#{!(systemEnvironment['DEBUG']?:'false').equals('true')}")
3339
public @Nullable ClientRegistrationRepository clientRegistrationRepository(@Autowired AppConfig config) {
@@ -54,9 +60,12 @@ public class SecurityConfig {
5460
public SecurityFilterChain configureSecure(HttpSecurity http) throws Exception {
5561
log.info("Using OAuth2-based SecurityFilterChain");
5662
return http.authorizeHttpRequests(auth -> auth.requestMatchers("/api/**")
57-
.fullyAuthenticated()
58-
.anyRequest()
59-
.authenticated()).oauth2Login(Customizer.withDefaults()).csrf(AbstractHttpConfigurer::disable).build();
63+
.fullyAuthenticated()
64+
.anyRequest()
65+
.authenticated())
66+
.oauth2Login(oauth -> oauth.userInfoEndpoint(info -> info.userService(this)))
67+
.csrf(AbstractHttpConfigurer::disable)
68+
.build();
6069
}
6170

6271
@Bean
@@ -70,8 +79,6 @@ public SecurityFilterChain configureInsecure(HttpSecurity http) throws Exception
7079
.permitAll()).httpBasic(Customizer.withDefaults()).userDetailsService(username -> new UserDetails() {
7180
// token for dev: ZGV2Og==
7281

73-
{}
74-
7582
@Override
7683
public Collection<? extends GrantedAuthority> getAuthorities() {
7784
return List.of();
@@ -88,4 +95,20 @@ public String getUsername() {
8895
}
8996
}).csrf(AbstractHttpConfigurer::disable).build();
9097
}
98+
99+
@EventListener
100+
public void on(ApplicationStartedEvent ignored) {
101+
setAttributesConverter(input -> source -> {
102+
if (!source.containsKey("ocs")) return source;
103+
var userId = new SpelExpressionParser().parseRaw("ocs.data.id")
104+
.getValue(SimpleEvaluationContext.forPropertyAccessors(new MapAccessor())
105+
.withRootObject(source)
106+
.build());
107+
source.put(input.getClientRegistration()
108+
.getProviderDetails()
109+
.getUserInfoEndpoint()
110+
.getUserNameAttributeName(), userId);
111+
return source;
112+
});
113+
}
91114
}

src/main/resources/application.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,9 @@ spring:
1717
return-body-on-create: true
1818
return-body-on-update: true
1919
enable-enum-translation: true
20+
logging:
21+
level:
22+
root: info
23+
de.kaleidox: debug
24+
org.comroid: debug
25+
com.ampznetwork: debug

0 commit comments

Comments
 (0)