From b0eae68de57819fa625835f9c05d56c91370d86a Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 9 Sep 2022 19:35:34 +0200 Subject: [PATCH] initial commit --- .gitignore | 4 + README.md | 16 ++++ build/.gitkeep | 0 src/main/java/jaas.conf | 3 + src/main/java/jaas/InitialServlet.java | 27 +++++++ src/main/java/jaas/JAASLoginModule.java | 100 ++++++++++++++++++++++++ src/main/java/jaas/RolePrincipal.java | 22 ++++++ src/main/java/jaas/UserPrincipal.java | 22 ++++++ src/main/webapp/META-INF/MANIFEST.MF | 3 + src/main/webapp/META-INF/context.xml | 6 ++ src/main/webapp/WEB-INF/web.xml | 36 +++++++++ src/main/webapp/error.jsp | 15 ++++ src/main/webapp/index.jsp | 15 ++++ src/main/webapp/login.jsp | 24 ++++++ src/main/webapp/logout.jsp | 15 ++++ 15 files changed, 308 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build/.gitkeep create mode 100644 src/main/java/jaas.conf create mode 100644 src/main/java/jaas/InitialServlet.java create mode 100644 src/main/java/jaas/JAASLoginModule.java create mode 100644 src/main/java/jaas/RolePrincipal.java create mode 100644 src/main/java/jaas/UserPrincipal.java create mode 100644 src/main/webapp/META-INF/MANIFEST.MF create mode 100644 src/main/webapp/META-INF/context.xml create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/error.jsp create mode 100644 src/main/webapp/index.jsp create mode 100644 src/main/webapp/login.jsp create mode 100644 src/main/webapp/logout.jsp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7400d90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build/classes +.settings/ +.classpath +.project diff --git a/README.md b/README.md new file mode 100644 index 0000000..da3cba1 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# PruebaJAAS + +Implementación de prueba del sistema nativo de seguridad de Java [JAAS](https://www.oracle.com/java/technologies/javase/javase-tech-security.html) (Java Authentication and Authorization Service) + +Prueba realizada con `Java 11` y despliegue con `Tomcat 10` + +### Credenciales de acceso + +``` +Usuario: user +Password: pass +``` + +### Licencia + +MIT \ No newline at end of file diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/jaas.conf b/src/main/java/jaas.conf new file mode 100644 index 0000000..569f121 --- /dev/null +++ b/src/main/java/jaas.conf @@ -0,0 +1,3 @@ +PruebaJAAS { + jaas.JAASLoginModule required; +}; \ No newline at end of file diff --git a/src/main/java/jaas/InitialServlet.java b/src/main/java/jaas/InitialServlet.java new file mode 100644 index 0000000..5900f77 --- /dev/null +++ b/src/main/java/jaas/InitialServlet.java @@ -0,0 +1,27 @@ +package jaas; + +import javax.security.auth.login.Configuration; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; + +/** + * Servlet implementation class InitialServlet + */ +public class InitialServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public InitialServlet() { + super(); + } + + @Override + public void init() throws ServletException { + super.init(); + System.setProperty("java.security.auth.login.config", "classpath:jaas.conf"); + Configuration.getConfiguration().refresh(); + } +} diff --git a/src/main/java/jaas/JAASLoginModule.java b/src/main/java/jaas/JAASLoginModule.java new file mode 100644 index 0000000..b153033 --- /dev/null +++ b/src/main/java/jaas/JAASLoginModule.java @@ -0,0 +1,100 @@ +package jaas; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.security.auth.Subject; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.login.LoginException; +import javax.security.auth.spi.LoginModule; + +public class JAASLoginModule implements LoginModule { + + private CallbackHandler handler; + private Subject subject; + private UserPrincipal userPrincipal; + private RolePrincipal rolePrincipal; + private String login; + private List userGroups; + + @Override + public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, + Map options) { + + handler = callbackHandler; + this.subject = subject; + } + + @Override + public boolean login() throws LoginException { + + Callback[] callbacks = new Callback[2]; + callbacks[0] = new NameCallback("login"); + callbacks[1] = new PasswordCallback("password", true); + + try { + handler.handle(callbacks); + String name = ((NameCallback) callbacks[0]).getName(); + String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword()); + + // Here we validate the credentials against some + // authentication/authorization provider. + // It can be a Database, an external LDAP, + // a Web Service, etc. + if (name != null && name.equals("user") && password != null && password.equals("pass")) { + + // We store the username and roles + // fetched from the credentials provider + // to be used later in commit() method. + login = name; + userGroups = new ArrayList(); + userGroups.add("admin"); + return true; + } + + // If credentials are NOT OK we throw a LoginException + throw new LoginException("Authentication failed"); + + } catch (IOException e) { + throw new LoginException(e.getMessage()); + } catch (UnsupportedCallbackException e) { + throw new LoginException(e.getMessage()); + } + + } + + @Override + public boolean commit() throws LoginException { + + userPrincipal = new UserPrincipal(login); + subject.getPrincipals().add(userPrincipal); + + if (userGroups != null && userGroups.size() > 0) { + for (String groupName : userGroups) { + rolePrincipal = new RolePrincipal(groupName); + subject.getPrincipals().add(rolePrincipal); + } + } + + return true; + } + + @Override + public boolean abort() throws LoginException { + return false; + } + + @Override + public boolean logout() throws LoginException { + subject.getPrincipals().remove(userPrincipal); + subject.getPrincipals().remove(rolePrincipal); + return true; + } + +} diff --git a/src/main/java/jaas/RolePrincipal.java b/src/main/java/jaas/RolePrincipal.java new file mode 100644 index 0000000..fb76f9e --- /dev/null +++ b/src/main/java/jaas/RolePrincipal.java @@ -0,0 +1,22 @@ +package jaas; + +import java.security.Principal; + +public class RolePrincipal implements Principal { + + private String name; + + public RolePrincipal(String name) { + super(); + this.name = name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } +} diff --git a/src/main/java/jaas/UserPrincipal.java b/src/main/java/jaas/UserPrincipal.java new file mode 100644 index 0000000..486f697 --- /dev/null +++ b/src/main/java/jaas/UserPrincipal.java @@ -0,0 +1,22 @@ +package jaas; + +import java.security.Principal; + +public class UserPrincipal implements Principal { + + private String name; + + public UserPrincipal(String name) { + super(); + this.name = name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/src/main/webapp/META-INF/MANIFEST.MF b/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..14e36df --- /dev/null +++ b/src/main/webapp/META-INF/context.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..6ec2cc3 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,36 @@ + + + PruebaJAAS + + InitialServlet + InitialServlet + jaas.InitialServlet + 1 + + + index.jsp + + + + Auth + /* + + + admin + + + + admin + + + FORM + + /login.jsp + /error.jsp + + + \ No newline at end of file diff --git a/src/main/webapp/error.jsp b/src/main/webapp/error.jsp new file mode 100644 index 0000000..4711f37 --- /dev/null +++ b/src/main/webapp/error.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Error + + +

Error

+

+ Try again. +

+ + \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..89936cc --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Index + + +

Index

+

+ Logged in as <%=request.getRemoteUser()%>. Logout +

+ + \ No newline at end of file diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp new file mode 100644 index 0000000..1294e7f --- /dev/null +++ b/src/main/webapp/login.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +JAAS Login + + +

Login

+
+

+ Username:
+

+

+ Password:
+

+

+ +

+
+ + \ No newline at end of file diff --git a/src/main/webapp/logout.jsp b/src/main/webapp/logout.jsp new file mode 100644 index 0000000..1376e37 --- /dev/null +++ b/src/main/webapp/logout.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Logout + + + <% + request.getSession().invalidate(); + %> +

Logged out.

+ + \ No newline at end of file