Acegi Security com spring e hibernate

Gostaria de saber se alguém já utilizou o Acegi Security recomendado como módulo de autenticação e autorização pela equipe do spring, e se já implementou o DaoAuthenticationProvider com hibernate, se sim, qual seria a melhor forma de fazer isso, pois existem N sugestões, grato pela atenção.

Eu também estou a procura de um bom framework de segurança para um projeto em que estou trabalhando atualmente, porém por utilizar Spring para Ioc, Hibernate para Persistencia, e xFire para expor WebServices, a mais provavel escolha será mesmo o Acegi Security. Uma das coisas mais interessantes do Acegi em minha opnião é a possibilidade de trabalhar com Annotations (com conceito de convetion over configururation).
No livro Spring in Action, existe o um capítulo dedicado ao Acegi, estou lendo, e penso que é um framework bem completo e flexivel. Recomendaria…

Olá galera…queria saber se tem algum material bom aki no guj disponivel de aceg, omo trabalhar com ele?

olha eu to implementando um negócio com acegi aqui e, tipo, é o cão chupando manga

não é tão facinho assin não entender aquele treco oO

ainda mais quando você vê uma linha assim no applicatioContext:

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value><![CDATA[ CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=httpSessionContextIntegrationFilter, logoutFilter, authenticationProcessingFilter, securityContextHolderAwareRequestFilter, rememberMeProcessingFilter, anonymousProcessingFilter, exceptionTranslationFilter, filterInvocationInterceptor ]]></value> </property> </bean>

O acegi é super completo, consigo até fazer segurança a nível de action no struts, por exemplo, pra evitar que algum malandro faça um get/post em um determinado dispatch action. Tudo pro AOP. show!

mas ainda to apanhando pra caramba oO

existe um tal de JDBC DAO que você só configura o datasource pra funcionar

detalhe: Acegi foi feito inicialmente pro Spring e não sei como está o suporte dele sem Sprin. Eu estou usando Spring na minha aplicação

EDIT: eu disse isso por causa do “xml”, que na verdade é um applicationContext do Spring

pessoal…to no mesmo impasse…to procurando algo como implementar procurando usuario e perfis pelo banco e nao no xml…quem conseguir resolver posta ai pra gente…

pessoal…tmb estou tentando resolver… num outro post me indicaram um link… http://forum.springframework.org/showthread.php?t=24293

ai tem um user que diz como fazer pra usar consulta do banco…o problema eh q o ACEGI possui consultas prontas, espera determinados nomes de tabelas e colunas no banco…

e neste link tem dica como fazer isso…
http://hispacta.blogspot.com/2006/04/moving-acegis-inmemorydaoimpl-to.html

pelo q notei…eh melhor extender essa classe JdbcDaoImpl e reimplementar ela com nossas consultas proprias…

mas quem puder ajudar…as vezes estou fazendo algo errado…ou sera esta a unica solução…

ow num sei se o post jah morreu mas eu ateh o momento (ainda to em franco desenvolvimento e isso deve mudar, mas jah serve de exemplo) to atenticando no banco assim:

<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.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	<http auto-config='true'>
		<intercept-url pattern="/**" access="ROLE_USER" />
	</http>
	<authentication-provider>
		<jdbc-user-service data-source-ref="dataSource"
			users-by-username-query="SELECT emailUsuario, senha,(ativo='S') as ativo FROM Usuario WHERE emailUsuario = ?"
			authorities-by-username-query="SELECT emailUsuario, direito FROM Direitos WHERE emailUsuario = ?" />
	</authentication-provider>
</beans:beans>

agora o problema q eu to tendo eh o seguinte:

SecurityContextHolder.getContext() tah retornando null!!

fala ae leozin blz!? porra to grilado de nao ir pro web days… mas pro sun tech days eu vou heim!! abracos

resolvi…

private static String EMAIL_USUARIO_LOGADO = ((UserDetails) SecurityContextHolder.getContext()
.getAuthentication().getPrincipal()).getUsername();

“butei” isso aih na “crasse” e rolou… ehuehueh

Hmm…

Fizemos a integração Spring + Acegi + Hibernate + n frameworks… A parte do acegi + hibernate (DB) foi um parto realmente, coisa de semanas em cima dos xmls e código até que consegui.

package pacote;

import org.acegisecurity.userdetails.jdbc.JdbcDaoImpl;

public class AuthenticationJdbcDaoImpl extends JdbcDaoImpl {
    
    private String userInfoObjectType;
    private SessionFactory sessionFactory;

    public UserDetails loadUserByUsername(String username){
        try {
            Session session = sessionFactory.openSession();
            SecUser user = (SecUser) session.createQuery("from " + userInfoObjectType + " where txLogin = '" + username + "'").uniqueResult();
            if(user == null) 
            {
            	throw new UsernameNotFoundException("User identified by login: '" + username + "' not found or is inative...");
            } 
            else{
            	if(user.getSecStatus().getTxI18nKey().equals("Deactivated"))
            	{
            		throw new UsernameNotFoundException("User indentified by login: '"+ username + "' is deactivated on system...");
            	}
            	else
            	{
	            	GrantedAuthority grantedAuthorityUser = new GrantedAuthorityImpl("ROLE_USER");
	            	CustomUser customUser = new CustomUser(user.getTxName(), user.getTxPassword(), true, new GrantedAuthority[]{grantedAuthorityUser}, user);
	                return customUser;
            	}
            }

        } catch (UsernameNotFoundException ex1) {
            ex1.printStackTrace();
            throw ex1;
        } catch (DataAccessException ex2) {
            ex2.printStackTrace();
            throw ex2;
        }
    }

    public void setUserInfoObjectType(String userInfoObjectType) {
        this.userInfoObjectType = userInfoObjectType;
    }

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

O arquivo abaixo é somente referente à integração do acegi:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" 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.xsd">

<!-- 
  - Application context containing authentication, channel
  - security and web URI beans.
  -
  - Only used by "filter" artifact.
  -
  - $Id$
  -->


   <!-- ======================== FILTER CHAIN ======================= -->

	<!--  if you wish to use channel security, add "channelProcessingFilter," in front
	      of "httpSessionContextIntegrationFilter" in the list below -->
	<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
      <property name="filterInvocationDefinitionSource">
         <value>
		    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
		    PATTERN_TYPE_APACHE_ANT
            /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,switchUserProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
         </value>
      </property>
    </bean>

   <!-- ======================== AUTHENTICATION ======================= -->

   <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
      <property name="providers">
         <list>
            <ref local="daoAuthenticationProvider"/>
            <ref local="anonymousAuthenticationProvider"/>
			<ref local="rememberMeAuthenticationProvider"/>
         </list>
      </property>
   </bean>


<!--
*
* Início da configuração do acesso ao banco de dados:
*
-->


    <!-- Authentication using JDBC Dao -->
	<bean id="jdbcDaoImpl" class="pacote.AuthenticationJdbcDaoImpl">
		<!--
		dataSource e sessionFactory autowired
		-->
		<property name="userInfoObjectType">
			<value>SecUser</value>
		</property>
	</bean>

<!--
*
* Fim da configuração do acesso ao banco de dados:
*
-->


   <bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>

   <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
      <property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>
      <property name="passwordEncoder"><ref local="passwordEncoder"/></property>
   </bean>

   <!-- Automatically receives AuthenticationEvent messages -->
   <bean id="loggerListener" class="org.acegisecurity.event.authentication.LoggerListener"/>

   <bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
      <property name="authenticationManager"><ref local="authenticationManager"/></property>
      <property name="authenticationEntryPoint"><ref local="basicProcessingFilterEntryPoint"/></property>
   </bean>

   <bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
      <property name="realmName"><value>Contacts Realm</value></property>
   </bean>

   <bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
      <property name="key"><value>foobar</value></property>
      <property name="userAttribute"><value>anonymousUser,ROLE_ANONYMOUS</value></property>
   </bean>

   <bean id="anonymousAuthenticationProvider" class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
      <property name="key"><value>foobar</value></property>
   </bean>

   <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">
   </bean>

   <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
      <property name="authenticationManager"><ref local="authenticationManager"/></property>
      <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
   </bean>

   <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
      <property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>
      <property name="key"><value>springRocks</value></property>
   </bean>
   
   <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
      <property name="key"><value>springRocks</value></property>
   </bean>
   
   <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
      <constructor-arg value="/index.jsp"/> <!-- URL redirected to after logout -->
      <constructor-arg>
         <list>
              <ref bean="rememberMeServices"/>
              <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
         </list>
      </constructor-arg>
   </bean>
   
   <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>

   <!-- ===================== HTTP CHANNEL REQUIREMENTS ==================== -->

   <!-- You will need to uncomment the "Acegi Channel Processing Filter"
        <filter-mapping> in web.xml for the following beans to be used -->

   <bean id="channelProcessingFilter" class="org.acegisecurity.securechannel.ChannelProcessingFilter">
      <property name="channelDecisionManager"><ref local="channelDecisionManager"/></property>
      <property name="filterInvocationDefinitionSource">
         <value>
			    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				\A/secure/.*\Z=REQUIRES_SECURE_CHANNEL
				\A/login.htm.*\Z=REQUIRES_SECURE_CHANNEL
				\A/login.jsp.*\Z=REQUIRES_SECURE_CHANNEL
				\A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
				\A.*\Z=REQUIRES_INSECURE_CHANNEL
         </value>
      </property>
   </bean>

   <bean id="channelDecisionManager" class="org.acegisecurity.securechannel.ChannelDecisionManagerImpl">
      <property name="channelProcessors">
         <list>
            <ref local="secureChannelProcessor"/>
            <ref local="insecureChannelProcessor"/>
         </list>
      </property>
   </bean>

   <bean id="secureChannelProcessor" class="org.acegisecurity.securechannel.SecureChannelProcessor"/>
   <bean id="insecureChannelProcessor" class="org.acegisecurity.securechannel.InsecureChannelProcessor"/>

   <!-- ===================== HTTP REQUEST SECURITY ==================== -->

   <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
      <property name="authenticationEntryPoint"><ref local="authenticationProcessingFilterEntryPoint"/></property>
      <property name="accessDeniedHandler">
      	<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
      		<property name="errorPage" value="/accessDenied.jsp"/>
      	</bean>
      </property>
   </bean>

   <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
      <property name="authenticationFailureUrl"><value>/login.htm?login_error=1</value></property>
<!--      <property name="authenticationFailureUrl"><value>/login.jsp?login_error=1</value></property> -->
      <property name="defaultTargetUrl"><value>/</value></property>
      <property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>
      <property name="rememberMeServices"><ref local="rememberMeServices"/></property>
   </bean>

   <bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
      <property name="loginFormUrl"><value>/login.htm</value></property>
<!--      <property name="loginFormUrl"><value>/login.jsp</value></property> -->
      <property name="forceHttps"><value>false</value></property>
   </bean>

   <bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
      <property name="allowIfAllAbstainDecisions"><value>false</value></property>
      <property name="decisionVoters">
         <list>
            <ref bean="roleVoter"/>
         </list>
      </property>
   </bean>
	<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
		<property name="rolePrefix">
			<value>ROLE_</value>
		</property>
	</bean>

   <!-- Note the order that entries are placed against the objectDefinitionSource is critical.
        The FilterSecurityInterceptor will work from the top of the list down to the FIRST pattern that matches the request URL.
        Accordingly, you should place MOST SPECIFIC (ie a/b/c/d.*) expressions first, with LEAST SPECIFIC (ie a/.*) expressions last -->
   <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
      <property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
      <property name="objectDefinitionSource">
         <value>
			    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
			    PATTERN_TYPE_APACHE_ANT
			    /dwr=ROLE_ANONYMOUS,ROLE_USER
			    /dwr/**/*=ROLE_ANONYMOUS,ROLE_USER
			    /**/*.css=ROLE_ANONYMOUS,ROLE_USER
				/**/*.js=ROLE_ANONYMOUS,ROLE_USER
			    /images/**=ROLE_ANONYMOUS,ROLE_USER
			    /guest/**=ROLE_ANONYMOUS,ROLE_USER
			    /index.htm=ROLE_ANONYMOUS,ROLE_USER
			    /seclanguageimage.htm=ROLE_ANONYMOUS,ROLE_USER
			    /login.htm=ROLE_ANONYMOUS,ROLE_USER
			    /logout.htm=ROLE_ANONYMOUS,ROLE_USER
			    /index.jsp=ROLE_ANONYMOUS,ROLE_USER
			    /usertestform.htm=ROLE_USER
			    /switchuser.jsp=ROLE_SUPERVISOR
			    /j_acegi_switch_user=ROLE_SUPERVISOR
				/**=ROLE_USER
         </value>
      </property>
   </bean>

   <!-- Filter used to switch the user context. Note: the switch and exit url must be secured 
        based on the role granted the ability to 'switch' to another user -->
   <!-- In this example 'marissa' has ROLE_SUPERVISOR that can switch to regular ROLE_USER(s) -->
   <bean id="switchUserProcessingFilter" class="org.acegisecurity.ui.switchuser.SwitchUserProcessingFilter">
      <property name="userDetailsService" ref="jdbcDaoImpl" />
	  <property name="switchUserUrl"><value>/j_acegi_switch_user</value></property>
	  <property name="exitUserUrl"><value>/j_acegi_exit_user</value></property>
	  <property name="targetUrl"><value>/acegi-security-sample-contacts-filter/secure/index.htm</value></property>
   </bean>    

</beans>

Muita coisa né!

também gostaria de saber mais sobre o acegi, inclusive gostaria de saber se e possível mudar as políticas de segurança sem precisar reiniciar a aplicação

Leozin

Gostaria de saber se e possivel fazer no acegi o seguinte

pelo que eu vi vc configura os papeis num xml , tipo o papel tal acessa issso , isso e isso, e o papel fulano isso e aquilo,

o maximo que descobri e que tem como fazer isso sem ser xml, ou seja ao carregar a minha aplicação eu leio do banco os parametros e seto em tempo de execuçao

gostaria de saber, se teria como eu criar um papel novo com uma politica nova com o sistema rodando sem ter que reiniciar a aplicação

Leozin blz, eu quero usar ele com o spring mesmo, entao vc diz que usuarios e regras de acessos podem ser configurados via banco blz, em tempo de execução sem ter que reiniciar a aplicação, ne.

no caso do grilo com xml não e pela configuração tanto do spring quanto do acegi, e sim dos modelos de segurança, pois tipo se eu disser pra o acegi que ele vai usar digest ou coisa assim, que vai ler os usuarios num banco ou via ldap , e normal e viavel que esta configuração fique em xml

nao sei se consegui me expressar

mas isso aqui e que eu gostaria que fosse dinamico num banco sem precisar reiniciar a aplicação

exemplo: a partir de agora os usuarios do papel tal, teram tais e tais acessos, sendo que antes teriam outros acessos ou o tal papel nem existisse

e por acaso vc teria algum exemplo pra me mandar, ou postar???

kra valeu demais