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

8 respostas
carol_programadora

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.

8 Respostas

denis.rangel

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

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

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.

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!

carol_programadora

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!

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.

carol_programadora

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.

denis.rangel

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

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.

denis.rangel

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!

Criado 6 de outubro de 2008
Ultima resposta 6 de out. de 2008
Respostas 8
Participantes 2