- * Thrown when the mecanism responsible for the entire authentication lifecycle fails. - *
- * - * @author SERPRO - */ -public class AuthenticationException extends SecurityException { - - private static final long serialVersionUID = 1L; - - /** - *- * Constructor with message. - *
- * - * @param message exception message - */ - public AuthenticationException(String message) { - super(message); - } - - /** - *- * Constructor with the cause. - *
- * - * @param cause exception cause - */ - public AuthenticationException(Throwable cause) { - super(cause); - } - - /** - *- * Constructor with message and cause. - *
- * - * @param message exception message - * @param cause exception cause - */ - public AuthenticationException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/AuthorizationException.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/AuthorizationException.java deleted file mode 100644 index bd033af..0000000 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/AuthorizationException.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or- * Thrown when a fail on trying to access some resource and/or execute an - * operation without the proper authorization. - *
- * - * @author SERPRO - */ -public class AuthorizationException extends SecurityException { - - private static final long serialVersionUID = 1L; - - /** - *- * Constructor with message. - *
- * - * @param message exception message - */ - public AuthorizationException(String message) { - super(message); - } - - /** - *- * Constructor with the cause. - *
- * - * @param cause exception cause - */ - public AuthorizationException(Throwable cause) { - super(cause); - } -} diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java index 641a2d1..9533dcd 100644 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java +++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/DemoiselleSecurityException.java @@ -22,6 +22,12 @@ public class DemoiselleSecurityException extends DemoiselleRESTException { super(string); this.statusCode = 401; } + + public DemoiselleSecurityException(String string, int statusCode) { + super(string); + this.statusCode = statusCode; + } + public int getStatusCode() { return statusCode; diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/InvalidCredentialsException.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/InvalidCredentialsException.java deleted file mode 100644 index c011487..0000000 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/InvalidCredentialsException.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or- * Thrown when the user's credentials are invalid. - *
- * - * @author SERPRO - */ -public class InvalidCredentialsException extends AuthenticationException { - - private static final long serialVersionUID = 1L; - - public InvalidCredentialsException() { - super(CDI.current().select(ResourceBundle.class, new NameQualifier("demoiselle-core-bundle")).get().getString("invalid-credentials")); - } - - /** - *
- * Constructs an InvalidCredentialsException with a message.
- *
- * Constructor with message and cause. - *
- * - * @param message exception message. - * @param cause exception cause. - */ - public InvalidCredentialsException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/NotLoggedInException.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/NotLoggedInException.java deleted file mode 100644 index bb95a83..0000000 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/exception/NotLoggedInException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Demoiselle Framework - * - * License: GNU Lesser General Public License (LGPL), version 3 or later. - * See the lgpl.txt file in the root directory or- * Thrown when trying to access some resource or execute an operation that requires authentication. - *
- * - * @author SERPRO - */ -public class NotLoggedInException extends DemoiselleSecurityException { - - private static final long serialVersionUID = 1L; - - /** - *
- * Constructs an NotLoggedInException with a message.
- *
SecurityException is the superclass of those exceptions that can
- * be thrown due to any security related issue.
- *
- * @author SERPRO
- */
-public class SecurityException extends DemoiselleException {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs an SecurityException with the specified detail
- * message.
- *
- * @param message the detail message.
- */
- SecurityException(String message) {
- super(message);
- }
-
- /**
- * Constructor with the cause.
- *
- * @param cause exception cause
- */
- SecurityException(Throwable cause) {
- super(cause);
- }
-
- /**
- * Constructor with message and cause.
- *
- * @param message exception message
- * @param cause exception cause
- */
- SecurityException(String message, Throwable cause) {
- super(message, cause);
- }
-}
diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/DemoisellePrincipalImpl.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/DemoisellePrincipalImpl.java
index 582d862..a91a646 100644
--- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/DemoisellePrincipalImpl.java
+++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/DemoisellePrincipalImpl.java
@@ -91,7 +91,7 @@ public class DemoisellePrincipalImpl implements DemoisellePrincipal {
@Override
public String toString() {
- return "DemoisellePrincipalImpl{" + "id=" + id + ", name=" + name + ", roles=" + roles + ", permissions=" + permissions + '}';
+ return "DemoisellePrincipal{" + "id=" + id + ", name=" + name + ", roles=" + roles + ", permissions=" + permissions + '}';
}
}
diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java
index 1ab26ab..79c3aa4 100644
--- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java
+++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/impl/SecurityContextImpl.java
@@ -6,16 +6,14 @@
*/
package org.demoiselle.jee.security.impl;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.stream.Collectors;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
+import javax.ws.rs.core.Response;
import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal;
-import org.demoiselle.jee.security.exception.NotLoggedInException;
import org.demoiselle.jee.core.interfaces.security.SecurityContext;
import org.demoiselle.jee.core.interfaces.security.TokensManager;
+import org.demoiselle.jee.security.exception.DemoiselleSecurityException;
import org.demoiselle.jee.security.message.DemoiselleSecurityMessages;
/**
@@ -33,20 +31,20 @@ public class SecurityContextImpl implements SecurityContext {
@Inject
private TokensManager tm;
- @Inject
- private DemoiselleSecurityMessages bundle;
-
/**
* @see org.demoiselle.security.SecurityContext#hasPermission(String,
* String)
*/
@Override
public boolean hasPermission(String resource, String operation) {
- return (tm.getUser().getPermissions().entrySet()
+ if ((tm.getUser().getPermissions().entrySet()
.stream()
.filter(p -> p.getKey().equalsIgnoreCase(resource))
.filter(p -> p.getValue().equalsIgnoreCase(operation))
- .count() > 0);
+ .count() <= 0)) {
+ return false;
+ }
+ return true;
}
/**
@@ -54,7 +52,10 @@ public class SecurityContextImpl implements SecurityContext {
*/
@Override
public boolean hasRole(String role) {
- return (tm.getUser().getRoles().parallelStream().filter(p -> p.equals(role)).count() > 0);
+ if (tm.getUser().getRoles().parallelStream().filter(p -> p.equals(role)).count() <= 0) {
+ return true;
+ }
+ return false;
}
/**
@@ -62,14 +63,7 @@ public class SecurityContextImpl implements SecurityContext {
*/
@Override
public boolean isLoggedIn() {
- return tm.validate();
- }
-
- @Override
- public void checkLoggedIn() throws NotLoggedInException {
- if (!isLoggedIn()) {
- throw new NotLoggedInException(bundle.userNotAuthenticated());
- }
+ return getUser() != null;
}
@Override
diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java
index c7133a3..928a130 100644
--- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java
+++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/LoggedInInterceptor.java
@@ -12,8 +12,12 @@ import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import java.io.Serializable;
+import java.util.logging.Logger;
+import javax.ws.rs.core.Response;
import org.demoiselle.jee.security.annotation.LoggedIn;
import org.demoiselle.jee.core.interfaces.security.SecurityContext;
+import org.demoiselle.jee.security.exception.DemoiselleSecurityException;
+import org.demoiselle.jee.security.message.DemoiselleSecurityMessages;
/**
* @@ -32,9 +36,14 @@ public class LoggedInInterceptor implements Serializable { @Inject private SecurityContext securityContext; + @Inject + private DemoiselleSecurityMessages bundle; + @AroundInvoke public Object manage(final InvocationContext ic) throws Exception { - securityContext.checkLoggedIn(); + if (!securityContext.isLoggedIn()) { + throw new DemoiselleSecurityException(bundle.userNotAuthenticated(), Response.Status.UNAUTHORIZED.getStatusCode()); + } return ic.proceed(); } } diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java index 8ca994b..f2ad807 100644 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java +++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredPermissionInterceptor.java @@ -6,8 +6,6 @@ */ package org.demoiselle.jee.security.interceptor; -import org.demoiselle.jee.security.exception.AuthorizationException; - import javax.annotation.Priority; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; @@ -15,12 +13,15 @@ import javax.interceptor.InvocationContext; import java.io.Serializable; import java.util.logging.Logger; import javax.inject.Inject; +import javax.ws.rs.core.Response; import org.demoiselle.jee.core.annotation.Name; import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; import org.demoiselle.jee.core.util.ResourceBundle; import org.demoiselle.jee.core.util.Strings; import org.demoiselle.jee.security.annotation.RequiredPermission; import org.demoiselle.jee.core.interfaces.security.SecurityContext; +import org.demoiselle.jee.security.exception.DemoiselleSecurityException; +import org.demoiselle.jee.security.message.DemoiselleSecurityMessages; /** *
@@ -43,7 +44,7 @@ public class RequiredPermissionInterceptor implements Serializable { private DemoisellePrincipal loggedUser; @Inject - private ResourceBundle bundle; + private DemoiselleSecurityMessages bundle; @Inject private Logger logger; @@ -73,15 +74,15 @@ public class RequiredPermissionInterceptor implements Serializable { if (securityContext.isLoggedIn()) { username = loggedUser.getName(); - logger.finest(bundle.getString("access-checking", username, operation, resource)); + logger.finest(bundle.accessCheckingPermission(username, operation, resource)); } if (securityContext.hasPermission(resource, operation)) { - logger.severe(bundle.getString("access-denied", username, operation, resource)); - throw new AuthorizationException(bundle.getString("access-denied-ui", resource, operation)); + logger.severe(bundle.doesNotHavePermission(username, operation, resource)); + throw new DemoiselleSecurityException(bundle.doesNotHavePermission(username, operation, resource), Response.Status.UNAUTHORIZED.getStatusCode()); } - logger.fine(bundle.getString("access-allowed", username, operation, resource)); + logger.fine(bundle.accessAllowed(username, operation, resource)); return ic.proceed(); } diff --git a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java index 424b470..636a1da 100644 --- a/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java +++ b/demoiselle-security/src/main/java/org/demoiselle/jee/security/interceptor/RequiredRoleInterceptor.java @@ -6,8 +6,6 @@ */ package org.demoiselle.jee.security.interceptor; -import org.demoiselle.jee.security.exception.AuthorizationException; - import javax.annotation.Priority; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; @@ -19,10 +17,13 @@ import java.util.List; import java.util.logging.Logger; import javax.inject.Inject; +import javax.ws.rs.core.Response; import org.demoiselle.jee.core.interfaces.security.DemoisellePrincipal; import org.demoiselle.jee.core.util.ResourceBundle; import org.demoiselle.jee.security.annotation.RequiredRole; import org.demoiselle.jee.core.interfaces.security.SecurityContext; +import org.demoiselle.jee.security.exception.DemoiselleSecurityException; +import org.demoiselle.jee.security.message.DemoiselleSecurityMessages; /** *
@@ -45,7 +46,7 @@ public class RequiredRoleInterceptor implements Serializable {
private DemoisellePrincipal loggedUser;
@Inject
- private ResourceBundle bundle;
+ private DemoiselleSecurityMessages bundle;
@Inject
private Logger logger;
@@ -70,28 +71,26 @@ public class RequiredRoleInterceptor implements Serializable {
public Object manage(final InvocationContext ic) throws Exception {
List