Wednesday, March 4, 2015

Symfony 2 hari 19: Keamanan aplikasi

Artikel ini dirunut berdasarkan Jobeet Tutorial, yang dibuat oleh Fabien Potencier, untuk Symfony 1.4.

Keamanan aplikasi

Kemanan merupakan proses untuk mencegah user agar tidak mengakses halaman yang bukan menjadi haknya. Prosesnya terdiri dari dua langkah, pertama authentifikasi merupakan proses yang akan meminta user untuk memasukan identitas singkat sehingga sistem dapat mengetahui apakah user tersebut berhak untuk mengakses atau tidak. Autorisasi merupkan proses pemberian daftar hak akses oleh sistem berdasarkan status user. Untuk mengamankan aplikasi kita, ubah file security.yml yang ada di folder app/config menjadi seperti berikut ini:

app/config/security.yml

security:
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        secured_area:
            pattern:    ^/
            anonymous: ~
            form_login:
                login_path:  /login
                check_path:  /login_check
                default_target_path: ibw_jobeet_homepage

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: adminpass, roles: 'ROLE_ADMIN' }

    encoders:
        Symfony\Component\Security\Core\User\User: plaintext


============================================

Konfigurasi di atas akan mengamankan bagian aplikasi yang memiliki route /admin. Dengan begitu user yang akan mengakses halaman aplikasi dengan route /admin akan diminta username dan passwordnya.

Untuk proses authentifikasi kita harus membuat halaman form untuk login. Yuk kita mulai, pertama kita tambahkan routing login di confignya:

src/Ibw/JobeetBundle/Resources/config/routing.yml

login:
    pattern:   /login
    defaults:  { _controller: IbwJobeetBundle:Default:login }
login_check:
    pattern:   /login_check

# ...


======================================

Selanjutnya kita akan membuat method di DefaultController untuk mengakomodir proses authentifikasinya:

src/Ibw/JobeetBundle/Controller/DefaultController.php


namespace Ibw\JobeetBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;

class DefaultController extends Controller
{
    // ...

    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();

        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
            $session->remove(SecurityContext::AUTHENTICATION_ERROR);
        }

        return $this->render('IbwJobeetBundle:Default:login.html.twig', array(
            // last username entered by the user
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error,
        ));
    }
}


==========================================

Tugas kita selanjutnya adalah membuata form untuk login.

src/Ibw/JobeetBundle/Resources/views/Default/login.html.twig

{% if error %}
    <div>{{ error.message }}</div>
{% endif %}

<form action="{{ path('login_check') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">login</button>
</form>
 

==============================================

Sekarang jika kita mengakses halaman localhost/sandbox/app_dev.php/admin maka secara otomatis akan diarahkan ke form login jika user belum login sebelumnya.   

No comments:

Post a Comment