Pergunta

Estou construindo uma aplicação web utilizando Listras e Primavera. Ele precisa ter um recurso de login / autenticação. Agora armazenar informações do usuário I separar as credenciais do usuário no banco de dados. Meu modelo de usuário não contém as credenciais como eu não quero estar passando em torno de senhas valiosas.

Spring gerencia todos os do meu DAO.

Agora, estou implementando um sistema de segurança baseado non-container. Eu armazenar o sha-2 hash da senha e realizar uma comparação sobre a senha que foi submetido na forma de encontro ao que é armazenado no banco de dados. Esta comparação foi testado e funciona. Eu estou tentando descobrir como ligar esta coisa juntos. Agora eu tenho um LoginActionBean que chama a solicitações de login e usa um "PasswordService" singleton que usa um UserDao internamente para recuperar as credenciais e executar comparação em função dos parâmetros apresentados. Meu feijão primavera é:

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

Mas então o singleton PasswordService precisa de um:

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

método que realmente não faz sentido em um Singleton (UserDao é uma interface).

Eu estou procurando um projeto adequado. Eu li que ServiceLocators são a própria razão da Primavera foi inventado. Quaisquer pensamentos?

Eu também gostaria de saber como mais posso conceber isso. Eu tenho um ActionBean que é chamado quando o usuário clicar em "Login", mas como eu realmente autenticar. Faço para injetar o serviço de autenticação para o feijão? Faço para criar um singleton que qualquer um pode chamar? Eu tenho uma interface genérica que os usos LoginAcionBean que injeta Primavera? Se eu não estava usando Spring, como é que isso seja feito?

Foi útil?

Solução

  1. Eu não entendo por que ele não faz qualquer sentido para injetar o UserDao.

  2. Eu não entendo por que seu xml está usando fábrica-method = "getInstance"; você pode jogar fora todo o material instância e coisas Singleton; Primavera irá instanciar uma única instância da classe de serviço senha e injetá-lo em no entanto muitas classes precisa dele, e todos eles vão ficar na mesma instância. Primavera Então é criar um singleton para você. A classe de serviço senha pode ser um pojo simples. Da mesma forma para a implementação UserDao.

Eu também aconselho a olhar, compreender e usar as anotações de primavera. Basicamente você usa @Service na classe que será injetado, então use @Autowired na setter na classe onde é injetado. Você também precisa acrescentar algo ao seu arquivo de configuração XML para ligar o material de anotação.

Outras dicas

Para aumentar a resposta acima, basta usar injeção de construtor se você não quer um setter para o DAO:

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

A menos que o feijão não é uma classe que você controle, você não precisa para torná-lo um Singleton, Primavera vai fazer isso por padrão.

Eu, pessoalmente, não sou um fã de anotações.

A minha solução era ter uma interface com um método de "autenticar". Em seguida, crie uma classe de serviço que implementa a interface com um construtor que leva em um objeto UserDao. Desta forma, o objeto que requer o serviço não executa instanciação (ele é feito pela primavera) e não tem conhecimento de que a implementação subjacente é realizada (LDAP, SSO, comparação simples senha, etc). Parece fazer o trabalho: P

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top