DI Spring 3 + Spring Security 3

2 respostas
furacao123

Estou tentando montar um controle de usuario com Spring Security 3, mas na hora de injetar o objeto AuthenticationManager esta dando problemas.

segue a classe...

@Service(value="autenticacaoService")
public class AutenticacaoServiceImpl implements AutenticacaoService  {

    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    private AuthenticationManager authenticationManager;

dessa maneira quando faço o deploy a aplicação sobe mas o objeto authenticationManager continua nulo.

Ja dessa maneira funciona...

@Service(value="authenticationService")
public class AuthenticationService implements Serializable {

    @Autowired
    @Qualifier("authenticationManager")
    private AuthenticationManager authenticationManager;

o que estou fazendo de errado na classe AutenticacaoServiceImpl que esta diferente da AuthenticationService, na AutenticacaoService tentei com qualifier tb passando direto no atributo private com @Autowired mas dae a aplicação nem sobe pois nao é encontrado um bean para authenticationManager

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void br.com.grupointesis.delivery.service.impl.AutenticacaoServiceImpl.setAuthenticationManager(org.springframework.security.authentication.AuthenticationManager); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.security.authentication.AuthenticationManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:595)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
	... 37 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.security.authentication.AuthenticationManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:553)
	... 39 more

2 Respostas

heatcold

Para customizar a autenticação, crie um serviço que extenda UserDetailsService.

public interface AuthenticationService extends UserDetailsService {  }
@Service(value="authenticationService")  
@Transactional(rollbackFor = Exception.class)  
public class AuthenticationServiceImpl implements UserDetailsService {          
	public UserDetails loadUserByUsername(String username)              
	throws UsernameNotFoundException, DataAccessException {   
		// implement it as you want. im recovering the users using a singleton
		UserSingleton userSingleton = UserSingleton.getInstance();          
		return userSingleton.findByUsername(username);      
}      }
<security:global-method-security secured-annotations="enabled" />      
<security:authentication-provider user-service-ref="authenticationService" />             

<security:http>          
	<security:form-login />          
	<security:logout />      
</security:http>
furacao123

consegui implementar um controle de usuario da maneira que voce me passou, mas agora estou na duvida, por exemplo o SpringSecurity usa a tag de verificação sec:, e nessa verificação eu tenho de passar alguma regra de usuario por exemplo se for do tipo ROLE_ADMIN aparece determinado menu, mas estou desenvolvendo de outra forma, tenho uma tabela de permissoes, onde posso cadastrar n tipos de Usuario, e nessa tabela de permissoes eu vinculo ao tipo usuario as permissoes para abrir determinado menu etc, o Spring security disponibiliza alguma forma de trabalhar assim, ou tenho de montar na mao as opções de renderizar?

Nao sei se ficou muito claro…

Criado 1 de fevereiro de 2012
Ultima resposta 6 de fev. de 2012
Respostas 2
Participantes 2