diff --git a/framework/src/main/java/io/theurl/framework/security/AccountExpiredException.java b/framework/src/main/java/io/theurl/framework/security/AccountExpiredException.java new file mode 100644 index 0000000..182e66c --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/AccountExpiredException.java @@ -0,0 +1,20 @@ +package io.theurl.framework.security; + +/** + * Exception thrown when an account has expired and can no longer be used for authentication or access. + * Carries the identity of the expired account for diagnostics. + */ +@SuppressWarnings("unused") +public class AccountExpiredException extends AccountException { + public AccountExpiredException(String identity) { + super(identity); + } + + public AccountExpiredException(String identity, String message) { + super(identity, message); + } + + public AccountExpiredException(String identity, String message, Throwable cause) { + super(identity, message, cause); + } +} diff --git a/framework/src/main/java/io/theurl/framework/security/AccountNotFoundException.java b/framework/src/main/java/io/theurl/framework/security/AccountNotFoundException.java new file mode 100644 index 0000000..096afa3 --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/AccountNotFoundException.java @@ -0,0 +1,20 @@ +package io.theurl.framework.security; + +/** + * Exception thrown when an account with the specified identity cannot be found. + * Carries the identity of the missing account for diagnostics. + */ +@SuppressWarnings("unused") +public class AccountNotFoundException extends AccountException { + public AccountNotFoundException(String identity) { + super(identity); + } + + public AccountNotFoundException(String identity, String message) { + super(identity, message); + } + + public AccountNotFoundException(String identity, String message, Throwable cause) { + super(identity, message, cause); + } +} diff --git a/framework/src/main/java/io/theurl/framework/security/CredentialException.java b/framework/src/main/java/io/theurl/framework/security/CredentialException.java index 442983b..23eb7e3 100644 --- a/framework/src/main/java/io/theurl/framework/security/CredentialException.java +++ b/framework/src/main/java/io/theurl/framework/security/CredentialException.java @@ -9,25 +9,25 @@ */ @SuppressWarnings("unused") public class CredentialException extends RuntimeException { - private final String credential; + private final Object credential; private final Map details = Collections.emptyMap(); - public CredentialException(String credential) { + public CredentialException(Object credential) { this.credential = credential; } - public CredentialException(String credential, String message) { + public CredentialException(Object credential, String message) { super(message); this.credential = credential; } - public CredentialException(String credential, String message, Throwable cause) { + public CredentialException(Object credential, String message, Throwable cause) { super(message, cause); this.credential = credential; } - public String getCredential() { + public Object getCredential() { return credential; } diff --git a/framework/src/main/java/io/theurl/framework/security/CredentialExpiredException.java b/framework/src/main/java/io/theurl/framework/security/CredentialExpiredException.java new file mode 100644 index 0000000..442d0be --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/CredentialExpiredException.java @@ -0,0 +1,16 @@ +package io.theurl.framework.security; + +@SuppressWarnings("unused") +public class CredentialExpiredException extends CredentialException { + public CredentialExpiredException(Object credential) { + super(credential); + } + + public CredentialExpiredException(Object credential, String message) { + super(credential, message); + } + + public CredentialExpiredException(Object credential, String message, Throwable cause) { + super(credential, message, cause); + } +} diff --git a/framework/src/main/java/io/theurl/framework/security/CredentialIncorrectException.java b/framework/src/main/java/io/theurl/framework/security/CredentialIncorrectException.java new file mode 100644 index 0000000..9537ee9 --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/CredentialIncorrectException.java @@ -0,0 +1,16 @@ +package io.theurl.framework.security; + +@SuppressWarnings("unused") +public class CredentialIncorrectException extends CredentialException { + public CredentialIncorrectException(Object credential) { + super(credential); + } + + public CredentialIncorrectException(Object credential, String message) { + super(credential, message); + } + + public CredentialIncorrectException(Object credential, String message, Throwable cause) { + super(credential, message, cause); + } +} diff --git a/framework/src/main/java/io/theurl/framework/security/CredentialNotFoundException.java b/framework/src/main/java/io/theurl/framework/security/CredentialNotFoundException.java new file mode 100644 index 0000000..2ba7558 --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/CredentialNotFoundException.java @@ -0,0 +1,16 @@ +package io.theurl.framework.security; + +@SuppressWarnings("unused") +public class CredentialNotFoundException extends CredentialException { + public CredentialNotFoundException(Object credential) { + super(credential); + } + + public CredentialNotFoundException(Object credential, String message) { + super(credential, message); + } + + public CredentialNotFoundException(Object credential, String message, Throwable cause) { + super(credential, message, cause); + } +} diff --git a/framework/src/main/java/io/theurl/framework/security/UserClaimTypes.java b/framework/src/main/java/io/theurl/framework/security/UserClaimTypes.java new file mode 100644 index 0000000..057d7d8 --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/UserClaimTypes.java @@ -0,0 +1,54 @@ +package io.theurl.framework.security; + +@SuppressWarnings("unused") +public class UserClaimTypes { + public static final String SUBJECT = "sub"; + public static final String NAME = "name"; + public static final String GIVEN_NAME = "given_name"; + public static final String FAMILY_NAME = "family_name"; + public static final String MIDDLE_NAME = "middle_name"; + public static final String NICKNAME = "nickname"; + public static final String PREFERRED_USER_NAME = "preferred_username"; + public static final String PROFILE = "profile"; + public static final String PICTURE = "picture"; + public static final String WEBSITE = "website"; + public static final String EMAIL = "email"; + public static final String EMAIL_VERIFIED = "email_verified"; + public static final String GENDER = "gender"; + public static final String BIRTHDATE = "birthdate"; + public static final String ZONE_INFO = "zoneinfo"; + public static final String LOCALE = "locale"; + public static final String PHONE_NUMBER = "phone_number"; + public static final String PHONE_NUMBER_VERIFIED = "phone_number_verified"; + public static final String ADDRESS = "address"; + public static final String AUDIENCE = "aud"; + public static final String ISSUER = "iss"; + public static final String NOT_BEFORE = "nbf"; + public static final String EXPIRATION = "exp"; + public static final String ISSUED_AT = "iat"; + public static final String UPDATED_AT = "updated_at"; + public static final String AUTHENTICATION_METHOD = "amr"; + public static final String SESSION_ID = "sid"; + public static final String AUTHENTICATION_CONTEXT_CLASS_REFERENCE = "acr"; + public static final String AUTHENTICATION_TIME = "auth_time"; + public static final String AUTHORIZED_PARTY = "azp"; + public static final String ACCESS_TOKEN_HASH = "at_hash"; + public static final String AUTHORIZATION_CODE_HASH = "c_hash"; + public static final String STATE_HASH = "s_hash"; + public static final String NONCE = "nonce"; + public static final String JWT_ID = "jti"; + public static final String EVENTS = "events"; + public static final String CLIENT_ID = "client_id"; + public static final String SCOPE = "scope"; + public static final String ACTOR = "act"; + public static final String MAY_ACT = "may_act"; + public static final String ID = "id"; + public static final String IDENTITY_PROVIDER = "idp"; + public static final String ROLE = "role"; + public static final String REFERENCE_TOKEN_ID = "reference_token_id"; + public static final String CONFIRMATION = "cnf"; + public static final String CODE = "code"; + public static final String GRANT_TYPE = "grant_type"; + public static final String TENANT = "tenant"; + public static final String SCHEME = "scheme"; +} diff --git a/framework/src/main/java/io/theurl/framework/security/UserPrincipal.java b/framework/src/main/java/io/theurl/framework/security/UserPrincipal.java new file mode 100644 index 0000000..6a230ed --- /dev/null +++ b/framework/src/main/java/io/theurl/framework/security/UserPrincipal.java @@ -0,0 +1,8 @@ +package io.theurl.framework.security; + +@SuppressWarnings("unused") +public class UserPrincipal { + public String getUserId() { + return null; + } +} diff --git a/identity/pom.xml b/identity/pom.xml index b942f2c..c899e4a 100644 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -28,6 +28,11 @@ mediator ${neroyun.mediator.version} + + io.jsonwebtoken + jjwt-api + 0.13.0 + org.springframework.boot spring-boot-starter-amqp @@ -89,11 +94,6 @@ spring-boot-starter-webflux-test test - - org.springframework - spring-web - 6.2.15 - diff --git a/identity/src/main/resources/application-dev.yaml b/identity/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..26e8472 --- /dev/null +++ b/identity/src/main/resources/application-dev.yaml @@ -0,0 +1,5 @@ +spring: + datasource: + url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou?currentSchema=public} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:nerosoft.8888} diff --git a/identity/src/main/resources/application.yaml b/identity/src/main/resources/application.yaml index 4a2de16..d682a50 100644 --- a/identity/src/main/resources/application.yaml +++ b/identity/src/main/resources/application.yaml @@ -2,6 +2,8 @@ server: port: 8901 spring: + profiles: + active: ${SPRING_PROFILES_ACTIVE:dev} application: name: identity config: @@ -9,8 +11,9 @@ spring: cloud: config: enabled: false + uri: ${CONFIG_SERVER_URI:http://localhost:8900} datasource: - url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou} + url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou?currentSchema=public} username: ${DB_USERNAME:postgres} password: ${DB_PASSWORD:postgres} driver-class-name: ${DB_DRIVER:org.postgresql.Driver} @@ -39,3 +42,11 @@ external-auth: microsoft: client-id: ${MICROSOFT_CLIENT_ID:your-microsoft-client-id} client-secret: ${MICROSOFT_CLIENT_SECRET:your-microsoft-client-secret} + +logging: + file: + path: logs + level: + io.theurl.identity: debug + org.springframework: info + root: info diff --git a/message/src/main/java/io/theurl/message/domain/aggregate/Template.java b/message/src/main/java/io/theurl/message/domain/aggregate/Template.java new file mode 100644 index 0000000..5a5bd56 --- /dev/null +++ b/message/src/main/java/io/theurl/message/domain/aggregate/Template.java @@ -0,0 +1,14 @@ +package io.theurl.message.domain.aggregate; + +import io.theurl.framework.domain.AggregateRoot; + +public class Template extends AggregateRoot { + /** + * Initializes the aggregate with the given id. + * + * @param id the identifier of the aggregate + */ + protected Template(Long id) { + super(id); + } +} diff --git a/message/src/main/resources/application-dev.yaml b/message/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..26e8472 --- /dev/null +++ b/message/src/main/resources/application-dev.yaml @@ -0,0 +1,5 @@ +spring: + datasource: + url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou?currentSchema=public} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:nerosoft.8888} diff --git a/message/src/main/resources/application.yaml b/message/src/main/resources/application.yaml index 2e0c22d..cefa816 100644 --- a/message/src/main/resources/application.yaml +++ b/message/src/main/resources/application.yaml @@ -2,15 +2,18 @@ server: port: 8902 spring: + profiles: + active: ${SPRING_PROFILES_ACTIVE:dev} application: name: message config: import: optional:file:.env[.properties] cloud: config: + enabled: false uri: ${CONFIG_SERVER_URI:http://localhost:8900} datasource: - url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou} + url: ${DB_URL:jdbc:postgresql://localhost:5432/linkyou?currentSchema=public} username: ${DB_USERNAME:postgres} password: ${DB_PASSWORD:postgres} driver-class-name: ${DB_DRIVER:org.postgresql.Driver} diff --git a/pom.xml b/pom.xml index 015d2d0..fd5231f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,15 +1,15 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 org.springframework.boot spring-boot-starter-parent 4.0.6 - io.theurl + io.theurl parent - 1.0 + 1.0 pom @@ -47,23 +47,24 @@ 25 25 2025.1.1 + 2025.1.0.0 4.0.6 true - 1.0.2 + 1.1.0 - - maven-org - Maven Central - https://repo1.maven.org/maven2/ - - - maven - Maven Official - https://mvnrepository.com/ - - + + maven-org + Maven Central + https://repo1.maven.org/maven2/ + + + maven + Maven Official + https://mvnrepository.com/ + + @@ -88,6 +89,13 @@ pom import + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import +