Pregunta

Estoy construyendo una aplicación web usando rayas y primavera. Tiene que tener una característica de usuario / autenticación. En este momento puedo almacenar información del usuario separada de credenciales de usuario en la base de datos. Mi modelo de usuario no contiene las credenciales como no quiero que se pasa alrededor de contraseñas valiosas.

Primavera gestiona todos de mi DAO.

Ahora, yo estoy poniendo en práctica un sistema de seguridad basado en la no-contenedor. Almaceno el SHA-2 hash de la contraseña y realizar una comparación de la contraseña que se presentó en la forma en contra de lo que se almacena en la base de datos. Esta comparación ha sido probado y funciona. Estoy tratando de encontrar la manera de cablear esto juntos. Ahora mismo tengo un LoginActionBean que atrapa las solicitudes de inicio de sesión y utiliza un conjunto unitario "PasswordService" que utiliza un UserDAO internamente para recuperar las credenciales y realizar la comparación con los parámetros presentados. Mi grano de la primavera es:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

Pero entonces el singleton PasswordService necesita un:

public void setUserDAO(UserDAO userDAO) { ...}

método que en realidad no tiene sentido en un conjunto unitario (UserDAO es una interfaz).

Estoy en busca de un diseño adecuado. He leído que ServiceLocators son la razón de la primavera fue inventado. ¿Alguna idea?

También me gustaría saber de qué otra manera puedo diseñar esto. Tengo una ActionBean que se llama cuando el usuario hace clic en "Acceder", pero ¿cómo puedo realmente autentico. Cómo me inyecto el servicio de autenticación en el grano? Cómo puedo crear un producto único que cualquier persona puede llamar? ¿Tengo una interfaz genérica que el LoginAcionBean utiliza inyecta el que la primavera? Si no estaba usando la primavera, ¿cómo se puede hacer?

¿Fue útil?

Solución

  1. No entiendo por qué no tiene ningún sentido para inyectar el UserDAO.

  2. No entiendo por qué su xml está utilizando la fábrica-method = "getInstance"; se puede tirar a la basura todo el material instancia y cosas Singleton; primavera será una instancia de una sola instancia de la clase de servicio contraseña y lo inyecta en muchas clases obstante lo necesitan, y que van a obtener toda la misma instancia. Así que la primavera está creando un producto único para usted. La clase de servicio contraseña puede ser un POJO simple. Del mismo modo para la puesta en práctica UserDAO.

También te aconsejo mirar, comprender y utilizar las anotaciones de primavera. Básicamente se utiliza @Service en la clase que se inyecta, a continuación, utilizar @Autowired en la incubadora en la clase donde se inyecta. También es necesario añadir algo a su archivo de configuración XML para encender el material anotación.

Otros consejos

Añadir a la respuesta anterior, sólo tiene que utilizar la inyección de constructor, si usted no quiere un regulador para la DAO:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

A menos que el grano no es una clase que controles, no es necesario para que sea un Singleton, la primavera va a hacer que por defecto.

Yo personalmente no soy un fan de las anotaciones.

Mi solución era tener una interfaz con un método "autenticar". A continuación, cree una clase de servicio que implementa la interfaz con un constructor que toma un objeto en UserDAO. De esta manera, el objeto que requiere el servicio no realiza instanciación (se hace en la primavera) y no es consciente de lo que se lleva a cabo la implementación subyacente (LDAP, SSO, simple comparación contraseña, etc.). Parece hacer el trabajo: P

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top