2012-05-09 1 views
0

Symfon2에서 작업하고 있는데 설명서를 읽었습니다. 문제는 "보안"섹션에 속합니다. 나는 토큰을 세션에 유지할 수있는 사용자 지정 인증 공급자가 필요합니다. 그러면 다음 요청에서이를 얻을 수 있으며 사용자가 올바른 자격 증명을 제공하지 않으면 로그인 양식으로 리디렉션됩니다. 그는 다른 페이지로 리디렉션 될 정확한 자격 증명을 제공했습니다.AbstractAuthenticationListener를 사용하여 사용자 정의 인증 공급자 구현

1.             [액세스 시작 페이지 (페이지 보호)]

사용자 ----------------------- --------------------------------> [사용자가 로그인 폼 페이지로 리디렉션 됨] ----> [사용자가 제공 한 잘못된 자격 증명] -----> [사용자는 양식 페이지를] 로그인 반환

2.             [액세스 시작 페이지 (보호 된 페이지)]
사용자 ------------------------------------- -------------------> [사용자가 로그인 폼 페이지로 리디렉션 됨] ----> [사용자가 올바른 자격 증명을 제공함] -------> [[ 사용자가 welcom 페이지에 액세스]

사용자 정의 인증 공급자가 ldap, db ... 등으로 사용자를 확인한 다음 토큰을 제공하고이를 보안 컨텍스트에 저장하고 염두에두고 싶습니다. 내 로그인 양식 리디렉션이 올바르게 작동합니다 (사용자 자격 증명이 잘못되면 사용자가 로그인 양식 페이지로 리디렉션되고 올바른 경우 환영 페이지로 리디렉션됩니다).

요리 책에는 "How to create a custom Authentication Provider"에 대한 기사가 있으며, "WSSE 인증을위한 사용자 지정 인증 공급자를 만드는 방법"에 대해 설명합니다.

나중에 메모가 기록 된 문서

: 클래스 이상 사용되지는 AbstractAuthenticationListener 클래스는 보안 확장을 위해 일반적으로 필요한 기능을 제공하는 매우 유용한 기본 클래스입니다. 여기에는 세션에서 토큰 유지 관리, 성공/실패 처리기, 로그인 양식 URL 제공 등이 포함됩니다. WSSE는 인증 세션이나 로그인 양식을 유지할 필요가 없으므로이 예제에서는 사용되지 않습니다.

요리 책에 언급 된 예에서 ListenerInterface이 사용되지만 로그인 양식 페이지에는 사용할 수 없습니다.

일부 사용자가이 문제를 해결하면 해결책을 얻게되어 매우 감사 할 것입니다. 당신은 DB 이외의 소스에서 사용자를 확인하려면

최고 감사합니다,
대니

답변

3

나는 사용자 정의 인증 공급자를 만들 생각은 필요하지 않습니다. 사용자 지정 사용자 공급자를 만들고 방화벽에서 해당 공급자를 설정할 수 있습니다. 확인 전화 번호부 this을 확인하십시오.

편집

당신이 토큰 및 사용자 정의 사용자 제공자를 지원하는 사용자 정의 토큰 및 사용자 정의 AuthenticationProviderInterface을 만든 가정, AbstractAuthenticationListener 클래스를 구현하는 클래스를 만들고 attemptAuthentication 방법을 구현한다. 이자형.g

protected function attemptAuthentication(Request $request) 
{ 
    $param = trim($request->get('parameter', null, true));// auth parameters 

    // other processing 
    // authenticate method ultimatly calls your custom auth provider that supports your custom token. 
    return $this->authenticationManager->authenticate(new YourCustomToken($username, $password, $this->providerKey)); 
} 

here 구현을 확인하십시오. 서비스 정의는 다시 here

편집이다 :

두 가지, 사용자 제공 및 인증 업체에 있습니다. 사용자 공급자는 사용자 개체의 고유 한 필드 (이 경우 사용자 이름)를 기반으로 데이터 원본에서 사용자 개체를로드합니다. 고유 한 필드는 이메일 또는 고유 토큰이 될 수 있습니다. 한편, 인증 프로 바이더는 지정된 자격으로 인증하고 일단 인증되면 적절한 토큰을 반환합니다. 그래서 처음에는 소스에서 사용자 객체를로드하고, 당신의 경우에는 LDAP를 사용합니다. 그런 다음 해당 객체의 비밀번호를 사용자 입력에서 제공된 비밀번호로 확인합니다. 혼란을 없애기를 희망합니다.

그리고 예, 방화벽을 사용하여 LDAP 공급자를 설정할 수 있습니다. 예를 들어

귀하의 회신에
#app/config/security.yml 
firewalls: 
    main: 
     pattern: ^/ 
     form_login: 
      provider: your_custom_provider 
+0

감사 m2mdas,하지만 난 어쩌면 특별한 숫자이다, 또는 자격 증명이 올바른지, 자격 증명은 사용자 이름/비밀번호로 필요하지 않습니다 보안 컨텍스트로 나의 특별한 토큰을 추가해야합니다 서버, 사용자, 패스 등의 조합 ... –

+0

내 편집 된 댓글보기 –

+0

loadUserByUsername ($ username)을 가진 "UserProviderInterface"를 구현해야하기 때문에 왜 사용자 공급자 만 사용할 수 없습니까?하지만 이것은 내게 사용자 이름을 줄 것입니다. 내 상황에서 사용자가 LDAP를 제공해야하는 경우 자격 증명 사용자 이름/암호, 사용자/패스가 필요하므로 데이터베이스를 사용하여 사용자를 확인하지 않고 http://symfony.com/doc/current/cookbook/security/custom_provider.html의 솔루션을 사용한다고 가정합니다. 그래서 PHP에서 ldap 함수를 사용하여 사용자가 존재하는지 확인하고, 존재한다면 유효한 토큰을 반환 할 수 있습니다. –