Blog

Criando um archetype no maven

 
 
olá Pessoal, 
 
Vamos ver hoje como criar um archetype no maven. Aqui na ITS Labs (http://www.itslabs.com.br) sempre temos a necessidade de criar archetypes especificos para o modelo de projetos que temos, principalmente os projetos Java + AngularJS, tanto que temos um post resumindo todos os archetypes que disponibilizamos para comunidade. Então aprenda a criar seu próprio archetype.
 
lets go… 
 
 
Passo 1 
 
Crie o projeto maven e deixe na estrutura que você precisa para futuros projetos.
 
Passo 2 
 
Acesse o projeto via command line e digite:
 
mvn archetype:create-from-project

 

Passo 3 
 
Recorte a pasta archettype gerado em:
seuProjeto\target\generated-sources\

 

Passo 4
 
Cole onde quiser. No meu caso coloquei em meu workspace e renomeei como archetypewebapps
 
Passo 5
 
Vá até a pasta archettypewebapps (caso tenha renomeado) e execute:  
 
mvn clean install

 

Note: Observe que dentro dessa pasta tem um pom.xml. Caso deseje customizar, sinta-se à vontade. Para o post vou manter o default.
 
Passo 6
 
Abra o eclipse, crie um novo maven project e escolha all catalogs 
 
mavenarchetypenewproject
 
Se você criou seu projeto como snapshot, marque a opção destacada na imagem acima. 
 
Veja o resultado
 
mavenarchetypefoundits
 
Pronto, archetype criado.
 
Se você modificar e precisar atualizar o archetype, basta digitar: 
 
mvn install archetype:update-local-catalog

Assim as alterações são atualizadas localmente.

 
Abracos. See ya!! 

Yeoman Workaround building is not supported on win32

yeoman
Olá pessoal!
 
O post de hoje é um workaround para quem usa o yeoman no windows e na hora de gerar o projeto com angular pode dar o seguinte erro:
 
building is not supported on win32
 
Você vai ver este erro no final, quando estiver gerando um projeto. Como resolver? 
 
npm install grunt-contrib-imagemin@0.2.0 --save-dev

 

npm install

 

Pronto. Certamente agora você tem tudo funcionando. O problema é na versão do imagemmin 
 
 
Abracos. See ya!

Review de um leitor: Livro SCJP e TDD na Prática

 Opa Pessoal,

Hoje recebi um email do leitor Thiago, autor do blog http://www.varallos.com.br  que fez um review: Guia do Exame SCJP e TDD na Prática. 

 Confiram aqui: 

Review Guia do Exame SCJP 

http://www.varallos.com.br/site/review-guia-do-exame-scjp/

 Review TDD na Prática 

http://www.varallos.com.br/site/review-tdd-na-pratica/

 

abraços, see ya!!!

Troubleshooting Jenkins com repositório privado Github

 

Olá Pessoal,

Quebrei a cabeça esses dias tentando fazer o jenkins se comunicar com um repositório privado no GitHub. Considerando que o jenkins está em um servidor remoto, deu muito trabalho, gastei umas 12hrs até funcionar.

O Problema:

jenkins github private repository returned status code 128:

Essa é a exceção que recebemos quando o Jenkins tenta conectar ao repositório privado para fazer o clone.

O motivo?

O Jenkins não consegue autenticar para fazer o clone.

O que achei?

Não fui muito feliz achando que era da mesma forma que fazemos com repositório público, que apenas gerar o ssh key e adicionar no github. Mas não é bem assim.

Solução

Para resolver o problema eu tive que adicionar 2 ssh key.

  1. Gerei um ssh específico (algo como id_rsa_meuprojeto);
  2. Peguei o id_rsa que já tinha no meu servidor e adicionei ao github.

Resumindo em steps

1. Passphrase não pode ter password, ou seja,  deixar empty para o id_rsa_meuprojeto

2. Criei um key específico id_rsa_meuprojeto e adicionei no github e dei authorized no servidor pelo painel. No meu caso uso  integrator

3. Adicione o id_rsa do servidor no github

4. No Jenkins usei key do id_rsa_meu projeto

Veja na imagem a seguir:

demoniojenkinsfixed

E no Jenkins informe o repositório assim:

jenkinsconfiggithub

Ou seja, usando git@github.com:youruser/yourproject

Não use Https, porque não vai.

É isso ai, só buildar e ver o clone rolando.

Abraços, see ya!! 

Implementando UserDetailsService Spring Security

 

Olá Pessoal,

No post de hoje veremos como implementar a interface UserDetailsService do Spring. Mas para que serve ela, Camilo? É o que vamos ver logo a seguir…

Lets go…

Starting…

Este post será bem pontual e vou considerar que você já usa e conhece o Spring Security. Uma das opções mais comum de validar autenticação do usuário seria algo mais ou menos assim:

<jdbc-user-service data-source-ref="dataSource"

users-by-username-query="SELECT email, password, 'true' as enable FROM user WHERE email=?;"

authorities-by-username-query="select distinct u.email,ro.role_description from user u, user_role r, role ro where u.id = r.role_id and ro.id=r.role_id and u.email=?;" />

 

Independente de como está seu relacionamento no banco, a questão é que você usaria o jdbc-user-service />

Mas você pode estar perguntando “e se quiser usar minha classe de serviço (service) ou meu DAO, se nessas classes eu já tenha a implementação de busca de um usuário, como fazer?”.

Implementando UserDetailsService

Por default, o Spring a implementa. O que vamos fazer é  um override dessa implementação e dizer que é pra chamar um serviço de busca customizado.

Vou mostrar a seguir apenas o código principal e o que você precisa fazer.  Será bem pontual.

Step 1

Crie uma classe para esse tratamento (chamei de AuthenticationService). Veja :

@Service

public class AuthenticationService implements UserDetailsService {

       @Autowired

       @Qualifier("userServiceImpl")

       private UserService userServiceImpl;      

       @Override

       public UserDetails loadUserByUsername(String email)   throws UsernameNotFoundException, DataAccessException {

List<GrantedAuthority> listGrantAuthority = new ArrayList<GrantedAuthority>();

                    User user = userServiceImpl.getByEmail(email);

                    checkGrantAuthorities(user, listGrantAuthority);

                    UserDetails userDetails = validateUser(email, listGrantAuthority,user);

             return userDetails;

       }

 

O método que vamos trabalhar não é difícil de saber, já que tem anotação @Override. É nele que vamos realizar a busca usando as classes de serviço que chama o DAO. No caso acima o username é o email do usuário, por isso realizo a busca por email.  O método checkGrantAuthorities(…) verifica a role do usuário e adiciona em uma lista de Grant:

private void checkGrantAuthorities(User user, List<GrantedAuthority> listGrantAuthority) {

if(user!=null && user.getRoles()!=null && user.getRoles().isEmpty()==false)

             for(Role roleUser : user.getRoles()){

                    final String PREFIX = "ROLE_";

                    String role = PREFIX + roleUser.getRoleDescription();

                    listGrantAuthority.add(new GrantedAuthorityImpl(role));    

             }

       }

 

Precisamos fazer isso para que o Spring Security possa validar se o usuário passado possui Role de permissão para a página que deseja. O PREFIX que criamos é que no BD você não salva ROLE_ADMIN, daí precisamos fazer isso. Caso já salve como prefixo, você deve remover essa concatenação do código. Uma vantagem de não salvar o prefixo é que se amanhã você mudar de framework que faça essa parte de segurança, terá que fazer update em todo banco. Então é melhor deixar a aplicação tratar isso para seu banco ficar transparente.

Em seguida criei um método que valida se o usuário retornado é válido:

private UserDetails validateUser(String email,List<GrantedAuthority> listGrantAuthority, User user) {

             UserDetails userDetails= null;

             if(user!=null){

                    boolean accountNonLocked=true;

                    boolean enabledUser=true;

                    boolean accountNonExpired=true;

                    boolean credentialsNonExpired=true;

userDetails = new  org.springframework.security.core.userdetails.User(email, user.getPassword(), enabledUser, accountNonExpired, credentialsNonExpired, accountNonLocked, listGrantAuthority);

              }     

             return userDetails;

       }

 

 

Eu tive que colocar o caminho completo do User referente ao Spring  devido já ter um import para minha classe User.

Altere o arquivo de contexto do SpringSecurity. No meu caso, tenho um arquivo XML chamado de springsecurity.xml e no authenticationManager preciso dizer como vamos validar o usuário. Para usar a implementação acima precisamos dizer isso:

 

<authentication-manager alias="authenticationManager">

       <authentication-provider user-service-ref="authenticationService">      

             </authentication-provider>

       </authentication-manager>

 

Pronto. Feito isso, agora basta testar sua aplicação e ver que vai funcionar da mesma forma que o jdbc default, porém agora os dados vem de um serviço de pesquisa que você implementou, que pode ser em HQL, Criteria etc.

A documentação do Spring é muito bacana:

http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/ns-config.html

Abraços. Vou ficando por aqui e espero que tenham gostado

See ya!!