Commit 6e126b792415a4bf742c96d2165e494f6fcf473c

Authored by PauloGladson
1 parent ffe576b7

Segurança e ajustes nos pacotes

demoiselle-core/src/main/java/org/demoiselle/jee/core/interfaces/security/DemoisellePrincipal.java
@@ -26,4 +26,6 @@ public interface DemoisellePrincipal extends Principal { @@ -26,4 +26,6 @@ public interface DemoisellePrincipal extends Principal {
26 public List<String> getRoles(); 26 public List<String> getRoles();
27 27
28 public Map<String, String> getPermissions(); 28 public Map<String, String> getPermissions();
  29 +
  30 + public void setPermissions(Map<String, String> permissions);
29 } 31 }
demoiselle-core/src/main/java/org/demoiselle/jee/core/interfaces/security/SecurityContext.java
@@ -66,8 +66,8 @@ public interface SecurityContext extends Serializable { @@ -66,8 +66,8 @@ public interface SecurityContext extends Serializable {
66 * @return the user logged in a specific authenticated session. If there is 66 * @return the user logged in a specific authenticated session. If there is
67 * no active session {@code null} is returned. 67 * no active session {@code null} is returned.
68 */ 68 */
69 - Principal getUser(); 69 + DemoisellePrincipal getUser();
70 70
71 - void setUser(Principal loggedUser); 71 + void setUser(DemoisellePrincipal loggedUser);
72 72
73 } 73 }
demoiselle-core/src/main/java/org/demoiselle/jee/core/interfaces/security/TokensManager.java
@@ -20,9 +20,9 @@ import java.util.Map; @@ -20,9 +20,9 @@ import java.util.Map;
20 */ 20 */
21 public interface TokensManager extends Serializable { 21 public interface TokensManager extends Serializable {
22 22
23 - public Principal getUser(); 23 + public DemoisellePrincipal getUser();
24 24
25 - public void setUser(Principal user); 25 + public void setUser(DemoisellePrincipal user);
26 26
27 public boolean validate(); 27 public boolean validate();
28 28
demoiselle-security-basic/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManagerImpl.java
@@ -5,14 +5,8 @@ @@ -5,14 +5,8 @@
5 */ 5 */
6 package org.demoiselle.jee.security.basic.impl; 6 package org.demoiselle.jee.security.basic.impl;
7 7
8 -import java.security.Principal;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -import java.util.UUID;  
12 -import java.util.concurrent.ConcurrentHashMap;  
13 import java.util.logging.Logger; 8 import java.util.logging.Logger;
14 import javax.enterprise.context.Dependent; 9 import javax.enterprise.context.Dependent;
15 -import javax.enterprise.context.RequestScoped;  
16 import javax.inject.Inject; 10 import javax.inject.Inject;
17 import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; 11 import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
18 import org.demoiselle.jee.core.interfaces.security.Token; 12 import org.demoiselle.jee.core.interfaces.security.Token;
@@ -25,24 +19,20 @@ import org.demoiselle.jee.core.interfaces.security.TokensManager; @@ -25,24 +19,20 @@ import org.demoiselle.jee.core.interfaces.security.TokensManager;
25 @Dependent 19 @Dependent
26 public class TokensManagerImpl implements TokensManager { 20 public class TokensManagerImpl implements TokensManager {
27 21
28 - private static ConcurrentHashMap<String, Principal> repo = new ConcurrentHashMap<>();  
29 -  
30 @Inject 22 @Inject
31 private Logger logger; 23 private Logger logger;
32 24
33 @Inject 25 @Inject
34 - @RequestScoped  
35 private Token token; 26 private Token token;
36 27
37 @Inject 28 @Inject
38 - @RequestScoped  
39 - private Principal loggedUser; 29 + private DemoisellePrincipal loggedUser;
40 30
41 @Override 31 @Override
42 - public Principal getUser() { 32 + public DemoisellePrincipal getUser() {
43 if (loggedUser == null) { 33 if (loggedUser == null) {
44 if (token.getKey() != null && !token.getKey().isEmpty()) { 34 if (token.getKey() != null && !token.getKey().isEmpty()) {
45 - loggedUser = repo.get(token.getKey()); 35 + // desfaz o basic
46 return loggedUser; 36 return loggedUser;
47 } 37 }
48 } 38 }
@@ -50,14 +40,9 @@ public class TokensManagerImpl implements TokensManager { @@ -50,14 +40,9 @@ public class TokensManagerImpl implements TokensManager {
50 } 40 }
51 41
52 @Override 42 @Override
53 - public void setUser(Principal user) { 43 + public void setUser(DemoisellePrincipal user) {
54 String value = null; 44 String value = null;
55 - if (!repo.containsValue(user)) {  
56 - value = UUID.randomUUID().toString();  
57 - repo.put(value, user);  
58 - token.setKey(value);  
59 - token.setType("Basic");  
60 - } 45 +
61 } 46 }
62 47
63 @Override 48 @Override
@@ -65,6 +50,4 @@ public class TokensManagerImpl implements TokensManager { @@ -65,6 +50,4 @@ public class TokensManagerImpl implements TokensManager {
65 return true;//(getUser() != null && repo.get(token.getKey()).); 50 return true;//(getUser() != null && repo.get(token.getKey()).);
66 } 51 }
67 52
68 -  
69 -  
70 } 53 }
demoiselle-security-jwt/src/main/java/org/demoiselle/jee/security/jwt/impl/TokensManagerImpl.java
@@ -13,8 +13,9 @@ import java.util.logging.Logger; @@ -13,8 +13,9 @@ import java.util.logging.Logger;
13 import javax.enterprise.context.Dependent; 13 import javax.enterprise.context.Dependent;
14 import javax.inject.Inject; 14 import javax.inject.Inject;
15 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletRequest;
16 -import org.demoiselle.jee.core.security.LoggedUser;  
17 -import org.demoiselle.jee.core.security.TokensManager; 16 +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
  17 +import org.demoiselle.jee.core.interfaces.security.Token;
  18 +import org.demoiselle.jee.core.interfaces.security.TokensManager;
18 import org.jose4j.jwk.RsaJsonWebKey; 19 import org.jose4j.jwk.RsaJsonWebKey;
19 import org.jose4j.jwk.RsaJwkGenerator; 20 import org.jose4j.jwk.RsaJwkGenerator;
20 import org.jose4j.jws.AlgorithmIdentifiers; 21 import org.jose4j.jws.AlgorithmIdentifiers;
@@ -40,6 +41,12 @@ public class TokensManagerImpl implements TokensManager { @@ -40,6 +41,12 @@ public class TokensManagerImpl implements TokensManager {
40 @Inject 41 @Inject
41 private Logger logger; 42 private Logger logger;
42 43
  44 + @Inject
  45 + private Token token;
  46 +
  47 + @Inject
  48 + private DemoisellePrincipal loggedUser;
  49 +
43 public TokensManagerImpl() throws JoseException { 50 public TokensManagerImpl() throws JoseException {
44 RsaJsonWebKey chave = RsaJwkGenerator.generateJwk(2048); 51 RsaJsonWebKey chave = RsaJwkGenerator.generateJwk(2048);
45 logger.info("Se você quiser usar sua app em cluster, coloque o parametro jwt.key no app.properties e reinicie a aplicacao"); 52 logger.info("Se você quiser usar sua app em cluster, coloque o parametro jwt.key no app.properties e reinicie a aplicacao");
@@ -50,34 +57,31 @@ public class TokensManagerImpl implements TokensManager { @@ -50,34 +57,31 @@ public class TokensManagerImpl implements TokensManager {
50 } 57 }
51 58
52 @Override 59 @Override
53 - public LoggedUser getUser(String jwt) {  
54 - LoggedUser usuario = null;  
55 - if (jwt != null && !jwt.isEmpty()) {  
56 - JwtConsumer jwtConsumer = new JwtConsumerBuilder()  
57 - .setRequireExpirationTime() // the JWT must have an expiration time  
58 - .setAllowedClockSkewInSeconds(60) // allow some leeway in validating time based claims to account for clock skew  
59 - .setExpectedIssuer("demoiselle") // whom the JWT needs to have been issued by  
60 - .setExpectedAudience("demoiselle") // to whom the JWT is intended for  
61 - .setVerificationKey(rsaJsonWebKey.getKey()) // verify the signature with the public key  
62 - .build(); // create the JwtConsumer instance  
63 - 60 + public DemoisellePrincipal getUser() {
  61 + if (token.getKey() != null && !token.getKey().isEmpty()) {
64 try { 62 try {
65 - JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);  
66 - usuario = new Gson().fromJson((String) jwtClaims.getClaimValue("user"), LoggedUser.class);  
67 - 63 + JwtConsumer jwtConsumer = new JwtConsumerBuilder()
  64 + .setRequireExpirationTime() // the JWT must have an expiration time
  65 + .setAllowedClockSkewInSeconds(60) // allow some leeway in validating time based claims to account for clock skew
  66 + .setExpectedIssuer("demoiselle") // whom the JWT needs to have been issued by
  67 + .setExpectedAudience("demoiselle") // to whom the JWT is intended for
  68 + .setVerificationKey(rsaJsonWebKey.getKey()) // verify the signature with the public key
  69 + .build(); // create the JwtConsumer instance
  70 + JwtClaims jwtClaims = jwtConsumer.processToClaims(token.getKey());
  71 + loggedUser = new Gson().fromJson((String) jwtClaims.getClaimValue("user"), DemoisellePrincipal.class);
68 String ip = httpRequest.getRemoteAddr(); 72 String ip = httpRequest.getRemoteAddr();
69 if (!ip.equalsIgnoreCase((String) jwtClaims.getClaimValue("ip"))) { 73 if (!ip.equalsIgnoreCase((String) jwtClaims.getClaimValue("ip"))) {
70 - usuario = null; 74 + return null;
71 } 75 }
72 - } catch (InvalidJwtException e) {  
73 - //Logger.getLogger(TokenRepository.class.getName()).log(Level.SEVERE, null, e); 76 + } catch (InvalidJwtException ex) {
  77 + logger.severe(ex.getMessage());
74 } 78 }
75 } 79 }
76 - return usuario; 80 + return loggedUser;
77 } 81 }
78 82
79 @Override 83 @Override
80 - public String setUser(LoggedUser user) { 84 + public void setUser(DemoisellePrincipal user) {
81 try { 85 try {
82 JwtClaims claims = new JwtClaims(); 86 JwtClaims claims = new JwtClaims();
83 claims.setIssuer("demoiselle"); 87 claims.setIssuer("demoiselle");
@@ -95,12 +99,16 @@ public class TokensManagerImpl implements TokensManager { @@ -95,12 +99,16 @@ public class TokensManagerImpl implements TokensManager {
95 jws.setKey(rsaJsonWebKey.getPrivateKey()); 99 jws.setKey(rsaJsonWebKey.getPrivateKey());
96 jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId()); 100 jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId());
97 jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); 101 jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
98 - return jws.getCompactSerialization(); 102 + token.setKey(jws.getCompactSerialization());
99 } catch (JoseException ex) { 103 } catch (JoseException ex) {
100 logger.severe(ex.getMessage()); 104 logger.severe(ex.getMessage());
101 } 105 }
102 - return null;  
103 106
104 } 107 }
105 108
  109 + @Override
  110 + public boolean validate() {
  111 + return true;
  112 + }
  113 +
106 } 114 }
demoiselle-security-token/src/main/java/org/demoiselle/jee/security/basic/impl/TokensManagerImpl.java
@@ -1,90 +0,0 @@ @@ -1,90 +0,0 @@
1 -/*  
2 - * To change this license header, choose License Headers in Project Properties.  
3 - * To change this template file, choose Tools | Templates  
4 - * and open the template in the editor.  
5 - */  
6 -package org.demoiselle.jee.security.basic.impl;  
7 -  
8 -import java.security.Principal;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -import java.util.UUID;  
12 -import java.util.concurrent.ConcurrentHashMap;  
13 -import java.util.logging.Logger;  
14 -import javax.enterprise.context.Dependent;  
15 -import javax.enterprise.context.RequestScoped;  
16 -import javax.inject.Inject;  
17 -import org.demoiselle.jee.core.interfaces.security.Token;  
18 -import org.demoiselle.jee.core.interfaces.security.TokensManager;  
19 -  
20 -/**  
21 - *  
22 - * @author 70744416353  
23 - */  
24 -@Dependent  
25 -public class TokensManagerImpl implements TokensManager {  
26 -  
27 - private static ConcurrentHashMap<String, Principal> repo = new ConcurrentHashMap<>();  
28 -  
29 - @Inject  
30 - private Logger logger;  
31 -  
32 - @Inject  
33 - @RequestScoped  
34 - private Token token;  
35 -  
36 - @Inject  
37 - @RequestScoped  
38 - private Principal loggedUser;  
39 -  
40 - @Override  
41 - public Principal getUser() {  
42 - if (loggedUser == null) {  
43 - if (token.getKey() != null && !token.getKey().isEmpty()) {  
44 - loggedUser = repo.get(token.getKey());  
45 - return loggedUser;  
46 - }  
47 - }  
48 - return loggedUser;  
49 - }  
50 -  
51 - @Override  
52 - public void setUser(Principal user) {  
53 - String value = null;  
54 - if (!repo.containsValue(user)) {  
55 - value = UUID.randomUUID().toString();  
56 - repo.put(value, user);  
57 - token.setKey(value);  
58 - token.setType("Basic");  
59 - }  
60 - }  
61 -  
62 - @Override  
63 - public boolean validate() {  
64 - return true;//(getUser() != null && repo.get(token.getKey()).);  
65 - }  
66 -  
67 - @Override  
68 - public Token getToken() {  
69 - return token;  
70 - }  
71 -  
72 - @Override  
73 - public void setToken(Token token) {  
74 - String key = null;  
75 - if (repo.containsKey(token.getKey())) {  
76 - loggedUser = repo.get(key);  
77 - }  
78 - }  
79 -  
80 - @Override  
81 - public void setRoles(List<String> roles) {  
82 -  
83 - }  
84 -  
85 - @Override  
86 - public void setPermissions(Map<String, String> permissions) {  
87 -  
88 - }  
89 -  
90 -}  
demoiselle-security-token/src/main/java/org/demoiselle/jee/security/token/impl/TokensManagerImpl.java 0 → 100644
@@ -0,0 +1,57 @@ @@ -0,0 +1,57 @@
  1 +/*
  2 + * To change this license header, choose License Headers in Project Properties.
  3 + * To change this template file, choose Tools | Templates
  4 + * and open the template in the editor.
  5 + */
  6 +package org.demoiselle.jee.security.token.impl;
  7 +
  8 +import java.security.Principal;
  9 +import java.util.UUID;
  10 +import java.util.concurrent.ConcurrentHashMap;
  11 +import java.util.logging.Logger;
  12 +import javax.enterprise.context.Dependent;
  13 +import javax.enterprise.context.RequestScoped;
  14 +import javax.inject.Inject;
  15 +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
  16 +import org.demoiselle.jee.core.interfaces.security.Token;
  17 +import org.demoiselle.jee.core.interfaces.security.TokensManager;
  18 +
  19 +/**
  20 + *
  21 + * @author 70744416353
  22 + */
  23 +@RequestScoped
  24 +public class TokensManagerImpl implements TokensManager {
  25 +
  26 + private final static ConcurrentHashMap<String, DemoisellePrincipal> repo = new ConcurrentHashMap<>();
  27 +
  28 + @Inject
  29 + private Logger logger;
  30 +
  31 + @Inject
  32 + private Token token;
  33 +
  34 + @Override
  35 + public DemoisellePrincipal getUser() {
  36 + if (token.getKey() != null && !token.getKey().isEmpty()) {
  37 + return repo.get(token.getKey());
  38 + }
  39 + return null;
  40 + }
  41 +
  42 + @Override
  43 + public void setUser(DemoisellePrincipal user) {
  44 + if (!repo.containsValue(user)) {
  45 + String value = UUID.randomUUID().toString();
  46 + repo.put(value, user);
  47 + token.setKey(value);
  48 + token.setType("Token");
  49 + }
  50 + }
  51 +
  52 + @Override
  53 + public boolean validate() {
  54 + return true;//(getUser() != null && repo.get(token.getKey()).);
  55 + }
  56 +
  57 +}
demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java
@@ -6,17 +6,14 @@ @@ -6,17 +6,14 @@
6 */ 6 */
7 package org.demoiselle.jee.security.impl; 7 package org.demoiselle.jee.security.impl;
8 8
9 -import java.security.Principal;  
10 -import java.util.List;  
11 -import java.util.Map;  
12 import javax.enterprise.context.Dependent; 9 import javax.enterprise.context.Dependent;
13 import javax.inject.Inject; 10 import javax.inject.Inject;
  11 +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
14 12
15 import org.demoiselle.jee.core.util.ResourceBundle; 13 import org.demoiselle.jee.core.util.ResourceBundle;
16 14
17 import org.demoiselle.jee.security.exception.NotLoggedInException; 15 import org.demoiselle.jee.security.exception.NotLoggedInException;
18 import org.demoiselle.jee.core.interfaces.security.SecurityContext; 16 import org.demoiselle.jee.core.interfaces.security.SecurityContext;
19 -import org.demoiselle.jee.core.interfaces.security.Token;  
20 import org.demoiselle.jee.core.interfaces.security.TokensManager; 17 import org.demoiselle.jee.core.interfaces.security.TokensManager;
21 18
22 /** 19 /**
@@ -74,12 +71,12 @@ public class SecurityContextImpl implements SecurityContext { @@ -74,12 +71,12 @@ public class SecurityContextImpl implements SecurityContext {
74 } 71 }
75 72
76 @Override 73 @Override
77 - public Principal getUser() { 74 + public DemoisellePrincipal getUser() {
78 return tm.getUser(); 75 return tm.getUser();
79 } 76 }
80 77
81 @Override 78 @Override
82 - public void setUser(Principal loggedUser) { 79 + public void setUser(DemoisellePrincipal loggedUser) {
83 tm.setUser(loggedUser); 80 tm.setUser(loggedUser);
84 } 81 }
85 82
demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java
@@ -13,10 +13,10 @@ import javax.interceptor.AroundInvoke; @@ -13,10 +13,10 @@ import javax.interceptor.AroundInvoke;
13 import javax.interceptor.Interceptor; 13 import javax.interceptor.Interceptor;
14 import javax.interceptor.InvocationContext; 14 import javax.interceptor.InvocationContext;
15 import java.io.Serializable; 15 import java.io.Serializable;
16 -import java.security.Principal;  
17 import java.util.logging.Logger; 16 import java.util.logging.Logger;
18 import javax.inject.Inject; 17 import javax.inject.Inject;
19 import org.demoiselle.jee.core.annotation.Name; 18 import org.demoiselle.jee.core.annotation.Name;
  19 +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
20 import org.demoiselle.jee.core.util.ResourceBundle; 20 import org.demoiselle.jee.core.util.ResourceBundle;
21 import org.demoiselle.jee.core.util.Strings; 21 import org.demoiselle.jee.core.util.Strings;
22 import org.demoiselle.jee.security.annotation.RequiredPermission; 22 import org.demoiselle.jee.security.annotation.RequiredPermission;
@@ -40,7 +40,7 @@ public class RequiredPermissionInterceptor implements Serializable { @@ -40,7 +40,7 @@ public class RequiredPermissionInterceptor implements Serializable {
40 private SecurityContext securityContext; 40 private SecurityContext securityContext;
41 41
42 @Inject 42 @Inject
43 - private Principal loggedUser; 43 + private DemoisellePrincipal loggedUser;
44 44
45 @Inject 45 @Inject
46 private ResourceBundle bundle; 46 private ResourceBundle bundle;
demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java
@@ -13,13 +13,13 @@ import javax.interceptor.AroundInvoke; @@ -13,13 +13,13 @@ import javax.interceptor.AroundInvoke;
13 import javax.interceptor.Interceptor; 13 import javax.interceptor.Interceptor;
14 import javax.interceptor.InvocationContext; 14 import javax.interceptor.InvocationContext;
15 import java.io.Serializable; 15 import java.io.Serializable;
16 -import java.security.Principal;  
17 import java.util.ArrayList; 16 import java.util.ArrayList;
18 import java.util.Arrays; 17 import java.util.Arrays;
19 import java.util.List; 18 import java.util.List;
20 19
21 import java.util.logging.Logger; 20 import java.util.logging.Logger;
22 import javax.inject.Inject; 21 import javax.inject.Inject;
  22 +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
23 import org.demoiselle.jee.core.util.ResourceBundle; 23 import org.demoiselle.jee.core.util.ResourceBundle;
24 import org.demoiselle.jee.security.annotation.RequiredRole; 24 import org.demoiselle.jee.security.annotation.RequiredRole;
25 import org.demoiselle.jee.core.interfaces.security.SecurityContext; 25 import org.demoiselle.jee.core.interfaces.security.SecurityContext;
@@ -42,7 +42,7 @@ public class RequiredRoleInterceptor implements Serializable { @@ -42,7 +42,7 @@ public class RequiredRoleInterceptor implements Serializable {
42 private SecurityContext securityContext; 42 private SecurityContext securityContext;
43 43
44 @Inject 44 @Inject
45 - private Principal loggedUser; 45 + private DemoisellePrincipal loggedUser;
46 46
47 @Inject 47 @Inject
48 private ResourceBundle bundle; 48 private ResourceBundle bundle;
@@ -69,7 +69,9 @@ @@ -69,7 +69,9 @@
69 <module>demoiselle-persistence-jpa</module> 69 <module>demoiselle-persistence-jpa</module>
70 <module>demoiselle-rest</module> 70 <module>demoiselle-rest</module>
71 <module>demoiselle-security</module> 71 <module>demoiselle-security</module>
  72 + <module>demoiselle-security-token</module>
72 <module>demoiselle-security-basic</module> 73 <module>demoiselle-security-basic</module>
  74 + <module>demoiselle-security-jwt</module>
73 <!--<module>demoiselle-security-jwt</module>--> 75 <!--<module>demoiselle-security-jwt</module>-->
74 </modules> 76 </modules>
75 77