Chegamos ao final da nossa série sobre Symfony. Se você não leu os outros, no final do artigo há uma listagem com todos os artigos já publicados dessa série.
No tutorial anterior, instalamos e configuramos o bundle StofDoctrineExtensionsBundle, para fazermos os slugs de nossos posts, agora vamos instalar e configurar o Bundle FOSUserBundle, para fazer a autenticação da área administrativa do nosso blog.
Instalação do bundle FOSUserBundle.
Para instalar o FOSUserBundle, temos que adicioná-lo em nosso composer.json. Abra o arquivo composer.json e adicione a linha abaixo:
Depois de adicionando o FOSUserBundle no composer, vamos instalá- lo. Entre no terminal e digite:
Após o Download, o FOSUserBundle está instalado em nossa aplicação.
Configurando o FOSUserBundle.
A primeira configuração que devemos fazer, é registrar o novo bundle instalado, para isso entre no AppKernel, caminho: app/AppKernel.php
Adicione a linha abaixo no registro de bundles:
Veja na linha 18:
Pronto, o FOSUserBundle está registrado.
Agora vamos fazer as configurações no arquivo config.yml, caminho: app/config/config.yml.
Para que o sistema de login venha traduzido, devemos descomentar a linha translator em framework, veja na linha 3 do código abaixo:
De:
Para:
No final do arquivo adicione as configurações abaixo:
Perceba que na configuração acima, estamos indicando uma entidade User, porém ainda não existente, vamos criá-la.
Criando o bundle UserBundle.
Continuando com nossas configurações, podemos criar um novo bundle para que o mesmo fique responsável pelo gerenciamento dos usuários, em nosso caso, vamos criar o bundle, porém só vamos usar para configurar a entidade User, caso queiram fazer outras configurações, o bundle já está criado.
Entre no terminal e digite:
Digitamos a namespace:
O console nos sugere um nome, vamos deixar como está, apenas damos enter:
No caminho, apenas damos enter:
Usaremos annotation para configurações:
Não vamos querer a geração de toda a estrutura de um bundle, apenas damos enter:
Vamos confirmar a geração do novo bundle, damos enter:
E vamos registrar esse bundle, somente enter:
E gerar as rotas, damos enter:
Pronto, nosso bundle UserBundle está criado, veja:
Nosso bundle está criado, vamos criar nossa entidade User.
Criando a Entidade User.
Vamos entrar no bundle UserBundle, caminho src/Tableless/UserBundle/, e vamos criar uma pasta chamada Entity. Nessa pasta vamos criar uma classe User, que será nossa entidade, veja:
A nossa entidade User tem que estender a entidade User do FOSUserBundle, vamos dar um use nessa classe e vamos apelida lá de BaseUser, veja:
Também temos que passar as configurações (mapear nossa entidade) via annotation, vamos dar um use na classe Mapping do Doctrine e apelida lá de ORM, veja:
Nossa Entidade terá apenas um atributo id, e um método construtor que chamará construtor pai de entidade BaseUser, juntamente com as respectivas annotations, veja nossa entidade User pronta:
Configurações de segurança.
Para configurar a parte de segurança, temos que editar o arquivo security.yml, responsável pela parte de segurança do Symfony, abra o arquivo, caminho: app/config/security.yml.
Abrindo o arquivo, vamos perceber que o Symfony está configurando o provider via memória, vamos alterar o provider.
De:
Para:
Para criptografar a senha do usuário vamos configurar um encoder, incluindo o código abaixo, que usará o algoritmo sha512, veja:
Agora vamos configurar a parte de firewalls, onde estabeleceremos o pattern para ativação do firewalls, que pelo acesso da url será ativado, e qual o tipo de provider que será usado para o processo de autenticação, também passaremos o processo de autenticação apenas pelo formulário, não permitindo outro tipo de requisição, usando o csrf_provider. Vamos permitir o logout, e usuários anônimos nas áreas não restritas, veja:
Temos que passar qual o tipo de acesso o usuário terá que ter, para acessar determinadas urls, ex: o usuário anônimo, só poderá acessar as urls: qualquer-url/login, qualquer-url/register, e qualquer-url/resetting, e apenas usuários administradores, poderão acessar a url: qualquer-url/admin/, para isso passaremos a configuração de controle de acesso, veja:
Temos que configurar a hierarquia de usuários cadastrados, onde o admin, poderá ser qualquer usuário cadastrado, e o super admin, será o administrador com total acesso, veja:
Veja o arquivo security.yml pronto:
Pronto as configurações de segurança, estão prontas.
E para finalizar as configurações, temos que passar as rotas do FOSUserBundle onde ficarão registradas no sistema, para isso abra o arquivo routing.yml, caminho: app/config/routing.yml.
Com o arquivo aberto vamos inserir as rotas abaixo:
Para que tudo ocorra bem, temos que atualizar o banco de dados, para criar a tabela dos usuários, entre no terminal e digite:
veja:
Estilizando as templates do FOSUserBundle.
O FOSUserBundle está configurado e instalado em nosso sistema, para que possamos testá-lo, entre no terminal e digite:
E veremos todas as rotas criadas em nosso sistema através FOSUserBundle, veja:
Podemos entrar em todas as rotas, e perceberemos que está sem estilização, por exemplo: a rota /register/, se acessamos no navegador essa rota: url: https://127.0.0.1:8000/register/ veja:
Está funcionando perfeitamente, porém sem estilização. Vou explicar como fazer para melhorarmos isso, porém não vou me aprofundar.
As templates do FOSUserBundle estão todas na pasta friendsofsymfony dentro do diretório vendor/, porém, sabemos que nunca devemos mexer em nada no diretório vendor, entretanto podemos sobrescrever essas templates principais do FOSUserBundle, para isso vamos criar uma pasta chamada FOSUserBundle em app/Resources, e dentro da pasta criada, vamos criar outra pasta chamada views, veja:
O FOSUserBundle, trabalha com um layout principal, para que possamos sobrescrevê-lo, dentro da pasta views, vamos criar um arquivo chamado layout.html.twig e estender a nossa template base já criada anteriormente. A tamplate layout.html.twig ficará dessa forma, veja:
Pronto, se acessarmos novamente o url: https://127.0.0.1:8000/register/, teremos o resultado:
Pronto, ficou melhor que anteriormente, porém podemos melhorar essa estilização, em meu caso vou deixar como está, mas caso queiram, é só criar um arquivo css com as devidas estilizações, e chamá- lo no base.html.twig que configuramos no tutorial 06, ou usar o próprio bootstrap, e fazer as alterações nos arquivos.
Obs: Podemos sobrescrever todos os arquivos do FOSUserBundle, porém temos que criar os arquivos e as estruturas de pastas, como no original. Veja o original.
Dessa forma podemos usar as classes do bootstrap para a estilização nos arquivos sobrescritos que foram criados, caso queiram ter uma base, tem um projeto em meu Github, que foi criado dessa forma, veja.
Criando um Administrador
Podemos criar os usuários pela url: https://127.0.0.1:8000/register/, porém os usuários criados serão usuários normais do sistema, para criar um super administrador entre no terminal, e digite:
Podemos perceber que agora temos mais opções, pois instalamos o FOSUserBundle, veja:
E para criar um usuário administrador digitamos:
damos um nome, um e-mail e senha, veja:
Porém o usuário criado, ainda é um usuário normal, vamos torná-lo um administrador, ainda no terminal, digite:
Escolhemos o usuário que no meu caso é admin.
Digitamos o Role que queremos, no meu caso ROLE_ADMIN
E pronto, já temos um administrador do sistema.
Restringindo o acesso no sistema.
Para que um usuário anônimo não tenha acesso a administração, ( em nosso caso a administração de autores e administração de posts), vamos entrar novamente em security.yml, caminho: app/config/security.yml, e vamos alterar o controle de acesso, dizendo que todo o usuário que entrar na rota /post/ e /author/ deverá ser um usuário cadastrado, veja na linha 5 e 6:
Pronto, dessa forma todos os usuários que acessarem as urls: https://127.0.0.1:8000/post/ e https://127.0.0.1:8000/author/
deverão ser cadastrados como usuários, como autores do blog ou administradores.
Obs: Quando o usuário anônimo acessar as urls citadas acima, serão redirecionados para a tela de login.
Podemos fazer várias restrições, exemplo: vamos dizer que o usuário autor, pode: visualizar, criar, editar, e deletar um post, porém, ele não pode: criar, nem editar, menos ainda deletar outro autor, para isso entre no AuthorController, caminho: src/Tableless/CoreBundle/Controller/AuthorController.php
Primeiramente damos um use em AccessDeniedException, na classe AuthorController, veja.
Nos métodos createAction, newAction, editAction, updateAction e deleteAction, vamos restringir o acesso do usuário normal, onde verificaremos se ele é um administrador, e caso não seja, vamos gerar um erro, veja o código de verificação abaixo, onde introduziremos em todos os métodos citados acima, :
Exemplo no createAction, nos demais métodos serão iguais, veja:
Veja o erro caso o usuário não tenha acesso:
Pronto!
Podemos fazer outros tipos de restrições, podemos melhorar a segurança em nosso blog, porém no meu caso vou parar por aqui, com o exemplo acima, acredito que temos uma base de como fazer as demais restrições.
Dicas:
Nos tutoriais abordei o básico de como trabalhar com o Symfony 2. Recomendo sempre a documentação para auxílio.
Gostaria de deixar algumas dicas para estudos, que não foram abordados:
Services
Performance
Testing
HTTP Cache:
Translation:
Conclusão.
Esta é a última parte da série “Iniciando com Symfony 2”, espero ter sido útil.
Bons estudos!
Links dos tutoriais anteriores:
Iniciando com Symfony 2 – Instalação
Iniciando com Symfony 2 – parte 02
Iniciando com Symfony 2 – parte 03
Iniciando com Symfony 2 – parte 04
Iniciando com Symfony 2 – parte 05
Iniciando com Symfony 2 – parte 06
Iniciando com Symfony 2 – parte 07
Iniciando com Symfony 2 – parte 08
Iniciando com Symfony 2 – parte 09
O projeto encontra-se no GitHub!