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/

1 comment:

Thiago said...

Se minha aplicação for com JSF, tem alguma forma de eu adicionar o security pq eu nao encontro no help.