plate-auth calls this SPI whenever a membership is being granted or an invitation + * is being created. If this returns {@code false}, the operation is rejected.
+ * + *The default implementation ({@code PermissiveOrgValidator}) always returns {@code true} + * and logs a WARN on every call. Override this bean in production.
+ */ +public interface OrgValidator { + boolean exists(OrgType type, UUID orgId); +} diff --git a/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/DefaultOrgDisplayNameResolver.java b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/DefaultOrgDisplayNameResolver.java new file mode 100644 index 0000000..176ad4d --- /dev/null +++ b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/DefaultOrgDisplayNameResolver.java @@ -0,0 +1,17 @@ +package de.platesoft.auth.spi.defaults; + +import de.platesoft.auth.entity.OrgType; +import de.platesoft.auth.spi.OrgDisplayNameResolver; + +import java.util.UUID; + +/** + * Default display name resolver — returns type:orgId. + */ +public class DefaultOrgDisplayNameResolver implements OrgDisplayNameResolver { + + @Override + public String displayName(OrgType type, UUID orgId) { + return type + ":" + orgId.toString(); + } +} diff --git a/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingAccessRequestMailer.java b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingAccessRequestMailer.java new file mode 100644 index 0000000..7ac9b2a --- /dev/null +++ b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingAccessRequestMailer.java @@ -0,0 +1,25 @@ +package de.platesoft.auth.spi.defaults; + +import de.platesoft.auth.entity.AccessRequest; +import de.platesoft.auth.spi.AccessRequestMailer; +import lombok.extern.slf4j.Slf4j; + +/** + * Default AccessRequestMailer — logs notifications at INFO level. + */ +@Slf4j +public class LoggingAccessRequestMailer implements AccessRequestMailer { + + @Override + public void notifyAdmins(AccessRequest request) { + log.info("[plate-auth] Access request from user {} for {}/{} with role {}", + request.getRequester().getEmail(), request.getOrgType(), + request.getOrgId(), request.getRequestedRole()); + } + + @Override + public void notifyRequester(AccessRequest request) { + log.info("[plate-auth] Access request {} decided: {}", + request.getId(), request.getStatus()); + } +} diff --git a/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingInvitationMailer.java b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingInvitationMailer.java new file mode 100644 index 0000000..134fbab --- /dev/null +++ b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/LoggingInvitationMailer.java @@ -0,0 +1,19 @@ +package de.platesoft.auth.spi.defaults; + +import de.platesoft.auth.entity.Invitation; +import de.platesoft.auth.spi.InvitationMailer; +import lombok.extern.slf4j.Slf4j; + +/** + * Default InvitationMailer — logs the accept URL at INFO level. + */ +@Slf4j +public class LoggingInvitationMailer implements InvitationMailer { + + @Override + public void sendInvitation(Invitation invitation, String acceptUrl) { + log.info("[plate-auth] Invitation for {} to join {}/{} with role {}. Accept URL: {}", + invitation.getEmail(), invitation.getOrgType(), invitation.getOrgId(), + invitation.getRole(), acceptUrl); + } +} diff --git a/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/NoOpOnboardingHook.java b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/NoOpOnboardingHook.java new file mode 100644 index 0000000..d6fba06 --- /dev/null +++ b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/NoOpOnboardingHook.java @@ -0,0 +1,16 @@ +package de.platesoft.auth.spi.defaults; + +import de.platesoft.auth.entity.LoginProvider; +import de.platesoft.auth.entity.User; +import de.platesoft.auth.spi.OnboardingHook; + +/** + * Default OnboardingHook — no-op. + */ +public class NoOpOnboardingHook implements OnboardingHook { + + @Override + public void onFirstSignIn(User user, LoginProvider provider) { + // no-op — consumers override to wire their onboarding logic + } +} diff --git a/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/PermissiveOrgValidator.java b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/PermissiveOrgValidator.java new file mode 100644 index 0000000..9d9b926 --- /dev/null +++ b/plate-auth-starter/src/main/java/de/platesoft/auth/spi/defaults/PermissiveOrgValidator.java @@ -0,0 +1,22 @@ +package de.platesoft.auth.spi.defaults; + +import de.platesoft.auth.entity.OrgType; +import de.platesoft.auth.spi.OrgValidator; +import lombok.extern.slf4j.Slf4j; + +import java.util.UUID; + +/** + * Default OrgValidator that accepts all (org_type, org_id) pairs. + * Logs a WARN on every call to make it impossible to miss in production. + * Override this bean to implement real validation. + */ +@Slf4j +public class PermissiveOrgValidator implements OrgValidator { + + @Override + public boolean exists(OrgType type, UUID orgId) { + log.warn("OrgValidator default permissive — override de.platesoft.auth.spi.OrgValidator bean before production. Called with ({}, {})", type, orgId); + return true; + } +} diff --git a/plate-auth-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/plate-auth-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..29268ee --- /dev/null +++ b/plate-auth-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +de.platesoft.auth.PlateAuthAutoConfiguration