Spring security

66 respostas
L

Mestres da arte java, boa tarde.

Alguém está usando o Spring Security?

Eu estou querendo implementar no meu projeto mas estou meio sem norte. Será que alguém poderia dizer como eu poderia estar começando…?!

Só um detalhe, o google mais um monte de links aqui onde trabalho são bloqueados, por isso que eu estou fazendo essa pergunta meio generica, e como eu não queria esperar até a noite pra chegar em casa e pesquisar gostaria de saber se alguém poderia ajudar.

Agradeço desde já.

66 Respostas

F

Fala cara! :smiley:
Bom, depois de muito tempo tentando implementar o spring security na minha aplicação, eu consegui resultado semana passada, e realmente na net eu não achei muitas referências sobre o assunto. Então lá vai, vou comentando o que for necessário…

web.xml

...
<!-- Spring xml config locations -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		classpath:/spring-config.xml <!-- caminho do seu xml de config do spring -->
		classpath:/spring-security.xml <!-- caminho do seu xml de config do spring-security -->
	</param-value>
</context-param>

<!-- Spring Security -->
<filter>
	<filter-name>springSecurityFilterChain</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
	<filter-name>springSecurityFilterChain</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
...

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
  http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

  	<global-method-security secured-annotations="enabled" /><!-- Habilita anotações nos seus beans -->
	
	<http auto-config="true" access-denied-page="/accessDenied.faces">
	<!-- Restrict URLs based on role -->
	<intercept-url pattern="/protected/user/**" access="ROLE_USER" /><!-- Seus papeis no sistema (roles) e as pastas que possuem acesso -->
	<intercept-url pattern="/protected/adm/**" access="ROLE_ADM" />
	<intercept-url pattern="/protected/**" access="ROLE_USER, ROLE_ADM" />
	
	<form-login login-page="/signin.faces" 
		login-processing-url="/j_spring_security_check" 
		default-target-url="/home.faces" 
		authentication-failure-url="/signin.faces?auth_failure=true" />
	
	<logout logout-url="/signout*" logout-success-url="/" />

	<authentication-provider user-service-ref="customUserDetailsService"/><!-- Sua classe customizada para validar o seu usuario pelo banco -->
</beans:beans>

CustomUserDetailsService.java

@Component
public class CustomUserDetailsService implements UserDetailsService {

	@Autowired
	private UserDao userDao;//Seu dao aqui
	

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
		try {
			User user = userDao.findByLogin(username);//seu metodo que faz uma consulta por login e retorna um objeto User
			return user;
		} catch (ModelException e) {
			throw new UsernameNotFoundException("User not found: " + username);
		}
	}
}

User.java

@Entity
@Table
public class User implements java.io.Serializable, UserDetails {//vc precisa implementar o UserDetails na sua classe User
	private Long id;
	private String login;
	private String password;
	private boolean actived = true;
	private List<Role> roles = new ArrayList<Role>();

	//Getters and Setters omitidos...

	@Transient
	public GrantedAuthority[] getAuthorities() {
		return this.roles.toArray(new Role[]{});
	}
	@Transient
	public String getUsername() {
		return this.login;
	}
	@Transient
	public boolean isAccountNonExpired() {
		return true;
	}
	@Transient
	public boolean isAccountNonLocked() {
		return true;
	}
	@Transient
	public boolean isCredentialsNonExpired() {
		return true;
	}
	@Transient
	public boolean isEnabled() {
		return (this.actived);
	}

Role.java

@Entity
@Table
public class Role implements java.io.Serializable, GrantedAuthority {//é bom implementar o GrantedAuthority na sua classe Role tb
	private Long id;
	private String name;

	//Getters and Setters omitidos...

	@Transient
	public String getAuthority() {
		return this.name;
	}
	@Transient
	public int compareTo(Object o) {
		return this.compareTo(o);
	}

login.jsp

<form action="j_spring_security_check" method="post">
      		Login: <input type="text" name="j_username" value="${SPRING_SECURITY_LAST_USERNAME}" />
      		Senha: <input type="password" name="j_password"/>
        	<input type="checkbox" name="_spring_security_remember_me" /> Salvar as minhas informações neste computador?
        	<input name="submit" type="submit" value="Login" />
    	</form>

Cara, escrevi bem rápido, copiei e colei tudo praticamente, se vc tiver duvida na implementação me avisa…

Mas basicamente tá tudo que vc precisa aí… ele precisa da entidade User e Role, e o relacionamento delas é ManyToMany (pelo menos no meu caso funcionou assim).

L

Nossa, não sei nem como agradecer.

Como eu comentei, na empresa é bloqueado Google e mais uma pancada de sites, por isso que eu estou respondendo a noite(de casa)…rs., mas assim, vou implementar isso até o fim da semana e te falo o resultado.

Muito obrigado mesmo. Eu até comprei o livro Spring em ação e vou colocar isso em ação com certeza…rs.

Valeu, show de bola.

F

Tranquilo :smiley:
Qualquer coisa posta ae, e se conseguir resolver de um jeito melhor pode postar tb que eu aplico aqui hehehe… :smiley:

Abração!

E

Felipe, tenho minha configuração baseada na sua. Mas não consigo acessar a pagina protegida. Qdo o login é feito vou para a pagina secure2.jsp e lá tem um link para /protected/secure.jsp, mas ao clicar sou direcionado para a pagina accessDenied.jsp

Sabe me dizer por que ??

<global-method-security secured-annotations="enabled" />
	
	<http auto-config="true" access-denied-page="/accessDenied.jsp">   
		<intercept-url pattern="/protected/secure.jsp" access="ROLE_ADMIN, ROLE_USER" />
		<form-login login-page="/login.jsp" 
					login-processing-url="/j_spring_security_check" 
					default-target-url="/secure2.jsp" 
					authentication-failure-url="/fail.jsp?auth_failure=true" />
		<logout  logout-success-url="/logout.jsp"  />
	</http>
	<authentication-provider user-service-ref="customUserDetailsService" />
F
everjava:
Felipe, tenho minha configuração baseada na sua. Mas não consigo acessar a pagina protegida. Qdo o login é feito vou para a pagina secure2.jsp e lá tem um link para /protected/secure.jsp, mas ao clicar sou direcionado para a pagina accessDenied.jsp

Sabe me dizer por que ??

<global-method-security secured-annotations="enabled" />
	
	<http auto-config="true" access-denied-page="/accessDenied.jsp">   
		<intercept-url pattern="/protected/secure.jsp" access="ROLE_ADMIN, ROLE_USER" />
		<form-login login-page="/login.jsp" 
					login-processing-url="/j_spring_security_check" 
					default-target-url="/secure2.jsp" 
					authentication-failure-url="/fail.jsp?auth_failure=true" />
		<logout  logout-success-url="/logout.jsp"  />
	</http>
	<authentication-provider user-service-ref="customUserDetailsService" />
Olá everjava, Você se certificou de que o usuário que você está se logando possui uma dessas permissões (ROLE_ADMIN, ROLE_USER) que você declarou para a tela "secure.jsp"? Tenta visualizar os roles que o seu usuário tem depois que se logar:
SecurityContextHolder.getContext().getAuthentication().getAuthorities()
Tenta usar essa chamada acima pra recuperar um array de roles que o usuário logado possui.

Qualquer coisa posta aí cara :D

Abraços.

E

Consegui.

no método public GrantedAuthority[] getAuthorities() eu estava passando new GrantedAuthorityImpl(role.toString()); entao rebebia o objeto Role ao invés do ROLE_ADMIN
Mudei pra new GrantedAuthorityImpl(role.getAuthority())

valeo!!

L

Olá pessoal,
tbém toh utilizando o Spring-security… toh gostando dele…,
toh precisando saber como ativar os logs das ocorrências dos usuários…???, onde devo ativar isto? no tomcat ou o próprio spring-security tem esta funionalidade ?
se alguém puder me jaudar…

minha aplicação tá igual á do felipepantoja… e está funcionando bem com MySQL…
abraços á todos…

D

Felipe, tudo bem ?

Estou usando Spring Security em minha aplicação web.
Mas como sou iniciante em Java, gostaria de saber se tem como vc detalhar mais… por exemplo… quais jars foram utilizados…

Voce teria algum exemplo pronto …

muito obrigado

D

OLá,

Na classe CustomUserDetailsService.java tem um:

E este chama um método findByLogin(username)

Gostaria de saber se alguém teria esse método para me passar.

Muito obrigado

E

não tenho esse método no momento, mas é apenas uma consulta na tabela e depois preenche o bean User com os valores do usuario

H

como fica esse get da classe User?

public Collection<GrantedAuthority> getAuthorities() {}

F

dugbuddy:
OLá,

Na classe CustomUserDetailsService.java tem um:

E este chama um método findByLogin(username)

Gostaria de saber se alguém teria esse método para me passar.

Muito obrigado

Fala cara!
Como o everjava falou, esse método apenas vai no banco e popula o meu objeto User com os seus dados de acordo com o login.
Sobre os jars utilizados, basicamente, pra que o spring security funcione, estou usando os seguintes jars:

  • spring-2.5.6.jar
  • spring-security-core-2.0.4.jar

Acho que é só isso, mas como uso o maven aqui, não sei se ele baixa outras dependências. :smiley:

F

hodrigohamalho:
como fica esse get da classe User?

public Collection<GrantedAuthority> getAuthorities() {}

hodrigohamalho, se vc possuir uma classe de Papéis (Roles), que se relacione com a sua classe Usuario, vc poderia fazer como eu fiz no exemplo lá em cima.

//User.java
public class User implements UserDetails {
    private List<Role> roles = new ArrayList<Role>();  
    //...
    
    @Transient  
    public GrantedAuthority[] getAuthorities() {  
        return this.roles.toArray(new Role[]{});  
    }
//...
}
//Role.java
public class Role implements java.io.Serializable, GrantedAuthority {
//...
}
D

Felipe,

Eu fiz de acordo com o seu exemplo…

Mas no meu spring-security.xml eu tentei colocar do seu exemplo:

<authentication-provider user-service-ref="customUserDetailsService"> </authentication-provider>

Mas ele nao encontra… tem alguma outra configuracao que eu devo colocar…
Adicionar um bean no spring-security.xml ou no application-context.xml ?

12/01/2010 09:46:35 org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainProxy': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot resolve reference to bean '_rememberMeFilter' while setting bean property 'filters' with key [6]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot resolve reference to bean '_rememberMeFilter' while setting bean property 'filters' with key [6]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:126) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.security.config.FilterChainProxyPostProcessor.postProcessBeforeInitialization(FilterChainProxyPostProcessor.java:52) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) ... 29 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269) ... 47 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269) ... 60 more Caused by: org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.getUserDetailsService(UserDetailsServiceInjectionBeanPostProcessor.java:108) at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.injectUserDetailsServiceIntoRememberMeServices(UserDetailsServiceInjectionBeanPostProcessor.java:53) at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.postProcessBeforeInitialization(UserDetailsServiceInjectionBeanPostProcessor.java:36) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) ... 69 more

Obrigado pela ajuda

F

dugbuddy:
Felipe,

Eu fiz de acordo com o seu exemplo…

Mas no meu spring-security.xml eu tentei colocar do seu exemplo:

<authentication-provider user-service-ref="customUserDetailsService"> </authentication-provider>

Mas ele nao encontra… tem alguma outra configuracao que eu devo colocar…
Adicionar um bean no spring-security.xml ou no application-context.xml ?

12/01/2010 09:46:35 org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainProxy': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot resolve reference to bean '_rememberMeFilter' while setting bean property 'filters' with key [6]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot resolve reference to bean '_rememberMeFilter' while setting bean property 'filters' with key [6]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:126) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.security.config.FilterChainProxyPostProcessor.postProcessBeforeInitialization(FilterChainProxyPostProcessor.java:52) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) ... 29 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeFilter': Cannot resolve reference to bean '_rememberMeServices' while setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269) ... 47 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_rememberMeServices': Initialization of bean failed; nested exception is org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269) ... 60 more Caused by: org.springframework.security.config.SecurityConfigurationException: No UserDetailsService registered. at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.getUserDetailsService(UserDetailsServiceInjectionBeanPostProcessor.java:108) at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.injectUserDetailsServiceIntoRememberMeServices(UserDetailsServiceInjectionBeanPostProcessor.java:53) at org.springframework.security.config.UserDetailsServiceInjectionBeanPostProcessor.postProcessBeforeInitialization(UserDetailsServiceInjectionBeanPostProcessor.java:36) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) ... 69 more

Obrigado pela ajuda

Você precisa criar a classe CustomUserDetailsService, implementando a interface UserDetailsService, e colocar a anotação “Component” do Spring, em cima da declaração da classe, como está no exemplo logo abaixo:

@Component public class CustomUserDetailsService implements UserDetailsService {

Assim, na inicialização do teu container web, o spring vai procurar todas as classes anotadas com esses estereótipos dele e vai criar os beans. Se não me engano ainda tem que fazer uma configuração no spring-config.xml, mostrando pro spring onde ele tem que procurar por essas classes, acho que é isso:

<context:component-scan base-package="br.com.seupackage"/> <context:annotation-config/>

D

Felipe,

eu coloquei esta configuração no meu application-context.xml:

<context:component-scan base-package="br.com.seupackage"/>
<context:annotation-config/>

e deu este erro abaixo:

12/01/2010 10:35:20 org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customUserDetailsService': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.vetoreditora.psiconline.dao.UserDao br.com.vetoreditora.psiconline.security.CustomUserDetailsService.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.vetoreditora.psiconline.dao.UserDao br.com.vetoreditora.psiconline.security.CustomUserDetailsService.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435)
	at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
	... 31 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
	... 33 more

Esta é a minha classe CustomUserDetailsService.java

package br.com.vetoreditora.psiconline.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import br.com.vetoreditora.psiconline.dao.UserDao;

@Component
public class CustomUserDetailsService implements UserDetailsService {

	@SuppressWarnings("unchecked")
	@Autowired
	private UserDao userDao;// Seu dao aqui

	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
		try {
			User user = userDao.findByLogin(username);// seu metodo que faz uma
														// consulta por login e
														// retorna um objeto
														// User
			return user;
		} catch (Exception e) {
			throw new UsernameNotFoundException("User not found: " + username);
		}
	}

}

Voce precisa que eu coloque o UserDao?

Obrigado

F

dugbuddy, parece que o tem dois beans no spring com o mesmo nome da tua dao “userDao”, vc tem mais de uma implementação de userDao no teu sistema? por exemplo userDaoOracle e userDaoMySQL?? Se for isso, vc vai ter que colocar a anotação em cima deles e criar um name pra cada um diferente, exemplo:

@Repository(userDaoOracle) //Primeira letra minúscula por convenção

public class UserDaoOracle implements UserDao {

//…

}
@Repository(userDaoMySQL) //Primeira letra minúscula por convenção

public class UserDaoMySQL implements UserDao {

//…

}

E no seu CustomUserDetailsService vc teria que dar um qualifier pra especificar qual bean vc quer injetar e não dar conflito como aparentemente foi o teu caso:

@Component
public class CustomUserDetailsService implements UserDetailsService {

@Autowired  
@Qualifier("userDaoOracle")//oracle por exemplo
private UserDao userDao;//Seu dao aqui

//…
}

E lembrando que, uma vez que vc anotou teus beans programaticamente, vc não precisa criá-los via xml no aplication-context.xml

D

Felipe…

So tenho o UserDao mesmo…

Nao tenho mais nenhum UserDao na implementação do meu sistema.

Eu estou tentando aqui … mas continua com o mesmo erro.

obrigado…

F

mostra o teu userDao (mesmo que omitindo regras do sistema) e o teu aplication-context.xml

D
UserDao.java
import java.io.Serializable;

import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;

public interface UserDao <T, PK extends Serializable> {

	public User findByLogin(String username) throws DataAccessException;


}
UserDaoHibernate.java
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.security.userdetails.User;
import org.springframework.security.userdetails.UsernameNotFoundException;

import br.com.vetoreditora.psiconline.dao.UserDao;

@SuppressWarnings("unchecked")
public class UserDaoHibernate<T, PK extends Serializable> extends HibernateDaoSupport implements UserDao<T, PK> {
	
    
	/** Logger utilizado pela classe. */
    final Logger logger = LoggerFactory.getLogger(UserDaoHibernate.class);

    /** Classe persistente do POJO que o DAO irá gerenciar. */
    protected Class<T> persistentClass;

    /**
     * Construtor padrão que inspeciona através do método <strong>java.lang.Class.getGenericSuperclass()</strong> qual
     * será a classe do POJO gerenciado pelo DAO.
     * 
     * @see Class#getGenericSuperclass()
     */
    public UserDaoHibernate() {

        logger.debug("Iniciando DAO Genérico \"UserDaoHibernate()\"...");

        persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    /**
     * Construtor que recebe como parâmetro a classe do POJO que o DAO irá gerenciar. Este construtor habilita a
     * declaração do DAO no arquivo de contexto do Spring, já que a classe só será conhecida em tempo de deploy da
     * aplicação.
     * 
     * Exemplos estão disponíveis nos testes unitários deste componente.
     * 
     * @param persistentClass
     *            Classe do POJO que o DAO irá gerenciar.
     */
    public UserDaoHibernate(final Class<T> persistentClass) {

        logger.debug("Iniciando DAO Genérico \"GenericDaoHibernate" + "(Class<T>)\"...");

        this.persistentClass = persistentClass;
    }

	@Override
	public User findByLogin(String username) throws DataAccessException {
		List users = getHibernateTemplate().find("from User where username=?", username);
        if (users == null || users.isEmpty()) {
            throw new UsernameNotFoundException("user '" + username + "' not found...");
        } else {
            return (User) users.get(0);
        }

	}

}
UserManager.java
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;

public interface UserManager <T, PK extends Serializable> {
	
	User findByLogin(String username) throws DataAccessException;

}
UserManagerImpl.java
import java.io.Serializable;

import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;
import org.springframework.transaction.annotation.Transactional;

import br.com.vetoreditora.psiconline.dao.UserDao;
import br.com.vetoreditora.psiconline.service.UserManager;

@Transactional(readOnly = true)
public class UserManagerImpl<T, PK extends Serializable> implements UserManager<T, PK> {

	  /** DAO genérico usado pelos managers desta classe. */
    protected UserDao<T, PK> userDao;

    /**
     * Construtor default para instanciação direta através do operador new.
     */
    public UserManagerImpl() {
    }

    /**
     * Construtor que recebe uma referência do DAO para realizar as operações de CRUD junto ao banco. Mantém uma
     * referência para evitar casting do DAO nos métodos dessa classe.
     * 
     * @param genericDao
     *            DAO genérico utilizado nas operações de acesso a base de dados.
     */
    public UserManagerImpl(UserDao<T, PK> userDao) {
        this.userDao = userDao;
    }
	
	@Override
	public User findByLogin(String username) throws DataAccessException {
		// TODO Auto-generated method stub
		return null;
	}

}

application-context.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			            http://www.springframework.org/schema/context
			            http://www.springframework.org/schema/context/spring-context-2.5.xsd
			            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


	<context:component-scan base-package="br.com.vetoreditora.psiconline.security" />
	<context:annotation-config />

	<!--
		Habilita o comportamento transactional através do uso de anotações nas
		classes
	-->
	<tx:annotation-driven transaction-manager="transactionManager" />

	<!-- Substitui os valores entre ${} pelas propriedades da aplicação -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:database.properties</value>
		</property>
	</bean>


	<!-- Datasource -->
	<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	<!--
		Session factory customizada que permitirá a inclusão de pacotes para
		onde se encontram as entidades da aplicação. Esta session factory
		estará disponível na versão 2.5.6 do framework spring
	-->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="datasource" />
		<property name="packagesToScan" value="br.com.vetoreditora.psiconline.models" />
		<property name="hibernateProperties">
			<value>
				hibernate.dialect=${jdbc.hibernate.dialect}
				hibernate.hbm2ddl.auto=update
				hibernate.query.substitutions=true 'Y',
				false 'N'
				hibernate.show.sql=true
				hibernate.cache.use_second_level_cache=true
				hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
				hibernate.connection.useUnicode = true
				hibernate.connection.charSet =
				UTF8
				
			</value>
		</property>
	</bean>

	<!-- Gerenciador de transação local para uma simples sessionfactory -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>


	<!-- Empresa DAO-->
	<bean id="empresaDao"
		class="br.com.vetoreditora.psiconline.dao.hibernate.GenericDaoHibernate">
		<constructor-arg value="br.com.vetoreditora.psiconline.models.Empresa" />
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- Empresa Manager-->
	<bean id="empresaManager"
		class="br.com.vetoreditora.psiconline.service.impl.GenericManagerImpl">
		<property name="genericDao" ref="empresaDao" />
	</bean>




	

</beans>
D

Caso precise...

Meu User e Role

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.validator.NotNull;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.userdetails.UserDetails;

@SuppressWarnings("serial")
@Entity
@Table(name = "USER")
public class User implements java.io.Serializable, UserDetails {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "USER_ID")
	private Long id;
	
	@NotNull
	@Column(name = "LOGIN")
	private String login;
	
	@NotNull
	@Column(name = "PASSWORD")
	private String password;
	
	
	private boolean actived = true;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
	private List<Role> roles = new ArrayList<Role>();


	@Transient
	public GrantedAuthority[] getAuthorities() {
		return this.roles.toArray(new Role[] {});
	}

	@Transient
	public String getUsername() {
		return this.login;
	}

	@Transient
	public boolean isAccountNonExpired() {
		return true;
	}

	@Transient
	public boolean isAccountNonLocked() {
		return true;
	}

	@Transient
	public boolean isCredentialsNonExpired() {
		return true;
	}

	@Transient
	public boolean isEnabled() {
		return (this.actived);
	}

	/**
	 * Recupera a propriedade id
	 * 
	 * @return O valor da propriedade id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * Configura a propriedade id
	 * 
	 * @param id
	 *            Novo valor para a propriedade id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Recupera a propriedade login
	 * 
	 * @return O valor da propriedade login
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * Configura a propriedade login
	 * 
	 * @param login
	 *            Novo valor para a propriedade login to set
	 */
	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * Recupera a propriedade password
	 * 
	 * @return O valor da propriedade password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * Configura a propriedade password
	 * 
	 * @param password
	 *            Novo valor para a propriedade password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * Recupera a propriedade actived
	 * 
	 * @return O valor da propriedade actived
	 */
	public boolean isActived() {
		return actived;
	}

	/**
	 * Configura a propriedade actived
	 * 
	 * @param actived
	 *            Novo valor para a propriedade actived to set
	 */
	public void setActived(boolean actived) {
		this.actived = actived;
	}

	/**
	 * Recupera a propriedade roles
	 * 
	 * @return O valor da propriedade roles
	 */
	public List<Role> getRoles() {
		return roles;
	}

	/**
	 * Configura a propriedade roles
	 * 
	 * @param roles
	 *            Novo valor para a propriedade roles to set
	 */
	public void setRoles(List<Role> roles) {
		this.roles = roles;
	}

}
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.validator.NotNull;
import org.springframework.security.GrantedAuthority;

@SuppressWarnings("serial")
@Entity
@Table(name = "ROLE")
public class Role implements java.io.Serializable, GrantedAuthority {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "ROLE_ID")
	private Long id;
	
	@NotNull
	@Column(name = "NOME")
	private String name;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID"))
	private List<User> users = new ArrayList<User>();


	@Transient
	public String getAuthority() {
		return this.name;
	}

	@Transient
	public int compareTo(Object o) {
		return this.compareTo(o);
	}

	/**
	 * Recupera a propriedade id
	 * 
	 * @return O valor da propriedade id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * Configura a propriedade id
	 * 
	 * @param id
	 *            Novo valor para a propriedade id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Recupera a propriedade name
	 * 
	 * @return O valor da propriedade name
	 */
	public String getName() {
		return name;
	}

	/**
	 * Configura a propriedade name
	 * 
	 * @param name
	 *            Novo valor para a propriedade name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Recupera a propriedade users
	 *
	 * @return O valor da propriedade users
	 */
	public List<User> getUsers() {
		return users;
	}

	/**
	 * Configura a propriedade users
	 *
	 * @param users Novo valor para a propriedade users to set
	 */
	public void setUsers(List<User> users) {
		this.users = users;
	}

}
F

Parece que tá tudo certo, só anota com Repository a tua classe “UserDaoHibernate”:

@SuppressWarnings("unchecked") @Repository public class UserDaoHibernate&lt;T, PK extends Serializable&gt; extends HibernateDaoSupport implements UserDao&lt;T, PK&gt; {

Mostra como tá sua classe CustomUserDetails

D

Então … eu não tenho a classe CustomUserDetails…
Lá no seu exemplo… não tinha…
como seria essa classe?

F

dugbuddy:
Então … eu não tenho a classe CustomUserDetails…
Lá no seu exemplo… não tinha…
como seria essa classe?

Na verdade eu quis dizer CustomUserDetailsService, ela que vai ser interceptada nas chamadas de login.

@Component
public class CustomUserDetailsService implements UserDetailsService {

@Autowired
private UserDao userDao;//Seu dao aqui


@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
	try {
		User user = userDao.findByLogin(username);//seu metodo que faz uma consulta por login e retorna um objeto User
		return user;
	} catch (ModelException e) {
		throw new UsernameNotFoundException("User not found: " + username);
	}
}

}

D

Essa eu tenho.. eu cheguei a coloca-la aqui.. vou postar...

CustomUserDetailsService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import br.com.vetoreditora.psiconline.dao.UserDao;

@Component
public class CustomUserDetailsService implements UserDetailsService {

	@SuppressWarnings("unchecked")
	@Autowired
	private UserDao userDao;// Seu dao aqui

	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
		try {
			User user = userDao.findByLogin(username);// seu metodo que faz uma
														// consulta por login e
														// retorna um objeto
														// User
			return user;
		} catch (Exception e) {
			throw new UsernameNotFoundException("User not found: " + username);
		}
	}

}
D

Quais são as classes que eu preciso para implementar o SS?

Eu tenho essas?

  • UserDao.java
  • UserDaoHibernate.java
  • UserManager.java
  • UserManagerImpl.java
  • Role.java
  • User.java
  • CustomUserDetailsService.java
    *spring-security.xml

preciso de mais alguma??

D

Felipe...

eu comentei a linha @Autowired.... ele subiu a aplicação sem problemas...
É necessario essa anotação?

@Component
public class CustomUserDetailsService implements UserDetailsService {

	@SuppressWarnings("unchecked")
//	@Autowired
	private UserDao userDao;// Seu dao aqui
F

dugbuddy:
Quais são as classes que eu preciso para implementar o SS?

Eu tenho essas?

  • UserDao.java
  • UserDaoHibernate.java
  • UserManager.java
  • UserManagerImpl.java
  • Role.java
  • User.java
  • CustomUserDetailsService.java
    *spring-security.xml

preciso de mais alguma??

Depende de como vc vai implementá-lo.
Assim cara, no seu caso, como vc quer fazendo usando hibernate, e já possui as entidades User e Role implementando as interfaces do Spring Security, é mais ou menos a mesma coisa que fiz. Qual é o problema que vc tá tendo? Tá dando alguma outra exception? Manda o stackTrace…

Ah cara, é bom também vc dar uma olhada na documentação, lá tá quase tudo bem mastigado: http://static.springsource.org/spring-security/site/docs/2.0.x/reference/springsecurity.html

F
dugbuddy:
Felipe...

eu comentei a linha @Autowired.... ele subiu a aplicação sem problemas...
É necessario essa anotação?

@Component
public class CustomUserDetailsService implements UserDetailsService {

	@SuppressWarnings("unchecked")
//	@Autowired
	private UserDao userDao;// Seu dao aqui

Cara, qual a versão do spring vc tá usando?
Dá uma pesquisada sobre injeção de dependências do spring + annotations.
O @AutoWired serve pra vc injetar o seu bean nessa classe e usá-lo sem precisar expor a sua instância diretamente, se vc não usá-lo, seu objeto não tem instância, é nulo.
Provavelmente vc tá usando uma versão antiga do Spring que não possui suporte a anotações de DI, procura pelo spring-2.5.6 que é a versão atual estável.
Agora, é muito estranho ele não encontrar a anotação @AutoWired e encontrar a @Component. De repente vc nem importou o pacote dela. Dá um Ctrl+Shift+O na tua classe CustomUserDetailsService.
No ruim cara, se não der certo, faz a injeção via xml mesmo, no arquivo de config do spring.

D

Felipe…

Eu vou dar uma olhada nesta documentação.

Mas o erro que está gerando é o mesmo que eu te passei…

este abaixo

12/01/2010 14:06:32 org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customUserDetailsService': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.vetoreditora.psiconline.dao.UserDao br.com.vetoreditora.psiconline.security.CustomUserDetailsService.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.vetoreditora.psiconline.dao.UserDao br.com.vetoreditora.psiconline.security.CustomUserDetailsService.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435) at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240) ... 31 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.vetoreditora.psiconline.dao.UserDao] is defined: Unsatisfied dependency of type [interface br.com.vetoreditora.psiconline.dao.UserDao]: expected at least 1 matching bean at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:613) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412) ... 33 more

D

Felipe…

Eu estou usando o Spring 2.5.6

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
			<version>2.5.6</version>
		</dependency>

Não sei o pq não está encontrando esta anotação… Eu vou ver se é alguma configuração … vo dar uma pesquisada… muito obrigado pela ajuda…
Se fosse via xml… como ficaria?

Qql coisa eu posto aqui minhas duvidas =]

valeu msm !!!

abraços

D

Estou usando agora um XML...

veja como ficou o meu CustomUserDetailService.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.security.userdetails.User;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import br.com.vetoreditora.psiconline.service.UserManager;

@Component
public class CustomUserDetailsService implements UserDetailsService {

	
//	@SuppressWarnings("unchecked")
//	@Autowired
//	private UserDao userDao;// Seu dao aqui

	@SuppressWarnings("unchecked")
	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserManager<User, Long> userManager = (UserManager<User, Long>) context.getBean("userManager");
	
		try {
			// seu metodo que faz uma consulta por login e retorna um objeto User
			User user = userManager.findByLogin(username);
			return user;
		} catch (Exception e) {
			throw new UsernameNotFoundException("User not found: " + username);
		}
	}

}

No application-context.xml ficou assim:

<!-- User DAO-->
	<bean id="userDao"
		class="br.com.vetoreditora.psiconline.dao.hibernate.GenericDaoHibernate">
		<constructor-arg value="br.com.vetoreditora.psiconline.models.User" />
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- User Manager-->
	<bean id="userManager"
		class="br.com.vetoreditora.psiconline.service.impl.GenericManagerImpl">
		<property name="genericDao" ref="userDao" />
	</bean>

Vou fazer o teste..rs

abracos e valeu

D

Felipe,

Tudo bem?

Uma perguntinha…

Na classe User.java, vc tem :

Pq eu tenho que ter isso ?? é do Spring que vai setar se o usuario esta ativo ou inativo ?

obrigado

F

dugbuddy:
Felipe,

Tudo bem?

Uma perguntinha…

Na classe User.java, vc tem :

Pq eu tenho que ter isso ?? é do Spring que vai setar se o usuario esta ativo ou inativo ?

obrigado

dugbuddy, isso aí é pra um controle meu, não tem relação com o spring não… eu uso pra dizer que quando o usuário é cadastrado ele está ativo, mas o adm pode desativá-lo a qualquer momento.

D

Felipe,

Tudo bem ? Eu fiz oq vc recomendou ...
Utilizar via xml...

<!-- Usuario DAO-->
	<bean id="usuarioDao"
		class="br.com.vetoreditora.psiconline.dao.hibernate.GenericDaoHibernate">
		<constructor-arg value="br.com.vetoreditora.psiconline.models.Usuario" />
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- Usuario Manager-->
	<bean id="usuarioManager"
		class="br.com.vetoreditora.psiconline.service.impl.GenericManagerImpl">
		<property name="genericDao" ref="usuarioDao" />
	</bean>

Só que eu nao estou conseguindo fazer essa chamada dentro do método

@Component
public class CustomUserDetailsService implements UserDetailsService {

	
//	@SuppressWarnings("unchecked")
//	@Autowired
//	private UserDao userDao;// Seu dao aqui

	@SuppressWarnings("unchecked")
	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {

		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

		GenericManager<Usuario, Long> usuarioManager = (GenericManager<Usuario, Long>) context.getBean("userManager");
	
		try {
			// seu metodo que faz uma consulta por login e retorna um objeto User
			Usuario Usuario = usuarioManager.findByLogin(username);
			return Usuario;
		} catch (Exception e) {
			throw new UsernameNotFoundException("User not found: " + username);
		}
	}

Como eu faria isso? vc poderia me ajudar?

Muito Obrigado

D

Felipe

na sua aplicação, vc esta usando

public class User implements java.io.Serializable, UserDetails {  
 
     private boolean actived = true;

O SS consegue validar caso esteja actived = false?

Obrigado

F
dugbuddy:
Felipe

na sua aplicação, vc esta usando

public class User implements java.io.Serializable, UserDetails {  
 
     private boolean actived = true;

O SS consegue validar caso esteja actived = false?

Obrigado

Com o atributo não, ele valida usando os métodos que a gente implementa da interface UserDetails, daí eu uso o meu atributo actived pra que o ss entenda quando eu quero que a conta esteja expirada, bloqueada, habilitada, etc. No meu caso eu só quero que o SS saiba quando a conta vai ou não estar habilitada:

public boolean isAccountNonExpired() {  
    return true;  
}  
public boolean isAccountNonLocked() {  
    return true;  
}  
public boolean isCredentialsNonExpired() {  
    return true;  
}    
public boolean isEnabled() {  
    return (this.actived);  
}
D

Felipe,

Eu estou usando o modelo SS que vc postou nesse forum.

Estao qndo eu quiser que este usuario esteja desabilidato… eu mudo pra actived = false.

Tem como o SS fazer automaticamente?

Exemplo: Quando ele logar pela primeira vez, mudar pra actived = false…
Pois o usuario so podera logar uma unica vez no sistema

Muito Obrigado

F

dugbuddy:
Felipe,

Eu estou usando o modelo SS que vc postou nesse forum.

Estao qndo eu quiser que este usuario esteja desabilidato… eu mudo pra actived = false.

Tem como o SS fazer automaticamente?

Exemplo: Quando ele logar pela primeira vez, mudar pra actived = false…
Pois o usuario so podera logar uma unica vez no sistema

Muito Obrigado

Se vc quiser que o cara logue no sistema e nunca mais volte a acessá-lo (nunca mais mesmo), é só vc dar um update do atributo actived pra false (levando em consideração que ele é também um campo na sua tabela no banco de dados). Daí assim que o cara der um logoff, perdeu… nunca mais vai acessar o sistema.

Mas se o que vc quer é que ele não fique toda hora fazendo logon no sistema, mesmo já estando logado, tem um atributo que vc seta lá no spring-security.xml que diz que só vai haver uma sessão pra cada objeto que implemente UserDetails. Não lembro exatamente onde é… Daí sempre que vc tentar um logon e a sessão estiver aberta, ele invalida a primeira.

D

Felipe,

Tudo bem, voltei com uma duvida…

Voce me disse que o spring security faz a validacao atraves do actived = true or false…correto?

Como seria por data…???

Ex… o Usuario foi cadastrado dia 01/01/2010 … o Usuario dele é valido por 2 dias… se passar de 2 dias… ele não pode acessar…
O SS tb faz esse tipo de validacao usando uma daquelas classe dele (isEnabled, isCredentialsNonExpired()…) ?

muito obrigado

F

dugbuddy:
Felipe,

Tudo bem, voltei com uma duvida…

Voce me disse que o spring security faz a validacao atraves do actived = true or false…correto?

Como seria por data…???

Ex… o Usuario foi cadastrado dia 01/01/2010 … o Usuario dele é valido por 2 dias… se passar de 2 dias… ele não pode acessar…
O SS tb faz esse tipo de validacao usando uma daquelas classe dele (isEnabled, isCredentialsNonExpired()…) ?

muito obrigado

Falae véio!

Como tinha te falado, vc faz o tipo de validação que quiser, o spring security só te fornece um suporte pra te facilitar.
Por exemplo, se vc quiser verificar se o cara já excedeu os dias de acesso, vc poe essa logica dentro do método, exemplo:

public boolean isEnabled() { long diferenca = new Date().getTime() - this.dataCadastro.getTime();//levando em consideracao que vc tenha registrada a dataCadastro do usuario return (diferenca/1000)/60/60/24) <= 2; //Retorna false se a diferenca entre as duas datas em dias for maior que 2 }

O Spring Security não vai saber quando barrar o usuário, pelo atributo actived, pois ele faz parte da minha regra de negócios,
mas sim pelo retorno dos métodos que implementamos da interface UserDetails:

(isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired(), isEnabled()).

Sendo que vc pode fazer um tratamento diferenciado pra cada um deles (ou nenhum).

D

Felipe,

Muito obrigado mesma pela ajuda… era isso que eu estava precisando…

Só q eu vou ter q fazer validacao por um tipo de ROLE… mas isso eu faço a validação…

Muito obrigado !

minha classe Usuario ficou assim…

@Transient public boolean isEnabled() { Role role = new Role(); if(role.getId() == 4){ // esse id é de um tipo de role. long diferenca = new Date().getTime() - this.dataCadastro.getTime();//levando em consideracao que vc tenha registrada a dataCadastro do usuario return ((diferenca/1000)/60/60/24) <= 2; //Retorna false se a diferenca entre as duas datas em dias for maior que 2 }else{ return (this.actived); } }

F

Qualquer coisa é só postar :smiley:
Abração cara!

D

Felipe,

Eu testei o codigo acima que postei ...

Ocorreu o seguinte. eu coloquei desta maneira agora...

@Transient
	public boolean isEnabled() {	
		
		for(Role role : this.roles){
			if(role.getName().equals("ROLE_CANDIDATO")){
				long diferenca = new Date().getTime() - this.dataCadastro.getTime();//levando em consideracao que vc tenha registrada a dataCadastro do usuario  
				return ((diferenca/1000)/3600) <= 50; //Retorna false se a diferenca entre as duas datas em horas for maior que 50
			} 
					
		}
		return (this.actived);
	}

O problema é que esta vindo um valor muito estranho nesta conta...
No banco de dados o Data Cadastro esta como Date ( 01/01/2010 20:00:00 ) ....
Como proceder ?

Obrigado

D

Felipe,

Consegui … fazer a validacao …

Muito Obrigado…

Aproveitando… voce que entende mais de SS…
Quando o Cliente logar e precisa gravar um certo dados… exemplo… cadastrar dependentes…
Na Servlet… como eu faco para recuperar o id desse Cliente , pois preciso linkar os dependentes com o clientes.
Tem alguma maneira especifica que para SS? ou utiliza Daos ?

Muito obrigado pela ajuda !!

F

vc quer recuperar o id desse cara em que momento? Depois que tiver logado?
Se for, tem uma classe do spring sec que guarda a usuário que tá na sessão, vc faria algo do tipo:

Daí com o objeto na mão, vc pode recuperar o que quiser dele :smiley:

D

Felipe,

Antes de tudo … gostaria de agradecer pela ajuda desde o inicio …

O SS tem muitas funcionalidades e é dificil encontrar exemplos bons…rs

Felipe… no login… ele direciona pra uma pagina ( default-target-url )… tem como direcionar para as paginas de acordo com a ROLE ?

abraços… muito obrigado…

F

dugbuddy:
Felipe,

Antes de tudo … gostaria de agradecer pela ajuda desde o inicio …

O SS tem muitas funcionalidades e é dificil encontrar exemplos bons…rs

Felipe… no login… ele direciona pra uma pagina ( default-target-url )… tem como direcionar para as paginas de acordo com a ROLE ?

abraços… muito obrigado…

Que isso cara, a gente tá aqui pra isso mesmo… já me ajudaram muito por aqui tb :smiley:
Bom, eu acredito que possa até ter alguma coisa parecida com isso, mas sinceramente não sei.

Mas você poderia algo do tipo: No default-target-url vc pode por exemplo pra redirecionar pra logged.jsp.
Daí vc faz um ServletFilter que intercepte o seu request antes de renderizar o response dessa página, aí lá no filter vc pergunta se é esta página que vc tá acessando, pergunta tb se a sessão do usuário não é nula, e se tudo isso bater, vc itera sobre a lista de roles que o usuário possui, so que da mais alta permissão pra baixo, exemplo:

Role role : roles) { if(role.getName().equals("ROLE_ADM")) { response.sendRedirect("home_adm.jsp"); } else if(role.getName().equals("ROLE_OPERATOR")) { response.sendRedirect("home_op.jsp"); } filter.doChain(request, response); }

Pq da mais alta permissão pra mais baixa? Pq de repente o usuário logado tem tanto permissão de OP quanto de ADM, e vc ia acabar cometendo uma injustiça com ele kkkkkkkkkk…

Cara, não sei se é exatamente assim que vai funcionar, fiz agora meio no chute, mas a idéia acho que é mais ou menos essa. Mas como te falei, de repente o próprio Spring Security tem a maneira dele de resolver isso…

D

Felipe,

O Spring Security esta funcionando perfeitamente !! obrigado ae...

Uma duvida é em relacao a :
Usuario user = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Eu estou fazendo esse codigo, mas estou tendo dificuldades.. se puder ajudar eu agradeço a paciencia comigo =]

Usuario user = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();// recuperando o usuario da session
user.setActived(false);// setando o usuario como inativo ( spring security )

Collection<Candidato> candidato = user.getCandidato(); // recuperando o candidato

Iterator<Candidato> iCandidato = candidato.iterator(); // Iteracao do Candidato
	for(Candidato cand: candidato){ // Loop para buscar o Perfil da Vaga
		Collection<PerfilVaga> perfilVaga = cand.getPerfilVaga(); // recuperando o perfil da vaga
		Iterator<PerfilVaga> iPerfil = perfilVaga.iterator(); // Iteracao do perfil da vaga.

É que eu preciso varrer uma collection para buscar alguns informacoes...

Obrigado

F
dugbuddy:
Felipe,

O Spring Security esta funcionando perfeitamente !! obrigado ae...

Uma duvida é em relacao a :
Usuario user = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Eu estou fazendo esse codigo, mas estou tendo dificuldades.. se puder ajudar eu agradeço a paciencia comigo =]

Usuario user = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();// recuperando o usuario da session
user.setActived(false);// setando o usuario como inativo ( spring security )

Collection<Candidato> candidato = user.getCandidato(); // recuperando o candidato

Iterator<Candidato> iCandidato = candidato.iterator(); // Iteracao do Candidato
	for(Candidato cand: candidato){ // Loop para buscar o Perfil da Vaga
		Collection<PerfilVaga> perfilVaga = cand.getPerfilVaga(); // recuperando o perfil da vaga
		Iterator<PerfilVaga> iPerfil = perfilVaga.iterator(); // Iteracao do perfil da vaga.

É que eu preciso varrer uma collection para buscar alguns informacoes...

Obrigado

Falae cara... que bom que está tudo funcionando :D
Mas não entendi qual a sua dúvida... não está conseguindo iterar sobre as coleções?

D

Quando eu recupero atraves do user… acontece esse erro

Nao como faço para recuperar o Candidato e fazer a iteração.

Obrigado

F

dugbuddy:
Quando eu recupero atraves do user… acontece esse erro

Nao como faço para recuperar o Candidato e fazer a iteração.

Obrigado

Bom, nesse caso vc pode mudar o fetchType do relacionamento da classe usuario com a candidato, ao inves de LAZY vc poe EAGER, isso pode ser ruim pois traz todos os candidatos relacionados ao seu usuario de uma vez na query, mesmo que vc não use-os imediatamente, mas resolveria esse problema, e caso não fosse muito custoso pro banco, acho que poderia ser uma solução pro seu problema. ou então na própria query que traz o usuario, vc poe um fetch no join, para a query de login, exemplo:

Dessa forma, ele traz todos os candidatos relacionados com o usuario que vc esta procurando, e o hibernate não vai precisar tentar abrir a sessão novamente pra montar outra query pra trazer os candidatos, uma vez que eles já foram carregados na primeira query.

Faz um teste aí, qualquer coisa posta ae…

D

Feliepe, eu coloquei assim..

@SuppressWarnings("serial")
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable, UserDetails {

	/** Id do Usuario */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "USUARIO_ID")
	private Long id;

	/** relacionamento do Usuario com os papeis = roles */
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "USUARIO_ROLE", joinColumns = @JoinColumn(name = "USUARIO_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
	private List<Role> roles = new ArrayList<Role>();
@SuppressWarnings("serial")
@Entity
@Table(name = "ROLE")
public class Role implements Serializable, GrantedAuthority {

	/** id da tabela role(papeis) */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "ROLE_ID")
	private Long id;


	/** relacionamento da tabela role(papeis) com o usuarios */
	@ManyToMany
	@JoinTable(name = "USUARIO_ROLE", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "USUARIO_ID"))
	private List<Usuario> usuarios = new ArrayList<Usuario>();

Na classe ROLE eu tenho que colocar algum tipo de Fetch ( ex. @ManyToMany(fetch = FetchType.LAZY) ) ou nao precisa?

Obrigado

F
@SuppressWarnings(&quot;serial&quot;)
@Entity
@Table(name = &quot;USUARIO&quot;)
public class Usuario implements Serializable, UserDetails {

	/** Id do Usuario */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = &quot;USUARIO_ID&quot;)
	private Long id;

	/** relacionamento do Usuario com os papeis = roles */
	@ManyToMany(fetch = FetchType.EAGER) //DE LAZY PRA EAGER &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
	@JoinTable(name = &quot;USUARIO_ROLE&quot;, joinColumns = @JoinColumn(name = &quot;USUARIO_ID&quot;), inverseJoinColumns = @JoinColumn(name = &quot;ROLE_ID&quot;))
	private List&lt;Role&gt; roles = new ArrayList&lt;Role&gt;();

Altera essa linha que comentei do jeito que botei aqui, de lazy pra eager, mas perae..... dá dando session closed no momento que vc tenta recuperar as roles do usuário ou os candidatos???? usa o fetch EAGER onde vc não tá conseguindo recuperar... exemplo:

@ManyToMany(fetch = FetchType.EAGER) //DE LAZY PRA EAGER &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
@JoinTable
private List&lt;Candidato&gt; candidatos = new ArrayList&lt;Candidato&gt;();

Ou, faz o fetch na query, que aí vc não compromete o banco, pq daí toda a consulta de usuarios que vc fizer, vai sempre trazer junto todos os candidatos e roles relacionados a ele... pode cair um pouco a performance.

D

Sim.. esta dando session closed...

Mas eu fiz o seguinte.. eu deixei sem fetch usuario com role.. e parece q funcionou ..
Eu coloquei somente fetch = Eager no usuario para candidato.. assim..

@SuppressWarnings("serial")
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable, UserDetails {


	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "CANDIDATO_USUARIO", joinColumns = @JoinColumn(name = "USUARIO_ID"), inverseJoinColumns = @JoinColumn(name = "CANDIDATO_ID"))
	private Collection<Candidato> candidato;

Como solucionar este problemas que session closed ?

thanks

D

Felipe.. é o seguinte..

ate aqui .. eu consigo recuperar o CPF:
Iterator<Candidato> iCandidato = candidatos.iterator(); // Iteracao do Candidato
		 	for(Candidato cand: candidatos){ // Loop para buscar o Perfil da Vaga
		 		cand.getCpf();

Mas quando eu tento recuperar o TesteRealizado

Collection<Candidato> candidatos = user.getCandidato(); // recuperando o candidato
				
		 Collection<TesteRealizado> testeRealizados = new ArrayList<TesteRealizado>();
		 Iterator<Candidato> iCandidato = candidatos.iterator(); // Iteracao do Candidato
		 	for(Candidato cand: candidatos){ // Loop para buscar o Perfil da Vaga
		 		cand.getCpf();
		 		testeRealizados = cand.getTesteRealizado();
		 		Iterator<TesteRealizado> itst = testeRealizados.iterator();
		 			for(TesteRealizado tst: testeRealizados){
		 				tst.setDataFimTeste(new Date());
		 				tst.setStatus(status);
		 				tst.setTeste(teste);
		 				testeRealizadoManager.save(tst);// Update na tabela Teste Realizado
		 			}

Ele nao recupera... da dando session closed...

Agora nao sei como recuperar. obrigado

F
dugbuddy:
Sim.. esta dando session closed...

Mas eu fiz o seguinte.. eu deixei sem fetch usuario com role.. e parece q funcionou ..
Eu coloquei somente fetch = Eager no usuario para candidato.. assim..

@SuppressWarnings("serial")
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable, UserDetails {


	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "CANDIDATO_USUARIO", joinColumns = @JoinColumn(name = "USUARIO_ID"), inverseJoinColumns = @JoinColumn(name = "CANDIDATO_ID"))
	private Collection<Candidato> candidato;

Como solucionar este problemas que session closed ?

thanks

Taca o filter OpenSessionInView do Spring no teu web.xml, pra sessão se manter aberta e vc recuperar os teus objetos que estão detached (por causa do fetch lazy).
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

http://static.springsource.org/spring/docs/1.2.9/api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=6653 - fala um pouco sobre o patern Open Session in View.

Veio, dá uma fuçada na net, tem muito material sobre spring e hibernate por aí... e principalmente, dá uma olhada na documentação, pra entender melhor os conceitos :D

http://static.springsource.org/spring/docs/2.5.x/reference/index.html
https://www.hibernate.org/5.html

D

Felipe,

Tudo bem contigo?

Estou com uma duvida… voce poderia me ajudar?

Eu preciso ter 1 usuario ( mesmo login ) pra 2 contas… assim sendo com 2 senhas…
login = usuario1
senha = senha1

login = usuario1
senha = senha2

o usuario1 será pra uma mesma role.

tem como fazer este tipo de validacao?
Obrigado.

D

Felipe.

Desencana da pergunta !!

valeu !!

D

Felipe,

Tudo bem com voce?

Sou eu denovo com algumas duvidas… vc ja deve ter passado por isso.

Como eu faço uma trava pro usuario nao logar em 2 lugares diferentes ? Logar somente uma vez.

abraços

B
<security:http ...

<security:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />
</security:http>
D

bcruz…

Valeu… muito obrigado !!

Funcionou …

tive que colocar um listener tb no web.xml…

<listener> <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class> </listener>

abracos

B

Tranks… tinha esquecido do listener

po eu to com um problema… após fazer toda a configuração sou sempre redirecionado para uma página em branco…

o post de referência é esse http://www.guj.com.br/posts/list/202215.java#1021937 se puderem dar um HELP agradeço muito vlww

B

Bom dia galera.

Estou com os seguinte problema:

Estou a desenvolver uma aplicação em zk + spring + spring security e sempre que o usuário fizer algo na aplicação ele deve registar a operação feita incluindo o session id.

Gostaria de saber como posso fazer para pegar o session id através de um bean do spring, pois como disse acima, para cada ação no sistema devo pegar o session id, o que ficaria muito pesado se tivesse que instanciar algo para pegar o session id.

Andei pesquisando e encontrei muitos sites que falam de listeners, httprequest mas a minha duvida é também como pegar o http request no spring?

Ajudem-me por favor, é urgente.

Obrigado.

L

pessoal sou bastante novato com o spring-security e estou tentando recuperar a lista de Perfis (do spring security) e jogar num selectOneMenu (primefaces)… mas toda vez que tento dá pau e não sei como resolver isso ainda… isso tem haver com o tipo de mapeamento que eu estou usando de Perfil para Usuário (@ManyToMany)???

R

Sabe como faz para não redirencionar para uma pagina em branco?, eu consegui traduzir as mensagens do spring security, porém esta mensagem apresentado quando a sessão foi expirada por utilizar outro acesso, não sei qual atributo de configuração alguem sabe ?.

Criado 7 de julho de 2009
Ultima resposta 2 de jul. de 2012
Respostas 66
Participantes 10