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. 
O spring security e muito bom sempre use, agora tome cuidado em modifica-lo demais pq vc pode criar um falha de segurança!