angularjs - mvc - spring security web
AngularJs y Jboss y JAAS (1)
Si uno quisiera ver el marco de seguridad de JBoss como una posible explicación sobre cómo habilitar JAAS usando JBoss 6 y crear este web.xml
para configurar la seguridad de JAAS para proteger, es decir, una API de reposo:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/api</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>fileRealm</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.html</form-error-page>
</form-login-config>
</login-config>
<error-page>
<error-code>403</error-code>
<location>/accessdenied.jsp</location>
</error-page>
<security-constraint>
<display-name>Secured Content</display-name>
<web-resource-collection>
<web-resource-name>Secured Content</web-resource-name>
<url-pattern>/api/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>ADMINISTRATOR</role-name>
<role-name>MANAGER</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>ADMINISTRATOR</role-name>
</security-role>
<security-role>
<role-name>MANAGER</role-name>
</security-role>
<security-role>
<role-name>EMPLOYEE</role-name>
</security-role>
<security-role>
<role-name>USER</role-name>
</security-role>
<security-role>
<role-name>DEFAULT</role-name>
</security-role>
<session-config>
<session-timeout>5</session-timeout>
<cookie-config>
<name>SESSIONID</name>
</cookie-config>
</session-config>
</web-app>
entonces una URL como http://localhost:8080/webcontext/api/restpath
estará protegida y al pulsar esta URL se redirigirá a la página de inicio de sesión. Y esto funciona para mi
Ahora me gustaría incluir AngularJS en esta mezcla como frontend. ¿Seria posible? Es así, ¿cómo debería implementarlo? Si no, ¿cuáles son las alternativas? Idealmente, me gustaría usar JAAS.
Creo que lo que me gusta saber es cómo puedo cambiar el
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.html</form-error-page>
</form-login-config>
<form-login-page>
para servir, por ejemplo, un /partial/view/login.html
dentro de la aplicación Angular? (si esto tiene sentido) En otras palabras, deshacerse del archivo login.html
y tener JAAS redirigir a cualquier página / archivo se define en Angular como el formulario de inicio de sesión.
Puede usar la seguridad Servlet / Java EE para su punto final REST, que creo que es lo que está usando para Angular.
Sin embargo, el método de autenticación FORM probablemente no sea adecuado para esto, ya que está más destinado a la interacción real de usuario a aplicación, no a API. Java EE también tiene una opción CUSTOM. Eche un vistazo a este http://arjan-tijms.omnifaces.org/2014/11/header-based-stateless-token.html para la idea general.
Probablemente quieras actuar solo sobre los códigos de retorno HTTP. Haga que el módulo de autenticación Java EE devuelva un 403 * cuando el usuario no esté autenticado, luego, en su código angular, muestre una página de inicio de sesión / diálogo nativo basado en eso. El diálogo de inicio de sesión podría llamar a un punto final de inicio de sesión donde se intercambia un nombre de usuario / contraseña por un token que luego utilizará en las siguientes llamadas REST.
Asegúrese de acceder a todos los puntos finales protegidos utilizando HTTPS, pero al menos el servicio de inicio de sesión. Además, es probable que desee caducar el token después de un tiempo.
*) un 403 es un buen punto de partida, pero hay algo que decir para devolver siempre un 404, por lo que los atacantes no pueden comenzar a adivinar qué URL protegidas existen. Para verificar si la autenticación fue exitosa (no si la URL existe o está protegida) puede repetir el ID o el nombre del usuario autenticado en un encabezado.