Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e9f2616
add: base paseto configuration
utsav0209 Oct 8, 2021
12253c2
BLD: Added JPaseto dependency
utsav0209 Oct 12, 2021
e1fda4f
CLN: Removed redundant isEnabled() in PasetoConfiguration interface
utsav0209 Oct 12, 2021
2f01114
BLD: Removed unnecessary dependencies
utsav0209 Oct 12, 2021
6902722
CLN: Cleaned build.gradle for security-paseto submodule
utsav0209 Oct 12, 2021
7fa3bfb
ENH: Added Paseto token generator
utsav0209 Oct 12, 2021
7d4e293
ENH: Added Paseto token validator
utsav0209 Oct 12, 2021
a641390
ENH: Added Shared secret property for LOCAL version
utsav0209 Oct 13, 2021
64a6ba5
ENH: Migrated paseto token configuration properties to enum types
utsav0209 Oct 13, 2021
0b16982
ENH: Added builder methods for default Paseto claims
utsav0209 Oct 13, 2021
d496a37
ENH: Added paseto generic paseto claim validator
utsav0209 Oct 15, 2021
26edf5f
ENH: Added Not before Paseto claims validator
utsav0209 Oct 15, 2021
ac7bd9f
flesh out implementation
sdelamo Oct 15, 2021
cee6b00
move token logic to micronaut-security
sdelamo Oct 18, 2021
d41fa8e
move code to security from security-jwt
sdelamo Oct 18, 2021
af86085
add missing javado
sdelamo Oct 18, 2021
e3adea3
bump up project version to 4.0.0-SNAPSHOT
sdelamo Oct 18, 2021
a67e08f
build: bump up micronaut version to 3.1.0
sdelamo Oct 18, 2021
5f49feb
remove classes which are now in security
sdelamo Oct 18, 2021
5a9f608
add doc to end javadoc sentence
sdelamo Oct 18, 2021
c9c69bf
change prefix to correct prefix
sdelamo Oct 18, 2021
77cf932
Merge branch 'master' into paseto
sdelamo Oct 18, 2021
64aba85
Merge branch 'master' into paseto
sdelamo May 16, 2023
e2f3cec
delete paseto module
sdelamo May 16, 2023
44d4bcf
micronaut http compileOnly
sdelamo May 16, 2023
d663686
remove paseto
sdelamo May 16, 2023
33b3501
make http optional
sdelamo May 16, 2023
3530260
http free more
sdelamo May 16, 2023
2829a69
accept breaking changes
sdelamo May 17, 2023
254de29
accept breaking changes
sdelamo May 17, 2023
59049f4
remove unused import
sdelamo May 17, 2023
97e00a0
add breaks
sdelamo May 17, 2023
92e6fe6
revert version change
sdelamo May 17, 2023
3bf4ca3
more breaks
sdelamo May 17, 2023
8e446ba
more breaks
sdelamo May 17, 2023
5929882
more breaks
sdelamo May 17, 2023
2095eec
more breaks
sdelamo May 17, 2023
736c1f4
more breaks
sdelamo May 17, 2023
95c5d54
more breaks
sdelamo May 17, 2023
1df69fa
annotate with @Nullable
sdelamo May 17, 2023
fdcc2b1
add javadoc
sdelamo May 17, 2023
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
@@ -1,6 +1,5 @@
repositories {
mavenCentral()
maven { url "https://s01.oss.sonatype.org/content/repositories/snapshots/" }
}

tasks.withType(Test) {
Expand Down
1,345 changes: 1,345 additions & 0 deletions config/accepted-api-changes.json

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ unboundid-ldapsdk = "6.0.8"
bouncycastle = "1.70"
kotlin = "1.8.21"
bcpkix = "1.70"

micronaut-test = "4.0.0-M3"
micronaut-multitenancy = "5.0.0-M2"
micronaut-reactor = "3.0.0-M1"
Expand Down
8 changes: 4 additions & 4 deletions security-jwt/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ plugins {
dependencies {
annotationProcessor(mn.micronaut.graal)
annotationProcessor(mnSerde.micronaut.serde.processor)
implementation(mnSerde.micronaut.serde.jackson)
annotationProcessor(mnValidation.micronaut.validation.processor)
api(mnValidation.micronaut.validation)
api(mn.micronaut.http)
api(mn.micronaut.http.server)
api(projects.micronautSecurity)
api(libs.managed.nimbus.jose.jwt)

implementation(mnReactor.micronaut.reactor)
testImplementation(libs.bcpkix.jdk15on)
testImplementation(libs.bcprov.jdk15on)

compileOnly(mn.micronaut.http.server)
compileOnly(mn.micronaut.json.core)

testImplementation(mn.micronaut.management)
testImplementation(mn.micronaut.http.client)
testAnnotationProcessor(mn.micronaut.inject.java)
testImplementation(mnSerde.micronaut.serde.jackson)
testImplementation(mn.micronaut.http.server.netty)
testImplementation(projects.testSuiteUtils)
testImplementation(projects.testSuiteUtilsSecurity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
* @since 1.1.0
* @author Sergio del Amo
*/
@Requires(classes = { Controller.class })
@Requires(property = KeysControllerConfigurationProperties.PREFIX + ".enabled", notEquals = StringUtils.FALSE, defaultValue = StringUtils.TRUE)
@Requires(beans = JwkProvider.class)
@Controller("${" + KeysControllerConfigurationProperties.PREFIX + ".path:/keys}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
import com.nimbusds.jwt.PlainJWT;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.claims.ClaimsGenerator;
import io.micronaut.security.token.generator.TokenGenerator;
import io.micronaut.security.token.jwt.encryption.EncryptionConfiguration;
import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator;
import io.micronaut.security.token.jwt.signature.SignatureGeneratorConfiguration;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import io.micronaut.core.annotation.Nullable;
import io.micronaut.runtime.ApplicationConfiguration;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.Claims;
import io.micronaut.security.token.claims.ClaimsAudienceProvider;
import io.micronaut.security.token.claims.ClaimsGenerator;
import io.micronaut.security.token.claims.JtiGenerator;
import io.micronaut.security.token.config.TokenConfiguration;
import jakarta.inject.Singleton;
import java.time.Instant;
Expand All @@ -43,7 +47,7 @@ public class JWTClaimsSetGenerator implements ClaimsGenerator {
private static final String ROLES_KEY = "rolesKey";

private final TokenConfiguration tokenConfiguration;
private final JwtIdGenerator jwtIdGenerator;
private final JtiGenerator jwtIdGenerator;
private final ClaimsAudienceProvider claimsAudienceProvider;
private final String appName;

Expand All @@ -54,7 +58,7 @@ public class JWTClaimsSetGenerator implements ClaimsGenerator {
* @param applicationConfiguration The application configuration
*/
public JWTClaimsSetGenerator(TokenConfiguration tokenConfiguration,
@Nullable JwtIdGenerator jwtIdGenerator,
@Nullable JtiGenerator jwtIdGenerator,
@Nullable ClaimsAudienceProvider claimsAudienceProvider,
@Nullable ApplicationConfiguration applicationConfiguration) {
this.tokenConfiguration = tokenConfiguration;
Expand Down Expand Up @@ -189,7 +193,7 @@ protected void populateWithAuthentication(JWTClaimsSet.Builder builder, Authenti
@Override
public Map<String, Object> generateClaimsSet(Map<String, ?> oldClaims, Integer expiration) {
JWTClaimsSet.Builder builder = new JWTClaimsSet.Builder();
List<String> excludedClaims = Arrays.asList(JwtClaims.EXPIRATION_TIME, JwtClaims.ISSUED_AT, JwtClaims.NOT_BEFORE);
List<String> excludedClaims = Arrays.asList(Claims.EXPIRATION_TIME, Claims.ISSUED_AT, Claims.NOT_BEFORE);
for (String k : oldClaims.keySet()
.stream()
.filter(p -> !excludedClaims.contains(p))
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,17 @@
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.security.token.Claims;

import java.util.Set;

/**
* Adapts from {@link JWTClaimsSet} to {@link JwtClaims}.
* Adapts from {@link JWTClaimsSet} to {@link Claims}.
*
* @author Sergio del Amo
* @since 1.1.0
*/
public class JwtClaimsSetAdapter implements JwtClaims {
public class JwtClaimsSetAdapter implements Claims {

private final JWTClaimsSet jwtClaimsSet;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,13 @@
*/
package io.micronaut.security.token.jwt.validator;

import java.util.List;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import jakarta.inject.Singleton;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -32,10 +31,11 @@
* @author Jason Schindler
* @author Sergio del Amo
* @since 2.4.0
* @param <T> Request
*/
@Singleton
@Requires(property = JwtClaimsValidatorConfigurationProperties.PREFIX + ".audience")
public class AudienceJwtClaimsValidator implements GenericJwtClaimsValidator {
public class AudienceJwtClaimsValidator<T> implements GenericJwtClaimsValidator<T> {

private static final Logger LOG = LoggerFactory.getLogger(AudienceJwtClaimsValidator.class);

Expand Down Expand Up @@ -80,8 +80,8 @@ protected boolean validate(JWTClaimsSet claimsSet) {
}

@Override
public boolean validate(@NonNull JwtClaims claims,
@Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims,
@Nullable T request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@
import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.AbstractTokenAuthenticationFactory;
import io.micronaut.security.token.MapClaims;
import io.micronaut.security.token.RolesFinder;
import io.micronaut.security.token.config.TokenConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.inject.Singleton;
import java.text.ParseException;
import java.util.Map;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Extracts the JWT claims and uses the {@link AuthenticationJWTClaimsSetAdapter} to construction an {@link Authentication} object.
Expand All @@ -34,17 +35,18 @@
* @since 1.1.0
*/
@Singleton
public class DefaultJwtAuthenticationFactory implements JwtAuthenticationFactory {
public class DefaultJwtAuthenticationFactory extends AbstractTokenAuthenticationFactory<JWT> implements JwtAuthenticationFactory {

private static final Logger LOG = LoggerFactory.getLogger(DefaultJwtAuthenticationFactory.class);

private final TokenConfiguration tokenConfiguration;
private final RolesFinder rolesFinder;

/**
*
* @param tokenConfiguration Token Configuration
* @param rolesFinder Utility to retrieve roles from token claims
*/
public DefaultJwtAuthenticationFactory(TokenConfiguration tokenConfiguration,
RolesFinder rolesFinder) {
this.tokenConfiguration = tokenConfiguration;
this.rolesFinder = rolesFinder;
super(tokenConfiguration, rolesFinder);
}

@Override
Expand All @@ -54,11 +56,7 @@ public Optional<Authentication> createAuthentication(JWT token) {
if (claimSet == null) {
return Optional.empty();
}
Map<String, Object> attributes = claimSet.getClaims();
return usernameForClaims(claimSet).map(username ->
Authentication.build(username,
rolesFinder.resolveRoles(attributes),
attributes));
return createAuthentication(claimSet.getClaims());
} catch (ParseException e) {
if (LOG.isErrorEnabled()) {
LOG.error("ParseException creating authentication", e);
Expand All @@ -71,13 +69,11 @@ public Optional<Authentication> createAuthentication(JWT token) {
*
* @param claimSet JWT Claims
* @return the username defined by {@link TokenConfiguration#getNameKey()} ()} or the sub claim.
* @deprecated Use {@link AbstractTokenAuthenticationFactory#usernameForClaims(io.micronaut.security.token.Claims)} instead.
* @throws ParseException might be thrown parsing claims
*/
@Deprecated
protected Optional<String> usernameForClaims(JWTClaimsSet claimSet) throws ParseException {
String username = claimSet.getStringClaim(tokenConfiguration.getNameKey());
if (username == null) {
return Optional.ofNullable(claimSet.getSubject());
}
return Optional.of(username);
return super.usernameForClaims(new MapClaims(claimSet.getClaims()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,22 @@
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.util.StringUtils;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import jakarta.inject.Singleton;
import java.util.Date;
import io.micronaut.security.token.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.inject.Singleton;
import java.util.Date;

/**
* Validate JWT is not expired.
*
* @author Sergio del Amo
* @since 1.1.0
* @param <T> Request
*/
@Singleton
@Requires(property = JwtClaimsValidatorConfigurationProperties.PREFIX + ".expiration", notEquals = StringUtils.FALSE)
public class ExpirationJwtClaimsValidator implements GenericJwtClaimsValidator {
public class ExpirationJwtClaimsValidator<T> implements GenericJwtClaimsValidator<T> {

private static final Logger LOG = LoggerFactory.getLogger(ExpirationJwtClaimsValidator.class);

Expand All @@ -59,7 +59,7 @@ protected boolean validate(@NonNull JWTClaimsSet claimsSet) {
}

@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable T request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
*
* @author Sergio del Amo
* @since 1.1.0
* @param <T> Request
*/
public interface GenericJwtClaimsValidator extends JwtClaimsValidator {
public interface GenericJwtClaimsValidator<T> extends JwtClaimsValidator<T> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -30,10 +29,11 @@
* @author Jason Schindler
* @author Sergio del Amo
* @since 2.4.0
* @param <T> Request
*/
@Singleton
@Requires(property = IssuerJwtClaimsValidator.ISSUER_PROP)
public class IssuerJwtClaimsValidator implements GenericJwtClaimsValidator {
public class IssuerJwtClaimsValidator<T> implements GenericJwtClaimsValidator<T> {

public static final String ISSUER_PROP = JwtClaimsValidatorConfigurationProperties.PREFIX + ".issuer";

Expand All @@ -54,11 +54,11 @@ public IssuerJwtClaimsValidator(JwtClaimsValidatorConfiguration jwtClaimsValidat
}

@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable T request) {
if (expectedIssuer == null) {
return true;
}
Object issuerObject = claims.get(JwtClaims.ISSUER);
Object issuerObject = claims.get(Claims.ISSUER);
if (issuerObject == null) {
if (LOG.isTraceEnabled()) {
LOG.trace("Expected JWT issuer claim of '{}', but the token did not include an issuer.", expectedIssuer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
package io.micronaut.security.token.jwt.validator;

import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;

/**
* Utils class to instantiate a JWClaimsSet give a map of claims.
Expand All @@ -34,7 +34,7 @@ private JWTClaimsSetUtils() {
* @param claims JWT claims
* @return A JWTClaimsSet
*/
public static JWTClaimsSet jwtClaimsSetFromClaims(JwtClaims claims) {
public static JWTClaimsSet jwtClaimsSetFromClaims(Claims claims) {
JWTClaimsSet.Builder claimsSetBuilder = new JWTClaimsSet.Builder();
for (String k : claims.names()) {
claimsSetBuilder.claim(k, claims.get(k));
Expand Down
Loading