Silex 프레임워크를 사용하여 웹 서비스에 대한 인증을 제공하는 방법은 무엇입니까?

王林
풀어 주다: 2023-06-03 08:28:01
원래의
931명이 탐색했습니다.

Silex는 PHP 언어를 기반으로 하는 경량 웹 프레임워크로 웹 개발을 더욱 간단하고 효율적으로 만들어주는 일련의 구성 요소와 도구를 제공합니다. 그 중 인증은 웹 서비스 구축에 있어 중요한 링크 중 하나입니다. 인증된 사용자만 서비스에 액세스할 수 있도록 보장할 수 있습니다. Silex 프레임워크에서 인증을 사용하려면 몇 가지 구성과 코드 구현이 필요합니다. 이 기사에서는 Silex 프레임워크에서 인증을 사용하는 방법을 소개합니다.

1. 기본 아이디어

Silex 프레임워크에서는 Symfony Security 구성 요소를 사용하여 인증을 수행할 수 있습니다. 기본 프로세스는 다음과 같습니다.

  1. 사용자 이름, 비밀번호 등 사용자가 제공한 신원 정보를 얻습니다.
  2. 획득한 신원 정보를 이용해 본인 인증에 성공하면 인증서가 생성됩니다.
  3. 후속 요청에서 액세스 제어를 위해 인증 자격 증명을 사용하세요.

2. 필수 구성 요소 설치

Symfony Security 구성 요소를 사용하려면 Silex 프레임워크에 필수 구성 요소를 설치해야 하며, 기타 종속 구성 요소는 Composer를 통해 쉽게 설치할 수 있습니다. 프로젝트 루트 디렉터리에 작곡가.json 파일을 만들고 다음 콘텐츠를 추가합니다.

{
    "require": {
        "silex/silex": "~2.0",
        "symfony/security": "^4.3"
    },
    "autoload": {
        "psr-4": { "": "src/" }
    }
}
로그인 후 복사

그런 다음 작곡가 설치 명령을 실행하여 종속 구성 요소를 설치합니다.

3. 인증 정보 구성

인증 정보를 구성하려면 Silex 프레임워크에서 보안 서비스를 정의해야 하며 이 보안 서비스에 대한 ID 공급자와 사용자 공급자를 지정해야 합니다. ID 제공자는 ID 정보 확인을 담당하고, 사용자 제공자는 사용자 세부 정보 제공을 담당합니다. 간단한 웹 애플리케이션의 경우 이 두 서비스는 동일한 구현을 사용할 수 있습니다. 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. 사용자 공급자(UserProvider) 생성

사용자 공급자를 생성하려면 사용자 정보를 얻기 위한 몇 가지 메서드가 포함된 SymfonyComponentSecurityCoreUserUserProviderInterface 인터페이스를 구현해야 합니다. app.php에서 UserProvider를 생성하고 다음 코드를 추가합니다.

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';
    }
}
로그인 후 복사

위 코드에서 loadUserByUsername 메서드는 사용자 이름과 사용자가 소유한 역할(role)을 기반으로 사용자 정보를 쿼리하는 데 사용됩니다. 메소드는 인터페이스 구현을 위한 것입니다.

5. 컨트롤러 만들기

Silex 프레임워크에서 컨트롤러를 만들려면 사용자를 신원 인증을 위한 로그인 페이지로 안내하는 개인 URL을 정의해야 합니다. 인증이 성공하면 사용자는 원래 요청한 URL로 적극적으로 리디렉션됩니다. 인증에 실패할 경우 오류 메시지가 출력되며, 재인증을 위한 로그인 페이지가 표시됩니다.

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');
로그인 후 복사

위 코드에서 /login 경로는 사용자가 인증을 위해 사용자 이름과 비밀번호 정보를 제출할 수 있는 비공개 URL이고, /secured 경로는 제한적인 경로입니다. 액세스 권한. 사용자가 인증 없이 /secured 경로에 액세스하면 로그인 페이지로 리디렉션됩니다.

6. 요약

위 단계를 거쳐 Silex 프레임워크에 사용자 신원 인증 기능을 구현했습니다. 이 과정에서 우리는 Symfony Security 구성 요소를 사용하여 인증 및 사용자 공급자 기능을 구현했습니다. 동시에 완전한 인증 시스템을 구현하려면 구성 정보, 사용자 공급자 및 컨트롤러를 구성해야 합니다. 위의 소개를 통해 Silex 프레임워크에서 인증 기능을 구현해야 하는 개발자에게 참고가 되기를 바랍니다.

위 내용은 Silex 프레임워크를 사용하여 웹 서비스에 대한 인증을 제공하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿