Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.synapse.account_service.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class PasswordEncoderConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
Expand All @@ -18,6 +17,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.synapse.account_service.convert.authority.CustomAuthorityMapper;
import com.synapse.account_service.filter.JwtAuthenticationFilter;
import com.synapse.account_service.service.CustomOAuth2UserService;
import com.synapse.account_service.service.CustomUserDetailsService;
import com.synapse.account_service.service.handler.LoginFailureHandler;
import com.synapse.account_service.service.handler.LoginSuccessHandler;
Expand All @@ -31,7 +31,9 @@ public class SecurityConfig {
private final CustomUserDetailsService customUserDetailsService;
private final LoginSuccessHandler loginSuccessHandler;
private final LoginFailureHandler loginFailureHandler;
private final CustomOAuth2UserService customOAuth2UserService;
private final ObjectMapper objectMapper;
private final PasswordEncoder passwordEncoder;

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception {
Expand All @@ -44,21 +46,24 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticat
.anyRequest().authenticated()
)
.addFilterAt(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)

.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo.userService(customOAuth2UserService))
.successHandler(loginSuccessHandler)
.failureHandler(loginFailureHandler)
)

.exceptionHandling(
exceptionHandlingConfigurer -> exceptionHandlingConfigurer.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")));

return http.build();
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(customUserDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
authProvider.setPasswordEncoder(passwordEncoder);
authProvider.setAuthoritiesMapper(customAuthorityMapper());
return authProvider;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package com.synapse.account_service.convert;

import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.core.user.OAuth2User;

import com.synapse.account_service.domain.Member;

public record ProviderUserRequest(Member member) {

public record ProviderUserRequest(ClientRegistration clientRegistration, OAuth2User oAuth2User, Member member) {
public ProviderUserRequest(ClientRegistration clientRegistration, OAuth2User oAuth2User) {
this(clientRegistration, oAuth2User, null);
}

public ProviderUserRequest(Member member) {
this(null, null, member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,9 @@ public void setSubscription(Subscription subscription) {
public void encodePassword(PasswordEncoder passwordEncoder) {
this.password = passwordEncoder.encode(this.password);
}

public void linkSocialAccount(String provider, String registrationId) {
this.provider = provider;
this.registrationId = registrationId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,35 @@
import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;

public record PrincipalUser(ProviderUser providerUser) implements UserDetails, OidcUser {
public record PrincipalUser(ProviderUser providerUser, Member member) implements UserDetails, OidcUser {

public PrincipalUser(ProviderUser providerUser) {
this(providerUser, null);
}

@Override
public String getName() {
return providerUser.getUsername();
return providerUser != null ? providerUser.getUsername() : member.getUsername();
}

@Override
public Map<String, Object> getAttributes() {
return providerUser.getAttributes();
return providerUser != null ? providerUser.getAttributes() : Map.of();
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return providerUser.getAuthorities();
return providerUser != null ? providerUser.getAuthorities() : member.getRole().getAuthorities();
}

@Override
public String getPassword() {
return providerUser.getPassword();
return providerUser != null ? providerUser.getPassword() : member.getPassword();
}

@Override
public String getUsername() {
return providerUser.getUsername();
return providerUser != null ? providerUser.getUsername() : member.getUsername();
}

@Override
Expand Down Expand Up @@ -63,11 +67,11 @@ public Map<String, Object> getClaims() {

@Override
public OidcUserInfo getUserInfo() {
return null;
return providerUser != null ? providerUser.getUserInfo() : null;
}

@Override
public OidcIdToken getIdToken() {
return null;
return providerUser != null ? providerUser.getIdToken() : null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.oidc.OidcIdToken;
import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.security.oauth2.core.user.OAuth2User;

public interface ProviderUser {
UUID getId();
String getId();

String getUsername();

Expand All @@ -25,4 +26,8 @@ public interface ProviderUser {
Map<String, Object> getAttributes();

OAuth2User getOAuth2User();

OidcIdToken getIdToken();

OidcUserInfo getUserInfo();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import java.util.UUID;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.oidc.OidcIdToken;
import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.security.oauth2.core.user.OAuth2User;

import com.synapse.account_service.domain.ProviderUser;
Expand All @@ -25,8 +27,8 @@ public class FormUser implements ProviderUser {
private List<? extends GrantedAuthority> authorities;

@Override
public UUID getId() {
return id;
public String getId() {
return id.toString();
}

@Override
Expand Down Expand Up @@ -68,4 +70,14 @@ public Map<String, Object> getAttributes() {
public OAuth2User getOAuth2User() {
return null;
}

@Override
public OidcIdToken getIdToken() {
return null;
}

@Override
public OidcUserInfo getUserInfo() {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.synapse.account_service.domain.socials;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.core.oidc.OidcIdToken;
import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.oauth2.core.user.OAuth2User;

import com.synapse.account_service.domain.ProviderUser;

public class GoogleUser implements ProviderUser {

private Map<String, Object> attributes;
private OAuth2User oAuth2User;
private ClientRegistration clientRegistration;

public GoogleUser(Map<String, Object> attributes, OAuth2User oAuth2User, ClientRegistration clientRegistration) {
this.attributes = attributes;
this.oAuth2User = oAuth2User;
this.clientRegistration = clientRegistration;
}

@Override
public String getId() {
return (String) getAttributes().get("sub");
}

@Override
public String getUsername() {
return (String) getAttributes().get("name");
}

@Override
public String getPicture() {
return null;
}

@Override
public String getPassword() {
return UUID.randomUUID().toString();
}

@Override
public String getEmail() {
return (String) attributes.get("email");
}

@Override
public String getProvider() {
return clientRegistration.getRegistrationId();
}

@Override
public List<? extends GrantedAuthority> getAuthorities() {
return oAuth2User.getAuthorities().stream()
.map(authority -> new SimpleGrantedAuthority(authority.getAuthority())).collect(Collectors.toList());
}

@Override
public Map<String, Object> getAttributes() {
return this.attributes;
}

@Override
public OAuth2User getOAuth2User() {
return this.oAuth2User;
}

@Override
public OidcIdToken getIdToken() {
if(oAuth2User instanceof OidcUser) {
OidcUser oidcUser = (OidcUser) oAuth2User;
return oidcUser.getIdToken();
}
return null;
}

@Override
public OidcUserInfo getUserInfo() {
if(oAuth2User instanceof OidcUser) {
OidcUser oidcUser = (OidcUser) oAuth2User;
return oidcUser.getUserInfo();
}
return null;
}

}
Loading
Loading