Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyediakan pengesahan untuk perkhidmatan web menggunakan rangka kerja Silex?

Bagaimana untuk menyediakan pengesahan untuk perkhidmatan web menggunakan rangka kerja Silex?

王林
王林asal
2023-06-03 08:21:44886semak imbas

Silex ialah rangka kerja web ringan berdasarkan bahasa PHP Ia menyediakan satu siri komponen dan alatan untuk menjadikan pembangunan web lebih mudah dan cekap. Antaranya, pengesahan adalah salah satu pautan penting dalam membina perkhidmatan Web Ia dapat memastikan bahawa hanya pengguna yang diberi kuasa boleh mengakses perkhidmatan tersebut. Dalam rangka kerja Silex, menggunakan pengesahan memerlukan beberapa konfigurasi dan pelaksanaan kod Dalam artikel ini, kami akan memperkenalkan cara menggunakan pengesahan dalam rangka kerja Silex.

1. Idea asas

Dalam rangka kerja Silex, pengesahan boleh dicapai dengan menggunakan komponen Symfony Security. Proses asas adalah seperti berikut:

  1. Dapatkan maklumat identiti yang diberikan oleh pengguna, seperti nama pengguna dan kata laluan.
  2. Gunakan maklumat identiti yang diperolehi untuk pengesahan identiti Jika pengesahan berjaya, sijil pengesahan akan dihasilkan.
  3. Gunakan bukti kelayakan pengesahan untuk kawalan akses dalam permintaan seterusnya.

2. Pasang komponen yang diperlukan

Untuk menggunakan komponen Symfony Security, anda perlu memasang komponen yang diperlukan dalam rangka kerja Symfony Security dan komponen bergantung yang lain dengan mudah dipasang melalui Komposer . Cipta fail composer.json dalam direktori akar projek dan tambah kandungan berikut:

{
    "require": {
        "silex/silex": "~2.0",
        "symfony/security": "^4.3"
    },
    "autoload": {
        "psr-4": { "": "src/" }
    }
}

Kemudian laksanakan arahan pemasangan komposer untuk memasang komponen bergantung.

3. Konfigurasikan maklumat pengesahan

Konfigurasi maklumat pengesahan memerlukan mentakrifkan perkhidmatan keselamatan dalam rangka kerja Silex dan menentukan pembekal identiti dan pembekal pengguna untuk perkhidmatan keselamatan ini. Pembekal identiti bertanggungjawab untuk mengesahkan maklumat identiti, dan pembekal pengguna bertanggungjawab untuk memberikan butiran pengguna Untuk aplikasi web mudah, kedua-dua perkhidmatan ini boleh menggunakan pelaksanaan yang sama. Tambahkan kod berikut pada app.php:

use SymfonyComponentSecurityCoreUserInMemoryUserProvider;
use SymfonyComponentSecurityCoreUserUser;
use SymfonyComponentSecurityCoreUserUserProviderInterface;

$app->register(new SilexProviderSecurityServiceProvider());

$app['security.firewalls'] = array(
    'secured' => array(
        'pattern' => '^/secured',
        'http' => true,
        'users' => function() use($app){
            return new InMemoryUserProvider(
                array(
                    'admin' => array('ROLE_USER', 'password')
                )
            );
        }
    )
);

$app['security.access_rules'] = array(
    array('^/secured', 'ROLE_USER')
);

$app['security.role_hierarchy'] = array(
    'ROLE_ADMIN' => array('ROLE_USER')
);

$app['security.user_provider'] = function($app) {
    return new UserProvider($app['db']);
};

$app['security.encoder.bcrypt'] = $app->share(function($app) {
    return new BCryptPasswordEncoder($app['security.encoder.bcrypt.cost']);
});

$app['security.authentication_listener.factory.form'] = $app->protect(function ($name, $options) use ($app) {
    $app['security.authentication_provider.'.$name.'.form'] = function () use ($app) {
        return new FormAuthenticationProvider(
            $app['security.user_provider'],
            $app['security.encoder_factory']
        );
    };
 
    $app['security.authentication_listener.'.$name.'.form'] = function () use ($app, $name, $options) {
        return new FormAuthenticationListener(
            $app['security'],
            $app['security.authentication_manager'],
            $name,
            $options,
            new UsernamePasswordFormAuthenticationEntryPoint(
                $app,
                $app['security.http_utils'],
                $name
            ),
            $app['logger'],
            $app['dispatcher'],
            $app['security.authentication.session_strategy']
        );
    };
 
    return array(
        'security.authentication_provider.'.$name.'.form',
        'security.authentication_listener.'.$name.'.form',
        null,
        'pre_auth'
    );
});

4. Cipta penyedia pengguna (UserProvider)

Mencipta pembekal pengguna memerlukan pelaksanaan antara muka SymfonyComponentSecurityCoreUserUserProviderInterface, yang mengandungi beberapa maklumat untuk mendapatkan kaedah maklumat pengguna . Cipta UserProvider dalam app.php dan tambahkan kod berikut:

use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;

class UserProvider implements UserProviderInterface
{
    private $db;

    public function __construct(Connection $db)
    {
        $this->db = $db;
    }

    public function loadUserByUsername($username)
    {
        $stmt = $this->db->executeQuery('SELECT * FROM users WHERE username = ?', array(strtolower($username)));

        if (!$user = $stmt->fetch()) {
            throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
        }

        $rolesStmt = $this->db->executeQuery('SELECT roles.role FROM user_roles JOIN roles ON user_roles.role_id = roles.id WHERE user_id = ?', array($user['id']));
        $roles = array();
        while ($role = $rolesStmt->fetch(PDO::FETCH_ASSOC)) {
            $roles[] = $role['role'];
        }

        return new User($user['username'], $user['password'], explode(',', $user['roles']), true, true, true, true);
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $user;
    }

    public function supportsClass($class)
    {
        return $class === 'SymfonyComponentSecurityCoreUserUser';
    }
}

Dalam kod di atas, kaedah loadUserByUsername digunakan untuk menanyakan maklumat pengguna berdasarkan nama pengguna dan peranan (peranan) yang dimiliki oleh pengguna. Kaedah refreshUser dan supportsClass adalah Pelaksanaan antara muka mesti dilaksanakan.

5. Cipta Pengawal

Mencipta Pengawal dalam rangka kerja Silex memerlukan penentuan URL peribadi yang membimbing pengguna ke halaman log masuk untuk pengesahan identiti. Jika pengesahan berjaya, pengguna akan diubah hala secara aktif ke URL asal yang diminta. Jika pengesahan gagal, mesej ralat akan diberikan dan halaman log masuk akan dipaparkan untuk mengesahkan semula.

Tambahkan kod berikut dalam app.php:

$app->match('/login', function(Request $request) use ($app){
        $username = $request->request->get('_username');
        $password = $request->request->get('_password');

        $user = $app['security.user_provider']->loadUserByUsername($username);

        if (!$app['security.encoder.bcrypt']->isPasswordValid($user->getPassword(), $password, $user->getSalt())) {
            throw new Exception('Bad credentials');
        } else {
            $token = new UsernamePasswordToken($user, null, 'secured', $user->getRoles());
            $app['security.token_storage']->setToken($token);
            $request->getSession()->set('_security_secured', serialize($token));
            return $app->redirect($request->headers->get('referer'));
        }
})->bind('login');

$app->match('/secured', function() use ($app){
        if (!$app['security.authorization_checker']->isGranted('ROLE_USER')){
            return $app->redirect('/login');
        }
 
        return 'Welcome ' . $app['security.token_storage']->getToken()->getUsername();
})->bind('secured');

Dalam kod di atas, laluan /login ialah URL peribadi, yang membolehkan pengguna menyerahkan maklumat nama pengguna dan kata laluan untuk pengesahan, dan /laluan selamat ialah Laluan dengan akses terhad. Jika pengguna mengakses laluan /secured tanpa pengesahan, mereka akan diubah hala ke halaman log masuk.

6. Ringkasan

Melalui langkah di atas, kami telah melaksanakan fungsi pengesahan identiti pengguna dalam rangka kerja Silex. Dalam proses ini, kami menggunakan komponen Symfony Security untuk melaksanakan fungsi pengesahan dan pembekal pengguna Pada masa yang sama, maklumat konfigurasi, pembekal pengguna dan Pengawal mesti dikonfigurasikan untuk melaksanakan sistem pengesahan yang lengkap. Melalui pengenalan di atas, saya berharap dapat memberi sedikit rujukan kepada pembangun yang perlu melaksanakan fungsi pengesahan dalam rangka kerja Silex.

Atas ialah kandungan terperinci Bagaimana untuk menyediakan pengesahan untuk perkhidmatan web menggunakan rangka kerja Silex?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn