Segurança com Spring Security: Acegi. Help-me!

Oi a todos vocês.

Estou tentando implementar autenticação e autorização com acegi, contudo está dando erro que não estou conseguindo resolver, já pesquisei em vários fóruns, inclusive do próprio spring, na net, google…

estou conseguindo subir a aplicação, porém está dando um erro num filtro.
Estou conseguindo restringir diretórios, e redirecionar para uma página de login.
Porém ao digitar login e senha dá erro, mas este erro concerteza é porque está dando um erro no start da aplicação.

06/10/2008 13:03:29 org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter springSecurityFilterChain org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:360) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:914)

porém no application-context eu tenho um bean com este nome:

<bean id="springSecurityFilterChain" class="org.springframework.security.util.FilterChainProxy">
		<property name="filterInvocationDefinitionSource">
			<value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT		   /**=httpSessionIntegrationFilter,authenticationProcessingFilter,
exceptionTranslationFilter,filterSecurityInterceptor 
			</value>
		</property>
</bean>

e no web.xml

<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		 <init-param>
	        <param-name>targetBeanName</param-name>
	        <param-value>springSecurityFilterChain</param-value>
         </init-param>		
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

estou usando o spring secutiry 2.0, que conseguir me ajudar eu agradeço.
Obrigada,
Carol.

Oi Carol

Veja bem acho q vc ta confudido as versões do spring security! que antigamente era chamado de acegi

este e meu applicationContext.xml

[code]

<?xml version="1.0" encoding="UTF-8"?>


security:http

<security:logout logout-url="/sair.jsp"/>
</security:http>

<security:authentication-manager alias="authenticationManager" />

<security:jdbc-user-service id="userService" data-source-ref="dataSource"
    users-by-username-query="select openid as username, 'notused' as password, enabled from account where login=?"
    authorities-by-username-query="select u.login as username, t.description as authority from Account u left join typeAccount t on(u.type = t.id) where u.login=?"/>

[/code]

na verdade maioria que acho na net é do acegi, isso dificulta, vejo que muitos estão misturados.
Dê olhada no meu, será que tem muita coisa errada?
Todo seu application context é so isso que colocou? o meu tá gigante!!!

o que você tem mapeado no web.xml tem como colocar?

meu application context completo.

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>java:comp/env/jdbc/SystemControl</value>
		</property>
	</bean> 
			
	<security:global-method-security secured-annotations="enabled" />
    
    <security:http auto-config="true">
        <!-- Restrict URLs based on role -->
        <security:intercept-url pattern="/jsp/*" access="ROLE_CLIENT" />
        <security:intercept-url pattern="/admin/*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        
        <security:intercept-url pattern="/**" access="ROLE_ADMIN" />

        <!-- Override default login and logout pages -->
        <security:form-login login-page="/login.jsp" 
                             login-processing-url="/j_acegi_security_check" 
                             default-target-url="/index.jsp" 
                             authentication-failure-url="/error.jsp" />
        <security:logout logout-url="/logout" logout-success-url="/login.jsp" />
    </security:http>

    <security:authentication-provider user-service-ref="userDetailsService">
        <!--security:jdbc-user-service data-source-ref="dataSource" /-->
     </security:authentication-provider>
     
    <bean id="userDetailsService" class="br.com.systemcontrol.security.UserDetailsServiceImpl">
		<property name="dataSource" ref="dataSource"/>
	</bean>
    
    
    <bean id="springFilterChainProxy" class="org.springframework.security.util.FilterChainProxy">
        <security:filter-chain-map path-type="ant">
            <security:filter-chain pattern="/**" filters="httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor"/>
        </security:filter-chain-map>
    </bean>
    
     <bean id="httpSessionIntegrationFilter"  
         class="org.springframework.security.context.HttpSessionContextIntegrationFilter">  
     </bean>  
     
     <bean id="exceptionTranslationFilter" class="org.springframework.security.ui.ExceptionTranslationFilter">
		<property name="authenticationEntryPoint">
			<ref local="authenticationProcessingFilterEntryPoint" />
		</property>
		<property name="accessDeniedHandler">
			<bean class="org.springframework.security.ui.AccessDeniedHandlerImpl">
				<property name="errorPage" value="/error.jsp" />
			</bean>
		</property>
	</bean>
	
	<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
		<property name="providers">
			<list>
				<ref local="daoAuthenticationProvider" />
			</list>
		</property>
	</bean>
	<bean id="daoAuthenticationProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
		<property name="userDetailsService"> 
			<ref bean="userDetailsService" />
		</property>
	</bean>
	
	<bean id="accessDecisionManager" class="org.springframework.security.vote.UnanimousBased">
		  <property name="allowIfAllAbstainDecisions">  
             <value>false</value>  
         </property>   
		<property name="decisionVoters">
			<list>
				<ref bean="roleVoter" />
			</list>
		</property>
	</bean>
	
    <bean id="roleVoter" class="org.springframework.security.vote.RoleVoter">
		<property name="rolePrefix">
			<value>ROLE_</value>
		</property>
	</bean>

acho que o meu tem coisa então do acegi, que mudou.

Carol minha linda,

Tem um tutorial bala para vc veja esta pagina http://static.springframework.org/spring-security/site/reference/html/springsecurity.html
Vc ta misturando tudo… leia o tutorial é muito bom, la tem tudo q vc precisa!

[quote=denis.rangel]Carol minha linda,

Tem um tutorial bala para vc veja esta pagina http://static.springframework.org/spring-security/site/reference/html/springsecurity.html
Vc ta misturando tudo… leia o tutorial é muito bom, la tem tudo q vc precisa![/quote]

pois é, comecei a ler esta referência, vou iniciar do zero dela e ver até onde vou, assim que eu tiver dúvida(vai surgir rsrs) eu volto aqui.

me diz uma coisa, você implementou algum filter? ou os fornecidos pelo spring foi suficiente?

é que eu implementei um UserDetailsService pra fazer o acesso ao banco e verificar a autenticação, porém por enquanto não sei como usá-lo nesta nova versão, lá só tem igual você fez, com sql dentro do xml do spring.

obrigada Carol.

Veja bem Carol,

vc tem que primeiro colocar este filtro no web.xml

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

depois colocar no applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
    <security:http>
        <security:intercept-url pattern="/login.jsp*" filters="none"/>  
        <security:form-login login-page='/login.jsp'/>
        <security:intercept-url pattern="/**" access="ROLE_USER" />
        <security:logout logout-url="/sair.jsp"/>
    </security:http>
    
    <security:authentication-manager alias="authenticationManager" />
    
    <security:jdbc-user-service id="userService" data-source-ref="dataSource"
        users-by-username-query="select openid as username, 'notused' as password, enabled from account where login=?"
        authorities-by-username-query="select u.login as username, t.description as authority from Account u left join typeAccount t on(u.type = t.id) where u.login=?"/>
</beans>

Agora é so testa e pronto!

Outra coisa e configuração basica do spring framework para carrega o arquivo de configuração

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

obrigada, Denis.
Consegui rodar pela referencia do spring.
Na referencia só ensina com usuário estático, no seu caso colocou o sql dentro do xml, pra eu delegar isso pra uma classe minha, basta eu implementar o UserServiceDetails?

inclusive quero tentar tirar a dependencia do nomes dos campos da tabela do campo, não faz sentido ter 2 tabelas de N pra N, e não gerar uma terceira tabelas com as chaves das outras.

Carol,

No meu caro (exemplo a cima) eu so tenho 2 tabelas uma para o tipo de usuario e outra para o usuario

olhe bem este select aqui, ele pega o usuario como o login passando como parametro

select login as username, 'notused' as password, enabled from account where login=?

no outro select ele faz um join com a tabela typeAccount que guarda os tipos dos usuarios (ex. ADM, USER, ETC). Neste caso ele retorna os role do meu usuario.

select u.login as username, t.description as authority from Account u left join typeAccount t on(u.type = t.id) where u.login=?

Muito bom que vc conseguiu. :slight_smile:
O spring security e muito bom sempre use, agora tome cuidado em modifica-lo demais pq vc pode criar um falha de segurança!