Tuesday, December 14, 2010

SpringRoo com Segurança e Repositório Usuários em BD Relacional

Apesar do Spring Roo não contar com nenhum add-on no módulo de segurança pra configurar um repositório de usuários em Banco de Dados Relacional, isso é muito simples de resolver.

Basta informar ao Spring que ele deve usar o DaoAuthenticationProvider como provedor de autenticação no Security. No applicationContext-security.xml:

    <authentication-manager alias="authenticationManager">
       <authentication-provider ref="daoAuthenticationProvider"/>
    </authentication-manager>

Depois é só definir o bean do DaoAuthenticationProvider, vincular o bean JdbcDaoImpl como service, com o DataSource e Queries mapeadas. No applicationContext.xml:

  <bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="jdbcUserDetailsService"/>
  </bean>

  <bean id="jdbcUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="?"/>
    <property name="usersByUsernameQuery" value="?"/>
    <property name="authoritiesByUsernameQuery" value="?"/>
  </bean>

Na property dataSource informe respectivo DataSource do projeto, a query para busca de usuários em usersByUsernameQuery e a busca de perfis em authoritiesByUsernameQuery.


Veja também mais sobre Spring Roo no Globalcoders e aqui no blog.

http://twitter.com/edermag
http://www.yaw.com.br/

Monday, December 13, 2010

Aplicando Segurança no Spring Roo através do Spring Security

Como aplicar/habilitar mecanismo de segurança em aplicativo desenvolvido com Spring Roo? Ou melhor, como usar Spring Security com o Spring Roo? Esse post responde essas perguntas.

A instalação e configuração do Spring Security é a mesma de um aplicativo que já usa Spring Web MVC. MAS o pulo do gato é resolver isso através do shell do Spring Roo, com mais um comando esperto.

Comece definindo a estrutura do aplicativo no Spring Roo, depois execute o comando:

_> security setup


Altere o arquivo applicationContext-security.xml indicando o padrão de url que aciona o mecanismo de segurança segurança, por exemplo:
    <intercept-url pattern="/pastaProtegida/**" access="isAuthenticated()" /> 

Pronto! É só empacotar [perform package] e rodar a aplicação [mvn tomcat:run].


Mas... o que o Roo faz por trás das cortinas?

  • Primeiro configura a dependência do Spring Security (pom.xml);
  • Depois cria um arquivo xml com as diretrizes de segurança: applicationContext-security.xml
     <http auto-config="true" use-expressions="true">
        <form-login 
           login-processing-url="/resources/j_spring_security_check" 
           login-page="/login" 
           authentication-failure-url="/login?login_error=t"/>
        <logout logout-url="/resources/j_spring_security_logout"/>
       
        <!-- primeiro so admin, segundo qualquer autenticado, terceiro e quarto nao precisa de login -->
        <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/restrito/**" access="isAuthenticated()" />
        <intercept-url pattern="/free/**" access="permitAll" />
        <intercept-url pattern="/**" access="permitAll" />
    </http>

    <!-- define o mecanismo de seguranca simples (estatico) com os usuarios: admin/admin e user/user -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider>
            <password-encoder hash="sha-256"/>
            <user-service>
                <user name="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918" authorities="ROLE_ADMIN"/>
            <user name="user" password="04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb" authorities="ROLE_USER"/>
        </user-service>
        </authentication-provider>
    </authentication-manager>

  • Cria uma página com formulário de login:
Trecho de /WEB-INF/views/login.jspx
    ...
    <form action="/static/resources/j_spring_security_check" method="POST">
      <div>
        <label for="j_username">
          <spring:message code="security_login_form_name" />
        </label>
        <input id="j_username" type='text' name='j_username' />
    ...
      </div>
      <br />
      <div>
        <label for="j_password">
          <spring:message code="security_login_form_password" />
        </label>
        <input id="j_password" type='password' name='j_password' />
        ...
      </div>
      ...
    </form>
    ...

  • Configura a página de login no arquivo view.xml (usado pelo Tiles):
     <definition extends="public" name="login">
        <put-attribute name="body" value="/WEB-INF/views/login.jspx"/>
    </definition>  

  • Declara o filtro do Spring Security (springSecurityFilterChain) no web.xml:
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>
         org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    </filter>

  • Configura a página de login no webmvc-config.xml:
    <mvc:view-controller path="/login"/>


Veja mais sobre Spring Security.
Veja também mais sobre Spring Roo no Globalcoders e aqui no blog.

Spring Roo: Mais agilidade com qualidade!

http://twitter.com/edermag
http://www.yaw.com.br/