Supongo que no necesito sesiones de HTTP ni sesiones de servlets. Shiro tiene su propio administrador de sesión que es suficiente para mis necesidades. ¿Me equivoco?
No, tienes razón. Es por eso que Shiro es increíble. De documentation:
soporte para sesiones de Shiro es mucho más fácil de usar y administrar que cualquiera de estos dos [contenedor web o beans EJB con estado de sesión] mecanismos, y está disponible en cualquier aplicación, independientemente del contenedor.
e.g.
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
session.setAttribute("someKey", someValue);
citando the doc: getSession calls work in any application, even non-web applications
¿Es una buena práctica para dar el verdadero cliente sessionId o debería enviar algún tipo de sessionToken (que se resolvió sessionId en el lado del servidor)?
Es una mala idea enviar un ID de sesión simple. Especialmente, si está enviando datos a través de una red no encriptada. Use algo como HTTPS
o use algo de la línea
NONCE
.
Y, una nota al margen, si los datos POST http/s en lugar de tenerlo en la URL.
¿Cómo inicio sesión en el Asunto utilizando sessionId (que el cliente debe almacenar localmente)?
Quería decir cómo podría autenticar el tema una vez que tenga la ID de sesión? Usted puede simplemente, del doc,
Subject requestSubject = new Subject.Builder().sessionId(sessionId).buildSubject();
¿Hay otras cosas que necesito saber antes de hacer este tipo de autenticación?
Sí.
- Leer Shiro's Session Management
- magra sobre MITM Attack
- Sobre HTTPS y SSL
- Algunas de las funciones Hash this, Apache Commons DigestUtils y pueden ser this
Actualizaciones
Acerca de esa parte de autenticación de sujeto: ¿hará que el Asunto recién creado sea el sujeto autenticado actualmente? Si no, ¿cómo lo hago el tema "actual"?
Si habla de new Subject.Builder().sessionId(sessionId).buildSubject()
, no lo hará. Y no sé cómo configurarlo como currentUser para el hilo. Shiro's JavaDoc dice,
[de esta manera] devuelto La instancia del sujeto no se vincula automáticamente a la aplicación (hilo) para su uso posterior. Es decir, SecurityUtils.getSubject() no devolverá automáticamente la misma instancia que lo que devuelve el constructor. Depende del desarrollador del framework vincular el Subject construido para su uso continuo si así lo desea.
así, es hasta cómo se enlaza el tema en el hilo actual o uso posterior.
Si estaba preocupado acerca de cómo funciona SecurityUtils.getSubject();
, bueno, en el contexto del contenedor web, utiliza una cookie simple para almacenar sus datos de sesión. Cuando su solicitud llega a través del filtro Shiro, adjunta el sujeto actual para solicitar su ciclo de vida (hilo actual). Y cuando usted como getSubject()
simplemente obtiene el Subject
de la solicitud. Encontré un hilo interesante here.
about nonce parte: Si me envía algún tipo de hash en lugar de su sessionId - No podré decodificarlo para obtener sessionId real (para autorizarlo con eso). ¿Me estoy perdiendo de algo?
Nonce parte - es un dolor en el cuello. Ahora, volviendo a pensar, creo que hacer NONCE es exagerado. Permítanme explicar algunos, de todos modos,
El usuario inicia sesión por primera vez con su nombre de usuario y contraseña.Establezca userid
, nonce
(por ejemplo, UUID) y HASH(sessionID+nonce)
, llámelo hash1, en el lado del cliente. Decir, en galleta Guarde este nonce
en el lado del servidor, puede estar en DB o en un mapa como user_id <--> nonce,session_id
A petición posterior, asegúrese de que PASSBACK userid
, nonce
y la HASH
.
En el lado del servidor, lo primero que hará será validar la solicitud. Obtenga sessionId
y nonce
almacenados en el hashmap o DB basado en user_id
que fue enviado por el cliente. Cree un hash, HASH (sessionId_from_db + nonce_from_db), llámelo hash2.
Ahora, si coincide con hash1 hash2, puede validar la solicitud y puesto que usted ha almacenado actual sessionId en el lado del servidor, puede utilizarlo. Cuando se complete la solicitud, configure el nuevo nonce en la cookie y en el servidor.
Si pasa por 1 - 4, se dará cuenta de que no necesita Shiro para la autenticación. (: Por lo tanto, estoy tomando mis palabras de nuevo, NONCE no se aplica en este caso, a menos que esté demasiado extraño acerca de la seguridad sobre el rendimiento
¿Por qué MITM cuestión ataque a mí Mi cliente (código javascript ajax) recupera.? datos de su servidor a través de ajax. Así que no creo que debería preocuparme por MITM de ninguna manera.
Creo que debería importarle. MITM Attack significa que sus solicitudes/respuestas están siendo encadenadas a través de una máquina (MITM) a su enrutador. Si se trata de una solicitud no encriptada, todo es texto sin formato para el MITM. Puede ver todas sus solicitudes ... y posiblemente suplantar las solicitudes y puede secuestrar la sesión. Déjeme encontrar un ejemplo ... http://michael-coates.blogspot.com/2010/03/man-in-middle-attack-explained.html
Gracias por la respuesta detallada. Acerca de esa parte de autenticación de sujeto: ¿hará que el 'Asunto' recién creado sea el sujeto autenticado actualmente? Si no, ¿cómo lo hago el tema "actual"? – bezmax
Además, sobre la parte nonce: Necesito identificar al cliente por su ID de sesión de alguna manera. Si él me envía algún tipo de hash en lugar de su sessionId, no podré descifrarlo para obtener un sessionId real (para autorizarlo con eso). ¿Me estoy perdiendo de algo? – bezmax
Además, ¿por qué me ataca MITM? Mi cliente (código javascript ajax) obtiene datos de su servidor a través de ajax. Entonces, no creo que deba preocuparme por MITM de ninguna manera. – bezmax