Commit e4eb0b693b618f5d46611a29a842ca2d010e998a
1 parent
b0000174
Ajuste nos escopos e correções no JWT
Showing
6 changed files
with
15 additions
and
20 deletions
Show diff stats
demoiselle-security-jwt/pom.xml
| @@ -26,14 +26,7 @@ | @@ -26,14 +26,7 @@ | ||
| 26 | <dependency> | 26 | <dependency> |
| 27 | <groupId>org.bitbucket.b_c</groupId> | 27 | <groupId>org.bitbucket.b_c</groupId> |
| 28 | <artifactId>jose4j</artifactId> | 28 | <artifactId>jose4j</artifactId> |
| 29 | - <version>0.4.1</version> | ||
| 30 | - </dependency> | ||
| 31 | - | ||
| 32 | - <dependency> | ||
| 33 | - <groupId>com.google.code.gson</groupId> | ||
| 34 | - <artifactId>gson</artifactId> | ||
| 35 | - <version>2.2.2</version> | ||
| 36 | - <scope>compile</scope> | 29 | + <version>0.5.2</version> |
| 37 | </dependency> | 30 | </dependency> |
| 38 | 31 | ||
| 39 | </dependencies> | 32 | </dependencies> |
demoiselle-security-jwt/src/main/java/org/demoiselle/jee/security/jwt/impl/TokensManagerImpl.java
| @@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletRequest; | @@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletRequest; | ||
| 14 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | 14 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; |
| 15 | import org.demoiselle.jee.core.interfaces.security.Token; | 15 | import org.demoiselle.jee.core.interfaces.security.Token; |
| 16 | import org.demoiselle.jee.core.interfaces.security.TokensManager; | 16 | import org.demoiselle.jee.core.interfaces.security.TokensManager; |
| 17 | +import org.jose4j.jwk.JsonWebKey; | ||
| 17 | import org.jose4j.jwk.RsaJsonWebKey; | 18 | import org.jose4j.jwk.RsaJsonWebKey; |
| 18 | import org.jose4j.jwk.RsaJwkGenerator; | 19 | import org.jose4j.jwk.RsaJwkGenerator; |
| 19 | import org.jose4j.jws.AlgorithmIdentifiers; | 20 | import org.jose4j.jws.AlgorithmIdentifiers; |
| @@ -47,7 +48,8 @@ public class TokensManagerImpl implements TokensManager { | @@ -47,7 +48,8 @@ public class TokensManagerImpl implements TokensManager { | ||
| 47 | 48 | ||
| 48 | public TokensManagerImpl() throws JoseException { | 49 | public TokensManagerImpl() throws JoseException { |
| 49 | if (rsaJsonWebKey == null) { | 50 | if (rsaJsonWebKey == null) { |
| 50 | - rsaJsonWebKey = (RsaJsonWebKey) RsaJsonWebKey.Factory.newPublicJwk(RsaJwkGenerator.generateJwk(2048).getKey()); | 51 | + String chave = RsaJwkGenerator.generateJwk(2048).toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE); |
| 52 | + rsaJsonWebKey = (RsaJsonWebKey) RsaJsonWebKey.Factory.newPublicJwk(chave); | ||
| 51 | rsaJsonWebKey.setKeyId("demoiselle-security-jwt"); | 53 | rsaJsonWebKey.setKeyId("demoiselle-security-jwt"); |
| 52 | } | 54 | } |
| 53 | } | 55 | } |
| @@ -61,7 +63,8 @@ public class TokensManagerImpl implements TokensManager { | @@ -61,7 +63,8 @@ public class TokensManagerImpl implements TokensManager { | ||
| 61 | .setAllowedClockSkewInSeconds(60) // allow some leeway in validating time based claims to account for clock skew | 63 | .setAllowedClockSkewInSeconds(60) // allow some leeway in validating time based claims to account for clock skew |
| 62 | .setExpectedIssuer("demoiselle") // whom the JWT needs to have been issued by | 64 | .setExpectedIssuer("demoiselle") // whom the JWT needs to have been issued by |
| 63 | .setExpectedAudience("demoiselle") // to whom the JWT is intended for | 65 | .setExpectedAudience("demoiselle") // to whom the JWT is intended for |
| 64 | - .setVerificationKey(rsaJsonWebKey.getKey()) // verify the signature with the public key | 66 | + .setDecryptionKey(rsaJsonWebKey.getPrivateKey()) // decrypt with the receiver's private key |
| 67 | + .setVerificationKey(rsaJsonWebKey.getPublicKey()) | ||
| 65 | .build(); // create the JwtConsumer instance | 68 | .build(); // create the JwtConsumer instance |
| 66 | JwtClaims jwtClaims = jwtConsumer.processToClaims(token.getKey()); | 69 | JwtClaims jwtClaims = jwtConsumer.processToClaims(token.getKey()); |
| 67 | loggedUser.setId((String) jwtClaims.getClaimValue("id")); | 70 | loggedUser.setId((String) jwtClaims.getClaimValue("id")); |
| @@ -102,14 +105,14 @@ public class TokensManagerImpl implements TokensManager { | @@ -102,14 +105,14 @@ public class TokensManagerImpl implements TokensManager { | ||
| 102 | 105 | ||
| 103 | JsonWebSignature jws = new JsonWebSignature(); | 106 | JsonWebSignature jws = new JsonWebSignature(); |
| 104 | jws.setPayload(claims.toJson()); | 107 | jws.setPayload(claims.toJson()); |
| 105 | - jws.setKey(rsaJsonWebKey.getKey()); | 108 | + jws.setKey(rsaJsonWebKey.getRsaPrivateKey()); |
| 106 | jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId()); | 109 | jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId()); |
| 107 | - jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA512); | 110 | + jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); |
| 108 | token.setKey(jws.getCompactSerialization()); | 111 | token.setKey(jws.getCompactSerialization()); |
| 109 | token.setType("JWT"); | 112 | token.setType("JWT"); |
| 110 | } catch (JoseException ex) { | 113 | } catch (JoseException ex) { |
| 111 | - ex.printStackTrace(); | ||
| 112 | - // logger.severe(ex.getMessage()); | 114 | + //ex.printStackTrace(); |
| 115 | + logger.severe(ex.getMessage()); | ||
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | } | 118 | } |
demoiselle-security-token/src/main/java/org/demoiselle/jee/security/token/impl/TokensManagerImpl.java
| @@ -8,7 +8,7 @@ package org.demoiselle.jee.security.token.impl; | @@ -8,7 +8,7 @@ package org.demoiselle.jee.security.token.impl; | ||
| 8 | import static java.util.UUID.randomUUID; | 8 | import static java.util.UUID.randomUUID; |
| 9 | import java.util.concurrent.ConcurrentHashMap; | 9 | import java.util.concurrent.ConcurrentHashMap; |
| 10 | import java.util.logging.Logger; | 10 | import java.util.logging.Logger; |
| 11 | -import javax.enterprise.context.Dependent; | 11 | +import javax.enterprise.context.ApplicationScoped; |
| 12 | import javax.inject.Inject; | 12 | import javax.inject.Inject; |
| 13 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | 13 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; |
| 14 | import org.demoiselle.jee.core.interfaces.security.Token; | 14 | import org.demoiselle.jee.core.interfaces.security.Token; |
| @@ -18,10 +18,10 @@ import org.demoiselle.jee.core.interfaces.security.TokensManager; | @@ -18,10 +18,10 @@ import org.demoiselle.jee.core.interfaces.security.TokensManager; | ||
| 18 | * | 18 | * |
| 19 | * @author 70744416353 | 19 | * @author 70744416353 |
| 20 | */ | 20 | */ |
| 21 | -@Dependent | 21 | +@ApplicationScoped |
| 22 | public class TokensManagerImpl implements TokensManager { | 22 | public class TokensManagerImpl implements TokensManager { |
| 23 | 23 | ||
| 24 | - private static ConcurrentHashMap<String, DemoisellePrincipal> repo = new ConcurrentHashMap<>(); | 24 | + private ConcurrentHashMap<String, DemoisellePrincipal> repo = new ConcurrentHashMap<>(); |
| 25 | 25 | ||
| 26 | @Inject | 26 | @Inject |
| 27 | private Logger logger; | 27 | private Logger logger; |
| @@ -56,7 +56,7 @@ public class TokensManagerImpl implements TokensManager { | @@ -56,7 +56,7 @@ public class TokensManagerImpl implements TokensManager { | ||
| 56 | 56 | ||
| 57 | @Override | 57 | @Override |
| 58 | public boolean validate() { | 58 | public boolean validate() { |
| 59 | - return getUser() != null && getUser().getId() != null; | 59 | + return getUser() != null; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | } | 62 | } |
demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java
| @@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
| 6 | */ | 6 | */ |
| 7 | package org.demoiselle.jee.security.impl; | 7 | package org.demoiselle.jee.security.impl; |
| 8 | 8 | ||
| 9 | +import javax.enterprise.context.Dependent; | ||
| 9 | import javax.enterprise.context.RequestScoped; | 10 | import javax.enterprise.context.RequestScoped; |
| 10 | import javax.inject.Inject; | 11 | import javax.inject.Inject; |
| 11 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | 12 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; |
demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java
| @@ -76,7 +76,6 @@ public class RequiredPermissionInterceptor implements Serializable { | @@ -76,7 +76,6 @@ public class RequiredPermissionInterceptor implements Serializable { | ||
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | if (!securityContext.hasPermission(resource, operation)) { | 78 | if (!securityContext.hasPermission(resource, operation)) { |
| 79 | - logger.severe(bundle.doesNotHavePermission(operation, resource)); | ||
| 80 | throw new DemoiselleSecurityException(bundle.doesNotHavePermission(operation, resource), UNAUTHORIZED.getStatusCode()); | 79 | throw new DemoiselleSecurityException(bundle.doesNotHavePermission(operation, resource), UNAUTHORIZED.getStatusCode()); |
| 81 | } | 80 | } |
| 82 | 81 |
demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java
| @@ -83,7 +83,6 @@ public class RequiredRoleInterceptor implements Serializable { | @@ -83,7 +83,6 @@ public class RequiredRoleInterceptor implements Serializable { | ||
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | if (userRoles.isEmpty()) { | 85 | if (userRoles.isEmpty()) { |
| 86 | - logger.severe(bundle.doesNotHaveRole(roles.toString())); | ||
| 87 | throw new DemoiselleSecurityException(bundle.doesNotHaveRole(roles.toString()), UNAUTHORIZED.getStatusCode()); | 86 | throw new DemoiselleSecurityException(bundle.doesNotHaveRole(roles.toString()), UNAUTHORIZED.getStatusCode()); |
| 88 | } | 87 | } |
| 89 | 88 |