SlideShare ist ein Scribd-Unternehmen logo
1 von 170
Downloaden Sie, um offline zu lesen
@_openknowledge #WISSENTEILEN
SState of the Art Authentication
mit Java EE 8
Ausführliches Beispiel mit Code Beispiel
demnächst auf unserem Blog verfügbar
www.openknowledge.de/blog
www.github.com/openknowledge
Info auf Twitter: @_openknowledge
ÜBER MICH
• Software-Entwickler
• Speaker
• CI / CD Flüsterer
• Angular(-ität)
• Java EE
Christian Schulz
#WISSENTEILEN
ÜBER OPEN KNOWLEDGE
Branchenneutrale Softwareentwicklung und IT-Beratung
#WISSENTEILEN
Authentication
JSON Web Token
OpenID Connect
Single-Sign On
SAML
Am Anfang war …
… die web.xml
<login-config>
<auth-method> </auth-method>
<realm-name>MyCustomRealm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/error.xhtml</form-error-page>
</form-login-config>
</login-config>
FORM
#WISSENTEILEN
Woher kommen die Login-
Informationen?
JAAS LoginModule
#WISSENTEILEN
JAAS LoginModule
• Implementierung des Interfaces
javax.security.auth.spi.LoginModule
#WISSENTEILEN
JAAS LoginModule
• Implementierung des Interfaces
javax.security.auth.spi.LoginModule
• Befüllen eines javax.security.auth.Subjects mit
java.security.Principals
#WISSENTEILEN
JAAS LoginModule
• Implementierung des Interfaces
javax.security.auth.spi.LoginModule
• Befüllen eines javax.security.auth.Subjects mit
java.security.Principals
• Two-Phase-Authentication
#WISSENTEILEN
JAAS LoginModule
• Implementierung des Interfaces
javax.security.auth.spi.LoginModule
• Befüllen eines javax.security.auth.Subjects mit
java.security.Principals
• Two-Phase-Authentication
• 1. Phase: Kann das Modul authentifizieren?
#WISSENTEILEN
JAAS LoginModule
• Implementierung des Interfaces
javax.security.auth.spi.LoginModule
• Befüllen eines javax.security.auth.Subjects mit
java.security.Principals
• Two-Phase-Authentication
• 1. Phase: Kann das Modul authentifizieren?
• 2. Phase: Login erfolgreich  Befüllen des Subjects
#WISSENTEILEN
LoginModule in Tomcat
META-INF/context.xml
<Context>
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="MyCustomLogin"
... />
</Context>
jaas.config (Starten mit -Djava.security.auth.login.config=jaas.config)
MyCustomLogin {
de.openknowledge...CustomLoginModule required;
};
#WISSENTEILEN
LoginModule in Tomcat
META-INF/context.xml
<Context>
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="MyCustomLogin"
... />
</Context>
jaas.config (Starten mit -Djava.security.auth.login.config=jaas.config)
MyCustomLogin {
de.openknowledge...CustomLoginModule required;
};
#WISSENTEILEN
JAAS LoginModule – Nachteile
#WISSENTEILEN
JAAS LoginModule – Nachteile
• Umständliche API
#WISSENTEILEN
JAAS LoginModule – Nachteile
• Umständliche API
Callback[] callbacks = new Callback [] {
new NameCallback("Username"),
new PasswordCallback("Password", false)
};
callbackHandler.handle(callbacks);
String username = ((NameCallback)callbacks[0]).getName();
String password =
new String(((PasswordCallback)callbacks[1]).getPassword());
#WISSENTEILEN
JAAS LoginModule – Nachteile
• Umständliche API
• Container spezifische Konfiguration
Callback[] callbacks = new Callback [] {
new NameCallback("Username"),
new PasswordCallback("Password", false)
};
callbackHandler.handle(callbacks);
String username = ((NameCallback)callbacks[0]).getName();
String password =
new String(((PasswordCallback)callbacks[1]).getPassword());
#WISSENTEILEN
Und in der Cloud?
Java EE 8 – Security API 1.0
Java EE 8 – IdentityStore
public interface IdentityStore {
CredentialValidationResult validate(Credential credential);
Set<String> getCallerGroups(CredentialValidationResult result);
int priority();
Set<ValidationType> validationTypes();
enum ValidationType { VALIDATE, PROVIDE_GROUPS }
}
#WISSENTEILEN
Java EE 8 – IdentityStore
@LdapIdentityStoreDefinition(
url = "ldap://localhost:3268",
bindDn = "readonly@openknownledge",
bindDnPassword = "password"
)
@DatabaseIdentityStoreDefinition(
dataSourceLookup = "java:jboss/datasources/ExampleDS",
callerQuery = "SELECT password from USERS where name = ?"
)
#WISSENTEILEN
Java EE 8 – CredentialValidationResult
public class CredentialValidationResult {
public Status getStatus() {...}
public CallerPrincipal getCallerPrincipal() {...}
public Set<String> getCallerGroups() {...}
public enum Status { NOT_VALIDATED, INVALID, VALID }
}
#WISSENTEILEN
Java EE 8 – HttpAuthenticationMechanism
public interface HttpAuthenticationMechanism {
AuthenticationStatus validateRequest(
HttpServletRequest request,
HttpServletResponse response,
HttpMessageContext httpMessageContext) throws Auth...Exception;
AuthenticationStatus secureResponse(...) ...
void cleanSubject(...);
}
#WISSENTEILEN
Java EE 8 – HttpAuthenticationMechanism
#WISSENTEILEN
Java EE 8 – HttpAuthenticationMechanism
• Ersetzt Eintrag in web.xml
#WISSENTEILEN
Java EE 8 – HttpAuthenticationMechanism
• Ersetzt Eintrag in web.xml
• Standardimplementierungen via Annotation
#WISSENTEILEN
Java EE 8 – HttpAuthenticationMechanism
• Ersetzt Eintrag in web.xml
• Standardimplementierungen via Annotation
• BasicAuthenticationMechanism
• FormAuthenticationMechanism
• CustomFormAuthenticationMechanism
#WISSENTEILEN
JASPIC
#WISSENTEILEN
JASPIC
• Java Authentication Service Provider Interface for Containers
#WISSENTEILEN
JASPIC
• Java Authentication Service Provider Interface for Containers
• Container-unabhängiges Login möglich
#WISSENTEILEN
JASPIC
• Java Authentication Service Provider Interface for Containers
• Container-unabhängiges Login möglich
Implementierung des Interfaces ServerAuthModule
#WISSENTEILEN
JASPIC
• Java Authentication Service Provider Interface for Containers
• Container-unabhängiges Login möglich
Implementierung des Interfaces ServerAuthModule
• Unterstützung verschiedener Kommunikations-Szenarien
(neben HTTP noch RMI/Remote-EJB, JMS, ...)
• Implementierung umständlich und aufwändig
• In der Praxis selten genutzt
#WISSENTEILEN
Java EE 8 – Security 1.0
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
• Aufsatz auf das JASPIC ServerAuthModule
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
• Aufsatz auf das JASPIC ServerAuthModule
• dadurch Java EE 7 kompatibel
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
• Aufsatz auf das JASPIC ServerAuthModule
• dadurch Java EE 7 kompatibel
• Nutzt IdentityStore(Handler)
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
• Aufsatz auf das JASPIC ServerAuthModule
• dadurch Java EE 7 kompatibel
• Nutzt IdentityStore(Handler)
• Nur für HTTP-Authentication
#WISSENTEILEN
Java EE 8 – Security 1.0
• JSR 375
• Aufsatz auf das JASPIC ServerAuthModule
• dadurch Java EE 7 kompatibel
• Nutzt IdentityStore(Handler)
• Nur für HTTP-Authentication
• Referenzimplementierung Soteria von GlassFish
#WISSENTEILEN
Was ist mit Token-basierten
Authentifizierungsmethoden wie
z.B. JSON Web Token?
Token-basierte Authentication
#WISSENTEILEN
Warum JWT?
• … vs. SWT
• … vs. SAML
• public / private Key-Pair
• extrem kompakt
• JSON
#WISSENTEILEN
JSON Web Token
#WISSENTEILEN
JSON Web Token
#WISSENTEILEN
JSON Web Token
#WISSENTEILEN
JSON Web Token
#WISSENTEILEN
JSON Web Token
#WISSENTEILEN
UND WIE JETZT IN JAVA EE?
Authentication Ablauf
#WISSENTEILEN
Authentication Ablauf
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
Authentication AblaufHttpAuthenticationMechanism
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(
HttpServletRequest request,
HttpServletResponse response,
HttpMessageContext context) {
if (!context.isProtected()) {
// unprotected api call
return context.doNothing();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(
HttpServletRequest request,
HttpServletResponse response,
HttpMessageContext context) {
if (!context.isProtected()) {
// unprotected api call
return context.doNothing();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(
HttpServletRequest request,
HttpServletResponse response,
HttpMessageContext context) {
if (!context.isProtected()) {
// unprotected api call
return context.doNothing();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
String header =
request.getHeader(HttpHeaders.AUTHORIZATION);
if (header == null) {
LOGGER.log(Level.WARNING, "Authorization header is missing");
return context.responseUnauthorized();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
String header =
request.getHeader(HttpHeaders.AUTHORIZATION);
if (header == null) {
LOGGER.log(Level.WARNING, "Authorization header is missing");
return context.responseUnauthorized();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
if (!isValidAuthorizationHeader(header)) {
LOGGER.log(Level.WARNING, "Authorization header is invalid");
return context.responseUnauthorized();
}
…
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
String[] headerComponents = header.split(" ");
String token = headerComponents[1];
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
return context.responseUnauthorized();
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
String[] headerComponents = header.split(" ");
String token = headerComponents[1];
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
return context.responseUnauthorized();
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
String[] headerComponents = header.split(" ");
String token = headerComponents[1];
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
return context.responseUnauthorized();
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
String[] headerComponents = header.split(" ");
String token = headerComponents[1];
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
return context.responseUnauthorized();
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
String[] headerComponents = header.split(" ");
String token = headerComponents[1];
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
return context.responseUnauthorized();
}
#WISSENTEILEN
FAZIT AUTHENTICATION IN JAVA EE 8
FAZIT AUTHENTICATION IN JAVA EE 8
Eigene Nutzerquelle ohne Container-Config
FAZIT AUTHENTICATION IN JAVA EE 8
Eigene Nutzerquelle ohne Container-Config
Standard-Mechanismen weiterhin möglich
FAZIT AUTHENTICATION IN JAVA EE 8
Eigene Nutzerquelle ohne Container-Config
Standard-Mechanismen weiterhin möglich
Support für RememberMe
FAZIT AUTHENTICATION IN JAVA EE 8
Eigene Nutzerquelle ohne Container-Config
Standard-Mechanismen weiterhin möglich
Support für RememberMe
Leichte Erweiterbarkeit für HTTP-basierte Mechanismen
Authorization
Domain-Object-Security
Access-Control Lists
Beispielanwendung
E-Learning Plattform
#WISSENTEILEN
Teacher 1
Users
Student 1
...
#WISSENTEILEN
Teacher 1
Users Permissions
Student 1 Read Course
...
...
#WISSENTEILEN
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Role based Access Control
Roles
Teacher 1
Users Permissions
Student 1 Read Course
Teacher
Student
...
...
#WISSENTEILEN
Role based Access Control
Servlet Spec
Permissions für Web-Resources
#WISSENTEILEN
Role based Access Control
web.xml / Annotations
<security-constraint>
<web-resource-name>courses API</…>
<url-pattern>/api/protected/courses</…>
<auth-constraint>
<role-name>TEACHER</…>
</auth-constraint>
</security-constraint>
@ServletSecurity(
@HttpConstraint(rolesAllowed = {"TEACHER"})
)
#WISSENTEILEN
Role based Access Control
Servlet Spec
Permissions für Web-Resources
#WISSENTEILEN
Role based Access Control
Servlet Spec
Permissions für Web-Resources
Java EE Security
Permissions für Klassen und Methoden
via @RolesAllowed
Standard unterstützt kein JAX-RS
#WISSENTEILEN
Role based Access Control
Servlet Spec
Permissions für Web-Resources
Java EE Security
Permissions für Klassen und Methoden
via @RolesAllowed
Standard unterstützt kein JAX-RS
Java EE 8 Security
Standard-Mapping für User und Rollen
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
…
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
…
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
…
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
…
}
String username = jwt.getSubject();
List<String> roles = jwt.getClaim("roles").asList(String.class);
return context.notifyContainerAboutLogin(
username, new HashSet<>(roles));
} catch (JWTVerificationException e) {…}
…
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
…
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
…
}
String username = jwt.getSubject();
List<String> roles = jwt.getClaim("roles").asList(String.class);
return context.notifyContainerAboutLogin(
username, new HashSet<>(roles));
} catch (JWTVerificationException e) {…}
…
}
#WISSENTEILEN
JwtAuthenticationMechanism
public AuthenticationStatus validateRequest(…) {
…
try {
…
DecodedJWT jwt = tokenProvider.verifyAndDecodeJwt(token);
return context.notifyContainerAboutLogin(
jwt.getSubject(), new HashSet<>());
} catch (JWTVerificationException e) {…}
…
}
String username = jwt.getSubject();
List<String> roles = jwt.getClaim("roles").asList(String.class);
return context.notifyContainerAboutLogin(
username, new HashSet<>(roles));
} catch (JWTVerificationException e) {…}
…
}
#WISSENTEILEN
StudentResource
#WISSENTEILEN
StudentResource
• createStudent
POST
api/protected/students
#WISSENTEILEN
StudentResource
• createStudent
POST
api/protected/students
• getStudents
GET
api/protected/students
#WISSENTEILEN
StudentResource
• createStudent
POST
api/protected/students
• getStudents
GET
api/protected/students
• zwei Rollen pro Methode in einer web.xml?
#WISSENTEILEN
StudentResource
• createStudent
POST
api/protected/students
• getStudents
GET
api/protected/students
• zwei Rollen pro Methode in einer web.xml?
• Es gibt doch nur Pfade?!
#WISSENTEILEN
Role based Access Control
web.xml
<security-constraint>
<web-resource-name>studens API</…>
<url-pattern>/api/protected/students</…>
<auth-constraint>
<role-name>TEACHER</…>
<role-name>STUDENTS</…>
</auth-constraint>
</security-constraint>
#WISSENTEILEN
Role based Access Control
web.xml
<security-constraint>
<web-resource-name>studens API</…>
<url-pattern>/api/protected/students</…>
<auth-constraint>
<role-name>TEACHER</…>
<role-name>STUDENTS</…>
</auth-constraint>
</security-constraint>
#WISSENTEILEN
Role based Access Control
web.xml
<security-constraint>
<web-resource-name>studens API</…>
<url-pattern>/api/protected/students</…>
<auth-constraint>
<role-name>TEACHER</…>
<role-name>STUDENTS</…>
</auth-constraint>
</security-constraint>
Rechtevergabe auf Methodenebene notwendig!
#WISSENTEILEN
RolesAllowedFilter
@Provider
@Priority(Priorities.AUTHENTICATION)
public class RolesAllowedFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Inject
private User user;
@Override
public void filter(ContainerRequestContext requestContext) {
#WISSENTEILEN
RolesAllowedFilter
@Provider
@Priority(Priorities.AUTHENTICATION)
public class RolesAllowedFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Inject
private User user;
@Override
public void filter(ContainerRequestContext requestContext) {
#WISSENTEILEN
RolesAllowedFilter
@Provider
@Priority(Priorities.AUTHENTICATION)
public class RolesAllowedFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Inject
private User user;
@Override
public void filter(ContainerRequestContext requestContext) {
#WISSENTEILEN
RolesAllowedFilter
@Provider
@Priority(Priorities.AUTHENTICATION)
public class RolesAllowedFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Inject
private User user;
@Override
public void filter(ContainerRequestContext requestContext) {
#WISSENTEILEN
Java EE 8 Security Context
• Pre Java EE 8: Jede Spec hat ihre eigene Variante
• Servlet - HttpServletRequest#getUserPrincipal, HttpServletRequest#isUserInRole
• EJB - EJBContext#getCallerPrincipal, EJBContext#isCallerInRole
• JAX-WS - WebServiceContext#getUserPrincipal, WebServiceContext#isUserInRole
• JAX-RS - SecurityContext#getUserPrincipal, SecurityContext#isUserInRole
• JSF - ExternalContext#getUserPrincipal, ExternalContext#isUserInRole
• CDI - @Inject Principal
• WebSockets - Session#getUserPrincipal
• Vereinheitlichung in Java EE 8
#WISSENTEILEN
Java EE 8 Security Context
public interface SecurityContext {
Principal getCallerPrincipal();
<T extends Principal> Set<T> getPrincipalsByType(Class<T> pType);
boolean isCallerInRole(String role);
boolean hasAccessToWebResource(String resource, String... methods);
AuthenticationStatus authenticate(HttpServletRequest request,
HttpServletResponse response,
AuthenticationParameters parameters);
}
#WISSENTEILEN
RolesAllowedFilter
@Provider
@Priority(Priorities.AUTHENTICATION)
public class RolesAllowedFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Inject
private SecurityContext securityContext;
@Override
public void filter(ContainerRequestContext requestContext) {
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
RolesAllowed rolesAllowed =
resourceInfo.getResourceClass()
.getAnnotation(RolesAllowed.class);
RolesAllowed rolesAllowedMethod =
resourceInfo.getResourceMethod()
.getAnnotation(RolesAllowed.class);
if (rolesAllowedMethod != null) {
rolesAllowed = rolesAllowedMethod;
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
RolesAllowed rolesAllowed =
resourceInfo.getResourceClass()
.getAnnotation(RolesAllowed.class);
RolesAllowed rolesAllowedMethod =
resourceInfo.getResourceMethod()
.getAnnotation(RolesAllowed.class);
if (rolesAllowedMethod != null) {
rolesAllowed = rolesAllowedMethod;
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
RolesAllowed rolesAllowed =
resourceInfo.getResourceClass()
.getAnnotation(RolesAllowed.class);
RolesAllowed rolesAllowedMethod =
resourceInfo.getResourceMethod()
.getAnnotation(RolesAllowed.class);
if (rolesAllowedMethod != null) {
rolesAllowed = rolesAllowedMethod;
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
RolesAllowed rolesAllowed =
resourceInfo.getResourceClass()
.getAnnotation(RolesAllowed.class);
RolesAllowed rolesAllowedMethod =
resourceInfo.getResourceMethod()
.getAnnotation(RolesAllowed.class);
if (rolesAllowedMethod != null) {
rolesAllowed = rolesAllowedMethod;
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
…
if (rolesAllowed != null &&
Arrays
.stream(rolesAllowed.value())
.noneMatch(s -> securityContext.isCallerInRole(s))
) {
requestContext.abortWith(
Response.status(Response.Status.FORBIDDEN).build()
);
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
…
if (rolesAllowed != null &&
Arrays
.stream(rolesAllowed.value())
.noneMatch(s -> securityContext.isCallerInRole(s))
) {
requestContext.abortWith(
Response.status(Response.Status.FORBIDDEN).build()
);
}
#WISSENTEILEN
RolesAllowedFilter
public void filter(ContainerRequestContext requestContext) {
…
if (rolesAllowed != null &&
Arrays
.stream(rolesAllowed.value())
.noneMatch(s -> securityContext.isCallerInRole(s))
) {
requestContext.abortWith(
Response.status(Response.Status.FORBIDDEN).build()
);
}
#WISSENTEILEN
RolesAllowedFilter
#WISSENTEILEN
RolesAllowedFilter
• Kein Standard
https://github.com/eclipse-ee4j/jaxrs-api/issues/563
#WISSENTEILEN
RolesAllowedFilter
• Kein Standard
https://github.com/eclipse-ee4j/jaxrs-api/issues/563
• RESTeasy bringt Filter mit
#WISSENTEILEN
RolesAllowedFilter
• Kein Standard
https://github.com/eclipse-ee4j/jaxrs-api/issues/563
• RESTeasy bringt Filter mit
• Eigene Implementierung für andere JAX-RS Implementierungen möglich
#WISSENTEILEN
Kurs anlegen
@RolesAllowed("TEACHER")
public Course create(Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
#WISSENTEILEN
Kurs anlegen
@RolesAllowed("TEACHER")
public Course create(Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
#WISSENTEILEN
Kurs anlegen
@RolesAllowed("TEACHER")
public Course create(Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
Role Based Access Control reicht nicht aus!
#WISSENTEILEN
Kurs anlegen
@Inject
private Principal currentPrincipal;
public Course create(Teacher lecturer, …) {
if (!lecturer.equals(currentPrincipal)) {
throw new SecurityException(…);
}
…
}
#WISSENTEILEN
Kurs anlegen
@Inject
private Principal currentPrincipal;
public Course create(Teacher lecturer, …) {
if (!lecturer.equals(currentPrincipal)) {
throw new SecurityException(…);
}
…
}
Sicherheitsüberprüfungen im Code verteilt! 
#WISSENTEILEN
Gibt es
Alternativen zu Role Based
Access Control?
SAUTHORIZATION – Ausblick
SAUTHORIZATION – Ausblick
Role-Based – Java EE Standard
SAUTHORIZATION – Ausblick
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
SAUTHORIZATION – Ausblick
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
Method-Based – Spring & Deltaspike Security
SAUTHORIZATION – Ausblick
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
Method-Based – Spring & Deltaspike Security
Domain-Object-Based – Deltaspike & JPA Security
ACCESS-CONTROL LIST
Object
Access-Control List
#WISSENTEILEN
ACCESS-CONTROL LIST
Object
Entry
Access-Control List
......
User 1
User 2
User 3
#WISSENTEILEN
DeltaSpike Security
@Create
public Course create(
@Owner Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
#WISSENTEILEN
DeltaSpike Security
@Create
public Course create(
@Owner Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
#WISSENTEILEN
DeltaSpike Security
@Create
public Course create(
@Owner Teacher lecturer, …) {
Course course = new Course(lecturer, …);
entityManager.persist(course);
return course;
}
#WISSENTEILEN
Eigene Security-Annotation
@SecurityBindingType
@Retention(RUNTIME)
public @interface Create {
}
@SecurityParameterBinding
@Retention(RUNTIME)
public @interface Owner {
}
#WISSENTEILEN
Eigene Security-Annotation
@SecurityBindingType
@Retention(RUNTIME)
public @interface Create {
}
@SecurityParameterBinding
@Retention(RUNTIME)
public @interface Owner {
}
#WISSENTEILEN
Separate Logik-Implementierung
public class SecurityRules {
@Secures @Create
public boolean checkOwner(@Owner User owner,
Identity user) {
return owner.equals(user);
}
}
#WISSENTEILEN
Separate Logik-Implementierung
public class SecurityRules {
@Secures @Create
public boolean checkOwner(@Owner User owner,
Identity user) {
return owner.equals(user);
}
}
#WISSENTEILEN
Separate Logik-Implementierung
public class SecurityRules {
@Secures @Create
public boolean checkOwner(@Owner User owner,
Identity user) {
return owner.equals(user);
}
}
#WISSENTEILEN
Separate Logik-Implementierung
public class SecurityRules {
@Secures @Create
public boolean checkOwner(@Owner User owner,
Identity user) {
return owner.equals(user);
}
}
#WISSENTEILEN
JPA Security
Security Framework für JPA
https://github.com/ArneLimburg/jpasecurity
• Pluggable Authentication
• Authorization
• Access-Check bei CRUD-Operationen
• In-Database-Filtern von Queries (JPQL und Criteria)
#WISSENTEILEN
@Permit(access = AccessType.CREATE,
rule = "lecturer = CURRENT_PRINCIPAL")
@Entity
public Course {
…
}
Entity-Security mit JPA Security
#WISSENTEILEN
@Permit(access = AccessType.CREATE,
rule = "lecturer = CURRENT_PRINCIPAL")
@Entity
public Course {
…
}
Entity-Security mit JPA Security
#WISSENTEILEN
@Permit(access = AccessType.CREATE,
rule = "lecturer = CURRENT_PRINCIPAL")
@Entity
public Course {
…
}
Entity-Security mit JPA Security
#WISSENTEILEN
@Permit(access = AccessType.CREATE,
rule = "lecturer = CURRENT_PRINCIPAL")
@Entity
public Course {
…
}
Entity-Security mit JPA Security
#WISSENTEILEN
@Permit(access = AccessType.CREATE,
rule = "lecturer = CURRENT_PRINCIPAL")
@Entity
public Course {
…
}
Automatischer Check bei entityManager.persist(…) oder
entityManager.merge(…) oder bei Cascading!
Entity-Security mit JPA Security
#WISSENTEILEN
Entity-Security mit JPA Security
public List<Student> findAll() {
TypedQuery<Student> query
= entityManager.createQuery("SELECT s FROM Student s", …);
return query.getResultList();
}
#WISSENTEILEN
Entity-Security mit JPA Security
public List<Student> findAll() {
TypedQuery<Student> query
= entityManager.createQuery("SELECT s FROM Student s", …);
return query.getResultList();
}
Lehrer darf nur Studenten aus seinen eigenen Kursen sehen.
#WISSENTEILEN
Entity-Security mit JPA Security
public List<Student> findAll() {
TypedQuery<Student> query
= entityManager.createNamedQuery(…, …);
return query.getResultList();
}
Automatische Filterung von JPA Queries und Criterias!
#WISSENTEILEN
@PermitAny({
@Permit(access = AccessType.READ, rule
= "this IN (SELECT p"
+ " FROM Course course"
+ " JOIN course.participants p"
+ " WHERE course.lecturer"
+ " = CURRENT_PRINCIPAL)"),
@Permit(…)})
@Entity
public Student {
…
Entity-Security mit JPA Security
#WISSENTEILEN
Entity-Security mit JPA Security
public List<Student> findAll() {
TypedQuery<Student> query
= entityManager.createQuery("SELECT s FROM Student s", …);
return query.getResultList();
}
erzeugt
SELECT s FROM Student s WHERE s IN (SELECT p FROM Course course
JOIN course.participants p
WHERE course.lecturer
= CURRENT_PRINCIPAL) …
#WISSENTEILEN
SAUTHORIZATION – Fazit
SAUTHORIZATION – Fazit
Role-Based – Java EE Standard
SAUTHORIZATION – Fazit
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
SAUTHORIZATION – Fazit
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
Method-Based – Spring & Deltaspike Security
SAUTHORIZATION – Fazit
Role-Based – Java EE Standard
Access-Control-Lists – Spring Security
Method-Based – Spring & Deltaspike Security
Domain-Object-Based – Deltaspike & JPA Security
FRAGEN
@_openknowledge#WISSENTEILEN
KONTAKT
Christian Schulz,
Enterprise Developer
christian.schulz@openknowledge.de
+49 (0)441 4082 – 146
Icons in this presentation designed by “Freepik”, “Nice and Serious” and “Elegant Themes” from www.flaticon.com.
OFFENKUNDIGGUT
#WISSENTEILEN

Weitere ähnliche Inhalte

Was ist angesagt?

Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoRob Bontekoe
 
Authentication with zend framework
Authentication with zend frameworkAuthentication with zend framework
Authentication with zend frameworkGeorge Mihailov
 
Modularized Persistence - B Zsoldos
Modularized Persistence - B ZsoldosModularized Persistence - B Zsoldos
Modularized Persistence - B Zsoldosmfrancis
 
Talk about html5 security
Talk about html5 securityTalk about html5 security
Talk about html5 securityHuang Toby
 
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Joao Lucas Santana
 
Java EE Web Security By Example: Frank Kim
Java EE Web Security By Example: Frank KimJava EE Web Security By Example: Frank Kim
Java EE Web Security By Example: Frank Kimjaxconf
 
Apache2 BootCamp : Restricting Access
Apache2 BootCamp : Restricting AccessApache2 BootCamp : Restricting Access
Apache2 BootCamp : Restricting AccessWildan Maulana
 
Windows 8 JavaScript (Wonderland)
Windows 8 JavaScript (Wonderland)Windows 8 JavaScript (Wonderland)
Windows 8 JavaScript (Wonderland)Christopher Bennage
 

Was ist angesagt? (15)

Demystifying OAuth2 for PHP
Demystifying OAuth2 for PHPDemystifying OAuth2 for PHP
Demystifying OAuth2 for PHP
 
Apache Web Server
Apache Web ServerApache Web Server
Apache Web Server
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" Domino
 
Authentication with zend framework
Authentication with zend frameworkAuthentication with zend framework
Authentication with zend framework
 
Modularized Persistence - B Zsoldos
Modularized Persistence - B ZsoldosModularized Persistence - B Zsoldos
Modularized Persistence - B Zsoldos
 
Talk about html5 security
Talk about html5 securityTalk about html5 security
Talk about html5 security
 
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
 
Java EE Web Security By Example: Frank Kim
Java EE Web Security By Example: Frank KimJava EE Web Security By Example: Frank Kim
Java EE Web Security By Example: Frank Kim
 
CBSecurity - Secure all Things
CBSecurity - Secure all ThingsCBSecurity - Secure all Things
CBSecurity - Secure all Things
 
Friendcaster log
Friendcaster logFriendcaster log
Friendcaster log
 
Rolebased security
Rolebased securityRolebased security
Rolebased security
 
Apache2 BootCamp : Restricting Access
Apache2 BootCamp : Restricting AccessApache2 BootCamp : Restricting Access
Apache2 BootCamp : Restricting Access
 
JBoss Seam vs JSF
JBoss Seam vs JSFJBoss Seam vs JSF
JBoss Seam vs JSF
 
Windows 8 JavaScript (Wonderland)
Windows 8 JavaScript (Wonderland)Windows 8 JavaScript (Wonderland)
Windows 8 JavaScript (Wonderland)
 
Certifications Java
Certifications JavaCertifications Java
Certifications Java
 

Ähnlich wie STATE OF THE ART AUTHENTICATION MIT JAVA EE 8

State of the art authentication mit Java EE 8
State of the art authentication mit Java EE 8State of the art authentication mit Java EE 8
State of the art authentication mit Java EE 8OPEN KNOWLEDGE GmbH
 
Java EE Security API - JSR375: Getting Started
Java EE Security API - JSR375: Getting Started Java EE Security API - JSR375: Getting Started
Java EE Security API - JSR375: Getting Started Rudy De Busscher
 
What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)Rudy De Busscher
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Matt Raible
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Matt Raible
 
Java ee 8 + security overview
Java ee 8 + security overviewJava ee 8 + security overview
Java ee 8 + security overviewRudy De Busscher
 
JWT Authentication with AngularJS
JWT Authentication with AngularJSJWT Authentication with AngularJS
JWT Authentication with AngularJSrobertjd
 
TechDays 2013 Jari Kallonen: What's New WebForms 4.5
TechDays 2013 Jari Kallonen: What's New WebForms 4.5TechDays 2013 Jari Kallonen: What's New WebForms 4.5
TechDays 2013 Jari Kallonen: What's New WebForms 4.5Tieturi Oy
 
How to Use Stormpath in angular js
How to Use Stormpath in angular jsHow to Use Stormpath in angular js
How to Use Stormpath in angular jsStormpath
 
Building Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsBuilding Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsrobertjd
 
WebLogic in Practice: SSL Configuration
WebLogic in Practice: SSL ConfigurationWebLogic in Practice: SSL Configuration
WebLogic in Practice: SSL ConfigurationSimon Haslam
 
Java EE Application Security With PicketLink
Java EE Application Security With PicketLinkJava EE Application Security With PicketLink
Java EE Application Security With PicketLinkpigorcraveiro
 
From 0 to Spring Security 4.0
From 0 to Spring Security 4.0From 0 to Spring Security 4.0
From 0 to Spring Security 4.0robwinch
 
Smart Lock for Password @ Game DevFest Bangkok 2015
Smart Lock for Password @ Game DevFest Bangkok 2015Smart Lock for Password @ Game DevFest Bangkok 2015
Smart Lock for Password @ Game DevFest Bangkok 2015Somkiat Khitwongwattana
 
DataPower Restful API Security
DataPower Restful API SecurityDataPower Restful API Security
DataPower Restful API SecurityJagadish Vemugunta
 
Securing Microservices using Play and Akka HTTP
Securing Microservices using Play and Akka HTTPSecuring Microservices using Play and Akka HTTP
Securing Microservices using Play and Akka HTTPRafal Gancarz
 
Securing Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationSecuring Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationStormpath
 
Securing your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris KelloggSecuring your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris KelloggStreamNative
 
Super simple application security with Apache Shiro
Super simple application security with Apache ShiroSuper simple application security with Apache Shiro
Super simple application security with Apache ShiroMarakana Inc.
 

Ähnlich wie STATE OF THE ART AUTHENTICATION MIT JAVA EE 8 (20)

State of the art authentication mit Java EE 8
State of the art authentication mit Java EE 8State of the art authentication mit Java EE 8
State of the art authentication mit Java EE 8
 
Java EE Security API - JSR375: Getting Started
Java EE Security API - JSR375: Getting Started Java EE Security API - JSR375: Getting Started
Java EE Security API - JSR375: Getting Started
 
What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
 
Java ee 8 + security overview
Java ee 8 + security overviewJava ee 8 + security overview
Java ee 8 + security overview
 
JWT Authentication with AngularJS
JWT Authentication with AngularJSJWT Authentication with AngularJS
JWT Authentication with AngularJS
 
TechDays 2013 Jari Kallonen: What's New WebForms 4.5
TechDays 2013 Jari Kallonen: What's New WebForms 4.5TechDays 2013 Jari Kallonen: What's New WebForms 4.5
TechDays 2013 Jari Kallonen: What's New WebForms 4.5
 
How to Use Stormpath in angular js
How to Use Stormpath in angular jsHow to Use Stormpath in angular js
How to Use Stormpath in angular js
 
Building Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsBuilding Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTs
 
WebLogic in Practice: SSL Configuration
WebLogic in Practice: SSL ConfigurationWebLogic in Practice: SSL Configuration
WebLogic in Practice: SSL Configuration
 
Java EE Application Security With PicketLink
Java EE Application Security With PicketLinkJava EE Application Security With PicketLink
Java EE Application Security With PicketLink
 
From 0 to Spring Security 4.0
From 0 to Spring Security 4.0From 0 to Spring Security 4.0
From 0 to Spring Security 4.0
 
Smart Lock for Password @ Game DevFest Bangkok 2015
Smart Lock for Password @ Game DevFest Bangkok 2015Smart Lock for Password @ Game DevFest Bangkok 2015
Smart Lock for Password @ Game DevFest Bangkok 2015
 
DataPower Restful API Security
DataPower Restful API SecurityDataPower Restful API Security
DataPower Restful API Security
 
Securing Microservices using Play and Akka HTTP
Securing Microservices using Play and Akka HTTPSecuring Microservices using Play and Akka HTTP
Securing Microservices using Play and Akka HTTP
 
Securing Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationSecuring Web Applications with Token Authentication
Securing Web Applications with Token Authentication
 
Spa Secure Coding Guide
Spa Secure Coding GuideSpa Secure Coding Guide
Spa Secure Coding Guide
 
Securing your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris KelloggSecuring your Pulsar Cluster with Vault_Chris Kellogg
Securing your Pulsar Cluster with Vault_Chris Kellogg
 
Super simple application security with Apache Shiro
Super simple application security with Apache ShiroSuper simple application security with Apache Shiro
Super simple application security with Apache Shiro
 

Mehr von OPEN KNOWLEDGE GmbH

Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. OPEN KNOWLEDGE GmbH
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenOPEN KNOWLEDGE GmbH
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsOPEN KNOWLEDGE GmbH
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten SystemenOPEN KNOWLEDGE GmbH
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungOPEN KNOWLEDGE GmbH
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingOPEN KNOWLEDGE GmbH
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!OPEN KNOWLEDGE GmbH
 
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?OPEN KNOWLEDGE GmbH
 
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“OPEN KNOWLEDGE GmbH
 
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...OPEN KNOWLEDGE GmbH
 
Die Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesDie Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesOPEN KNOWLEDGE GmbH
 

Mehr von OPEN KNOWLEDGE GmbH (20)

Nie wieder Log-Files!
Nie wieder Log-Files!Nie wieder Log-Files!
Nie wieder Log-Files!
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud.
 
API Expand Contract
API Expand ContractAPI Expand Contract
API Expand Contract
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten Architekturen
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.js
 
KI und Architektur
KI und ArchitekturKI und Architektur
KI und Architektur
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale Netze
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten Systemen
 
Business-Mehrwert durch KI
Business-Mehrwert durch KIBusiness-Mehrwert durch KI
Business-Mehrwert durch KI
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch Automatisierung
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und Testing
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!
 
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
 
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
 
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
 
Serverless Survival Guide
Serverless Survival GuideServerless Survival Guide
Serverless Survival Guide
 
Die Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesDie Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von Microservices
 

Kürzlich hochgeladen

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 

Kürzlich hochgeladen (20)

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 

STATE OF THE ART AUTHENTICATION MIT JAVA EE 8