Commit 6e126b792415a4bf742c96d2165e494f6fcf473c
1 parent
ffe576b7
Segurança e ajustes nos pacotes
Showing
11 changed files
with
108 additions
and
149 deletions
Show diff stats
demoiselle-core/src/main/java/org/demoiselle/jee/core/interfaces/security/DemoisellePrincipal.java
demoiselle-core/src/main/java/org/demoiselle/jee/core/interfaces/security/SecurityContext.java
... | ... | @@ -66,8 +66,8 @@ public interface SecurityContext extends Serializable { |
66 | 66 | * @return the user logged in a specific authenticated session. If there is |
67 | 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 | 20 | */ |
21 | 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 | 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 | 5 | */ |
6 | 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 | 8 | import java.util.logging.Logger; |
14 | 9 | import javax.enterprise.context.Dependent; |
15 | -import javax.enterprise.context.RequestScoped; | |
16 | 10 | import javax.inject.Inject; |
17 | 11 | import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; |
18 | 12 | import org.demoiselle.jee.core.interfaces.security.Token; |
... | ... | @@ -25,24 +19,20 @@ import org.demoiselle.jee.core.interfaces.security.TokensManager; |
25 | 19 | @Dependent |
26 | 20 | public class TokensManagerImpl implements TokensManager { |
27 | 21 | |
28 | - private static ConcurrentHashMap<String, Principal> repo = new ConcurrentHashMap<>(); | |
29 | - | |
30 | 22 | @Inject |
31 | 23 | private Logger logger; |
32 | 24 | |
33 | 25 | @Inject |
34 | - @RequestScoped | |
35 | 26 | private Token token; |
36 | 27 | |
37 | 28 | @Inject |
38 | - @RequestScoped | |
39 | - private Principal loggedUser; | |
29 | + private DemoisellePrincipal loggedUser; | |
40 | 30 | |
41 | 31 | @Override |
42 | - public Principal getUser() { | |
32 | + public DemoisellePrincipal getUser() { | |
43 | 33 | if (loggedUser == null) { |
44 | 34 | if (token.getKey() != null && !token.getKey().isEmpty()) { |
45 | - loggedUser = repo.get(token.getKey()); | |
35 | + // desfaz o basic | |
46 | 36 | return loggedUser; |
47 | 37 | } |
48 | 38 | } |
... | ... | @@ -50,14 +40,9 @@ public class TokensManagerImpl implements TokensManager { |
50 | 40 | } |
51 | 41 | |
52 | 42 | @Override |
53 | - public void setUser(Principal user) { | |
43 | + public void setUser(DemoisellePrincipal user) { | |
54 | 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 | 48 | @Override |
... | ... | @@ -65,6 +50,4 @@ public class TokensManagerImpl implements TokensManager { |
65 | 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 | 13 | import javax.enterprise.context.Dependent; |
14 | 14 | import javax.inject.Inject; |
15 | 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 | 19 | import org.jose4j.jwk.RsaJsonWebKey; |
19 | 20 | import org.jose4j.jwk.RsaJwkGenerator; |
20 | 21 | import org.jose4j.jws.AlgorithmIdentifiers; |
... | ... | @@ -40,6 +41,12 @@ public class TokensManagerImpl implements TokensManager { |
40 | 41 | @Inject |
41 | 42 | private Logger logger; |
42 | 43 | |
44 | + @Inject | |
45 | + private Token token; | |
46 | + | |
47 | + @Inject | |
48 | + private DemoisellePrincipal loggedUser; | |
49 | + | |
43 | 50 | public TokensManagerImpl() throws JoseException { |
44 | 51 | RsaJsonWebKey chave = RsaJwkGenerator.generateJwk(2048); |
45 | 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 | 57 | } |
51 | 58 | |
52 | 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 | 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 | 72 | String ip = httpRequest.getRemoteAddr(); |
69 | 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 | 83 | @Override |
80 | - public String setUser(LoggedUser user) { | |
84 | + public void setUser(DemoisellePrincipal user) { | |
81 | 85 | try { |
82 | 86 | JwtClaims claims = new JwtClaims(); |
83 | 87 | claims.setIssuer("demoiselle"); |
... | ... | @@ -95,12 +99,16 @@ public class TokensManagerImpl implements TokensManager { |
95 | 99 | jws.setKey(rsaJsonWebKey.getPrivateKey()); |
96 | 100 | jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId()); |
97 | 101 | jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); |
98 | - return jws.getCompactSerialization(); | |
102 | + token.setKey(jws.getCompactSerialization()); | |
99 | 103 | } catch (JoseException ex) { |
100 | 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 | -/* | |
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 @@ |
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 | 6 | */ |
7 | 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 | 9 | import javax.enterprise.context.Dependent; |
13 | 10 | import javax.inject.Inject; |
11 | +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | |
14 | 12 | |
15 | 13 | import org.demoiselle.jee.core.util.ResourceBundle; |
16 | 14 | |
17 | 15 | import org.demoiselle.jee.security.exception.NotLoggedInException; |
18 | 16 | import org.demoiselle.jee.core.interfaces.security.SecurityContext; |
19 | -import org.demoiselle.jee.core.interfaces.security.Token; | |
20 | 17 | import org.demoiselle.jee.core.interfaces.security.TokensManager; |
21 | 18 | |
22 | 19 | /** |
... | ... | @@ -74,12 +71,12 @@ public class SecurityContextImpl implements SecurityContext { |
74 | 71 | } |
75 | 72 | |
76 | 73 | @Override |
77 | - public Principal getUser() { | |
74 | + public DemoisellePrincipal getUser() { | |
78 | 75 | return tm.getUser(); |
79 | 76 | } |
80 | 77 | |
81 | 78 | @Override |
82 | - public void setUser(Principal loggedUser) { | |
79 | + public void setUser(DemoisellePrincipal loggedUser) { | |
83 | 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 | 13 | import javax.interceptor.Interceptor; |
14 | 14 | import javax.interceptor.InvocationContext; |
15 | 15 | import java.io.Serializable; |
16 | -import java.security.Principal; | |
17 | 16 | import java.util.logging.Logger; |
18 | 17 | import javax.inject.Inject; |
19 | 18 | import org.demoiselle.jee.core.annotation.Name; |
19 | +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | |
20 | 20 | import org.demoiselle.jee.core.util.ResourceBundle; |
21 | 21 | import org.demoiselle.jee.core.util.Strings; |
22 | 22 | import org.demoiselle.jee.security.annotation.RequiredPermission; |
... | ... | @@ -40,7 +40,7 @@ public class RequiredPermissionInterceptor implements Serializable { |
40 | 40 | private SecurityContext securityContext; |
41 | 41 | |
42 | 42 | @Inject |
43 | - private Principal loggedUser; | |
43 | + private DemoisellePrincipal loggedUser; | |
44 | 44 | |
45 | 45 | @Inject |
46 | 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 | import javax.interceptor.Interceptor; |
14 | 14 | import javax.interceptor.InvocationContext; |
15 | 15 | import java.io.Serializable; |
16 | -import java.security.Principal; | |
17 | 16 | import java.util.ArrayList; |
18 | 17 | import java.util.Arrays; |
19 | 18 | import java.util.List; |
20 | 19 | |
21 | 20 | import java.util.logging.Logger; |
22 | 21 | import javax.inject.Inject; |
22 | +import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; | |
23 | 23 | import org.demoiselle.jee.core.util.ResourceBundle; |
24 | 24 | import org.demoiselle.jee.security.annotation.RequiredRole; |
25 | 25 | import org.demoiselle.jee.core.interfaces.security.SecurityContext; |
... | ... | @@ -42,7 +42,7 @@ public class RequiredRoleInterceptor implements Serializable { |
42 | 42 | private SecurityContext securityContext; |
43 | 43 | |
44 | 44 | @Inject |
45 | - private Principal loggedUser; | |
45 | + private DemoisellePrincipal loggedUser; | |
46 | 46 | |
47 | 47 | @Inject |
48 | 48 | private ResourceBundle bundle; | ... | ... |
pom.xml
... | ... | @@ -69,7 +69,9 @@ |
69 | 69 | <module>demoiselle-persistence-jpa</module> |
70 | 70 | <module>demoiselle-rest</module> |
71 | 71 | <module>demoiselle-security</module> |
72 | + <module>demoiselle-security-token</module> | |
72 | 73 | <module>demoiselle-security-basic</module> |
74 | + <module>demoiselle-security-jwt</module> | |
73 | 75 | <!--<module>demoiselle-security-jwt</module>--> |
74 | 76 | </modules> |
75 | 77 | ... | ... |