다중 방화벽으로 Symfony 5.4의 보안이 향상되었습니다.
P粉952365143
2023-08-26 16:14:30
<p>사용자 인증과 관리자 인증을 분리하려고 합니다. </p>
<p>그래서 방화벽 2개와 서로 다른 액세스 제어 2개를 만들었습니다. </p>
<p>내 security.yaml 파일은 다음과 같습니다:</p>
<pre class="brush:php;toolbar:false;">enable_authenticator_manager: true
비밀번호_해셔:
SymfonyComponentSecurityCoreUserPasswordAuthenticatedUserInterface: '자동'
공급자:
소유자_인증:
실재:
클래스: AppEntityMerchantOwner
속성: emailAddress
사용자 인증:
실재:
클래스: AppEntityUserUser
속성: emailAddress
방화벽:
개발자:
패턴: ^/(_(profiler|wdt)|css|images|js)/
보안: 거짓
사용자:
게으르다 : 사실
패턴: ^/admin/login/
공급자: user_authentication
user_checker: AppSecurityAuthentificableModelChecker
양식_로그인:
공급자: user_authentication
default_target_path: app.dashboard.index
use_referer: 사실
use_forward: 거짓
login_path: app.authorization.admin_login
check_path: app.authorization.admin_login
사용자 이름_파라미터: 로그인[이메일 주소]
비밀번호_매개변수: 로그인[비밀번호]
로그 아웃:
경로: app.authorization.logout
대상: app.authorization.admin_login
기본:
게으른: 사실
패턴: ^/
공급자: owner_authentication
user_checker: AppSecurityAuthentificableModelChecker
양식_로그인:
공급자: owner_authentication
default_target_path: app.dashboard.index
use_referer: 사실
use_forward: 거짓
login_path: app.authorization.login
check_path: app.authorization.login
사용자 이름_파라미터: 로그인[이메일 주소]
비밀번호_매개변수: 로그인[비밀번호]
로그 아웃:
경로: app.authorization.logout
대상: app.authorization.login
액세스 제어:
- { 경로: ^/admin/login, 역할: PUBLIC_ACCESS}
- { 경로: ^/로그인, 역할: PUBLIC_ACCESS }
- { 경로: ^/, 역할: ROLE_USER }</pre>
<p>기본 방화벽에서는 모든 것이 잘 작동하지만 사용자(관리자) 방화벽 제출 버튼을 사용하면 로그인 페이지가 자동으로 새로 고쳐지고 아무 일도 일어나지 않습니다. 오류가 발생하지 않습니다. </p>
<p>** 기본 방화벽에 사용자(관리자) 로그인을 추가하면 /admin/login은 제대로 작동하고 다른 로그인은 더 이상 작동하지 않습니다. </p>
<p><code>$authenticationUtils->getLastAuthenticationError()</code>를 호출하면 오류가 발생하지 않습니다. 그러나 유효성 검사도 작동하지 않습니다.</p>
<p>내 컨트롤러는 다음과 같습니다.</p>
<pre class="brush:php;toolbar:false;">공개 함수 adminLogin(AuthenticationUtils $authenticationUtils): 응답
{
if ($this->getUser()) {
return $this->redirectToRoute('app.dashboard.index');
}
$loginForm = $this->createForm(LoginType::class, ['emailAddress' => $authenticationUtils->getLastUsername()]);
return $this->renderForm('app/pages/authorization/admin_login.html.twig', [
'제목' => '로그인',
'login_form' =>
'오류' => $authenticationUtils->getLastAuthenticationError()?->getMessageKey(),
]);
}</pre>
<p>이것은 사람이 겪었던 것과 동일한 문제입니다: https://grafikart.fr/forum/35234, 그러나 어떤 해결책도 찾을 수 없었습니다. </p>
마침내 답을 찾았고 여기에 게시하겠습니다: https://stackoverflow.com/a/42352112/8003007 내가 해야 할 일은 두 방화벽에 하나를
context: my_context
추가하는 것뿐입니다.이 옵션은 공식 및 최신 Symfony 문서에는 나타나지 않고 Symfony 3.4와 같은 이전 버전에만 나타나기 때문에 식별하기 어려운 옵션입니다.