2011-12-14 25 views
16

No tengo mucha experiencia en frameworks de autenticación Java y flujo de trabajo de autenticación en general (solo algunos conocimientos teóricos), por lo que intento crear este tipo de autenticación para mi HTTP aplicación:Autenticación Shiro con sessionId o nombre de usuario + contraseña

  1. Entrada de cliente Entradas + contraseña a /login.
  2. Shiro inicia sesión en el usuario con las credenciales especificadas. El servidor devuelve al cliente su sessionId.
  3. El cliente solicita algún tipo de recurso /myresource?sessionId=1234567.
  4. Shiro inicia sesión en el Asunto dando sessionId. A continuación, el servidor realiza el flujo de trabajo habitual para obtener el /myresource (con derechos de acceso a nivel de método de administración de Shiro).

Básicamente tengo estas preguntas:

  1. supongo que no tengo necesidad de sesiones HTTP ni sesiones de servlet. Shiro tiene su propio administrador de sesión que es suficiente para mis necesidades. ¿Me equivoco?
  2. ¿Es una buena práctica dar al cliente el sessionId real o debería enviar algún tipo de sessionToken (que se resuelve en sessionId en el lado del servidor)?
  3. ¿Cómo inicio sesión en el Asunto usando sessionId (que el cliente debe almacenar localmente)?
  4. ¿Hay alguna otra cosa que necesite saber antes de hacer este tipo de autenticación?

Gracias de antemano.

Respuesta

34

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í.

  1. Leer Shiro's Session Management
  2. magra sobre MITM Attack
  3. Sobre HTTPS y SSL
  4. 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,

  1. 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

  2. A petición posterior, asegúrese de que PASSBACK userid, nonce y la HASH.

  3. 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.

  4. 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

+0

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

+0

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

+0

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

Cuestiones relacionadas