name: SecurityDataCollector class_comment: '# * @author Fabien Potencier # * # * @final' dependencies: - name: TraceableFirewallListener type: class source: Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener - name: FirewallMap type: class source: Symfony\Bundle\SecurityBundle\Security\FirewallMap - name: Cookie type: class source: Symfony\Component\HttpFoundation\Cookie - name: Request type: class source: Symfony\Component\HttpFoundation\Request - name: Response type: class source: Symfony\Component\HttpFoundation\Response - name: DataCollector type: class source: Symfony\Component\HttpKernel\DataCollector\DataCollector - name: LateDataCollectorInterface type: class source: Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface - name: TokenStorageInterface type: class source: Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface - name: SwitchUserToken type: class source: Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken - name: AccessDecisionManagerInterface type: class source: Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface - name: TraceableAccessDecisionManager type: class source: Symfony\Component\Security\Core\Authorization\TraceableAccessDecisionManager - name: TraceableVoter type: class source: Symfony\Component\Security\Core\Authorization\Voter\TraceableVoter - name: RoleHierarchyInterface type: class source: Symfony\Component\Security\Core\Role\RoleHierarchyInterface - name: SwitchUserListener type: class source: Symfony\Component\Security\Http\Firewall\SwitchUserListener - name: FirewallMapInterface type: class source: Symfony\Component\Security\Http\FirewallMapInterface - name: LogoutUrlGenerator type: class source: Symfony\Component\Security\Http\Logout\LogoutUrlGenerator - name: ClassStub type: class source: Symfony\Component\VarDumper\Caster\ClassStub - name: Data type: class source: Symfony\Component\VarDumper\Cloner\Data properties: [] methods: - name: isEnabled visibility: public parameters: [] comment: "# * @author Fabien Potencier \n# *\n# * @final\n#\ \ */\n# class SecurityDataCollector extends DataCollector implements LateDataCollectorInterface\n\ # {\n# private bool $hasVarDumper;\n# \n# public function __construct(\n# private\ \ ?TokenStorageInterface $tokenStorage = null,\n# private ?RoleHierarchyInterface\ \ $roleHierarchy = null,\n# private ?LogoutUrlGenerator $logoutUrlGenerator =\ \ null,\n# private ?AccessDecisionManagerInterface $accessDecisionManager = null,\n\ # private ?FirewallMapInterface $firewallMap = null,\n# private ?TraceableFirewallListener\ \ $firewall = null,\n# ) {\n# $this->hasVarDumper = class_exists(ClassStub::class);\n\ # }\n# \n# public function collect(Request $request, Response $response, ?\\Throwable\ \ $exception = null): void\n# {\n# if (null === $this->tokenStorage) {\n# $this->data\ \ = [\n# 'enabled' => false,\n# 'authenticated' => false,\n# 'impersonated' =>\ \ false,\n# 'impersonator_user' => null,\n# 'impersonation_exit_path' => null,\n\ # 'token' => null,\n# 'token_class' => null,\n# 'logout_url' => null,\n# 'user'\ \ => '',\n# 'roles' => [],\n# 'inherited_roles' => [],\n# 'supports_role_hierarchy'\ \ => null !== $this->roleHierarchy,\n# ];\n# } elseif (null === $token = $this->tokenStorage->getToken())\ \ {\n# $this->data = [\n# 'enabled' => true,\n# 'authenticated' => false,\n# 'impersonated'\ \ => false,\n# 'impersonator_user' => null,\n# 'impersonation_exit_path' => null,\n\ # 'token' => null,\n# 'token_class' => null,\n# 'logout_url' => null,\n# 'user'\ \ => '',\n# 'roles' => [],\n# 'inherited_roles' => [],\n# 'supports_role_hierarchy'\ \ => null !== $this->roleHierarchy,\n# ];\n# } else {\n# $inheritedRoles = [];\n\ # $assignedRoles = $token->getRoleNames();\n# \n# $impersonatorUser = null;\n\ # if ($token instanceof SwitchUserToken) {\n# $originalToken = $token->getOriginalToken();\n\ # $impersonatorUser = $originalToken->getUserIdentifier();\n# }\n# \n# if (null\ \ !== $this->roleHierarchy) {\n# foreach ($this->roleHierarchy->getReachableRoleNames($assignedRoles)\ \ as $role) {\n# if (!\\in_array($role, $assignedRoles, true)) {\n# $inheritedRoles[]\ \ = $role;\n# }\n# }\n# }\n# \n# $logoutUrl = null;\n# try {\n# $logoutUrl = $this->logoutUrlGenerator?->getLogoutPath();\n\ # } catch (\\Exception) {\n# // fail silently when the logout URL cannot be generated\n\ # }\n# \n# $this->data = [\n# 'enabled' => true,\n# 'authenticated' => (bool)\ \ $token->getUser(),\n# 'impersonated' => null !== $impersonatorUser,\n# 'impersonator_user'\ \ => $impersonatorUser,\n# 'impersonation_exit_path' => null,\n# 'token' => $token,\n\ # 'token_class' => $this->hasVarDumper ? new ClassStub($token::class) : $token::class,\n\ # 'logout_url' => $logoutUrl,\n# 'user' => $token->getUserIdentifier(),\n# 'roles'\ \ => $assignedRoles,\n# 'inherited_roles' => array_unique($inheritedRoles),\n\ # 'supports_role_hierarchy' => null !== $this->roleHierarchy,\n# ];\n# }\n# \n\ # // collect voters and access decision manager information\n# if ($this->accessDecisionManager\ \ instanceof TraceableAccessDecisionManager) {\n# $this->data['voter_strategy']\ \ = $this->accessDecisionManager->getStrategy();\n# $this->data['voters'] = [];\n\ # \n# foreach ($this->accessDecisionManager->getVoters() as $voter) {\n# if ($voter\ \ instanceof TraceableVoter) {\n# $voter = $voter->getDecoratedVoter();\n# }\n\ # \n# $this->data['voters'][] = $this->hasVarDumper ? new ClassStub($voter::class)\ \ : $voter::class;\n# }\n# \n# // collect voter details\n# $decisionLog = $this->accessDecisionManager->getDecisionLog();\n\ # foreach ($decisionLog as $key => $log) {\n# $decisionLog[$key]['voter_details']\ \ = [];\n# foreach ($log['voterDetails'] as $voterDetail) {\n# $voterClass = $voterDetail['voter']::class;\n\ # $classData = $this->hasVarDumper ? new ClassStub($voterClass) : $voterClass;\n\ # $decisionLog[$key]['voter_details'][] = [\n# 'class' => $classData,\n# 'attributes'\ \ => $voterDetail['attributes'], // Only displayed for unanimous strategy\n# 'vote'\ \ => $voterDetail['vote'],\n# ];\n# }\n# unset($decisionLog[$key]['voterDetails']);\n\ # }\n# \n# $this->data['access_decision_log'] = $decisionLog;\n# } else {\n# $this->data['access_decision_log']\ \ = [];\n# $this->data['voter_strategy'] = 'unknown';\n# $this->data['voters']\ \ = [];\n# }\n# \n# // collect firewall context information\n# $this->data['firewall']\ \ = null;\n# if ($this->firewallMap instanceof FirewallMap) {\n# $firewallConfig\ \ = $this->firewallMap->getFirewallConfig($request);\n# if (null !== $firewallConfig)\ \ {\n# $this->data['firewall'] = [\n# 'name' => $firewallConfig->getName(),\n\ # 'request_matcher' => $firewallConfig->getRequestMatcher(),\n# 'security_enabled'\ \ => $firewallConfig->isSecurityEnabled(),\n# 'stateless' => $firewallConfig->isStateless(),\n\ # 'provider' => $firewallConfig->getProvider(),\n# 'context' => $firewallConfig->getContext(),\n\ # 'entry_point' => $firewallConfig->getEntryPoint(),\n# 'access_denied_handler'\ \ => $firewallConfig->getAccessDeniedHandler(),\n# 'access_denied_url' => $firewallConfig->getAccessDeniedUrl(),\n\ # 'user_checker' => $firewallConfig->getUserChecker(),\n# 'authenticators' =>\ \ $firewallConfig->getAuthenticators(),\n# ];\n# \n# // generate exit impersonation\ \ path from current request\n# if ($this->data['impersonated'] && null !== $switchUserConfig\ \ = $firewallConfig->getSwitchUser()) {\n# $exitPath = $request->getRequestUri();\n\ # $exitPath .= null === $request->getQueryString() ? '?' : '&';\n# $exitPath .=\ \ \\sprintf('%s=%s', urlencode($switchUserConfig['parameter']), SwitchUserListener::EXIT_VALUE);\n\ # \n# $this->data['impersonation_exit_path'] = $exitPath;\n# }\n# }\n# }\n# \n\ # // collect firewall listeners information\n# $this->data['listeners'] = [];\n\ # if ($this->firewall) {\n# $this->data['listeners'] = $this->firewall->getWrappedListeners();\n\ # }\n# \n# $this->data['authenticators'] = $this->firewall ? $this->firewall->getAuthenticatorsInfo()\ \ : [];\n# \n# if ($this->data['listeners'] && !($this->data['firewall']['stateless']\ \ ?? true)) {\n# $authCookieName = \"{$this->data['firewall']['name']}_auth_profile_token\"\ ;\n# $deauthCookieName = \"{$this->data['firewall']['name']}_deauth_profile_token\"\ ;\n# $profileToken = $response->headers->get('X-Debug-Token');\n# \n# $this->data['auth_profile_token']\ \ = $request->cookies->get($authCookieName);\n# $this->data['deauth_profile_token']\ \ = $request->cookies->get($deauthCookieName);\n# \n# if ($this->data['authenticated']\ \ && !$this->data['auth_profile_token']) {\n# $response->headers->setCookie(new\ \ Cookie($authCookieName, $profileToken));\n# \n# $this->data['deauth_profile_token']\ \ = null;\n# $response->headers->clearCookie($deauthCookieName);\n# } elseif (!$this->data['authenticated']\ \ && !$this->data['deauth_profile_token']) {\n# $response->headers->setCookie(new\ \ Cookie($deauthCookieName, $profileToken));\n# \n# $this->data['auth_profile_token']\ \ = null;\n# $response->headers->clearCookie($authCookieName);\n# }\n# }\n# }\n\ # \n# public function reset(): void\n# {\n# $this->data = [];\n# }\n# \n# public\ \ function lateCollect(): void\n# {\n# $this->data = $this->cloneVar($this->data);\n\ # }\n# \n# /**\n# * Checks if security is enabled." - name: getUser visibility: public parameters: [] comment: '# * Gets the user.' - name: getRoles visibility: public parameters: [] comment: '# * Gets the roles of the user.' - name: getInheritedRoles visibility: public parameters: [] comment: '# * Gets the inherited roles of the user.' - name: supportsRoleHierarchy visibility: public parameters: [] comment: '# * Checks if the data contains information about inherited roles. Still the inherited # * roles can be an empty array.' - name: isAuthenticated visibility: public parameters: [] comment: '# * Checks if the user is authenticated or not.' - name: isImpersonated visibility: public parameters: [] comment: null - name: getImpersonatorUser visibility: public parameters: [] comment: null - name: getImpersonationExitPath visibility: public parameters: [] comment: null - name: getTokenClass visibility: public parameters: [] comment: '# * Get the class name of the security token.' - name: getToken visibility: public parameters: [] comment: '# * Get the full security token class as Data object.' - name: getLogoutUrl visibility: public parameters: [] comment: '# * Get the logout URL.' - name: getVoters visibility: public parameters: [] comment: '# * Returns the FQCN of the security voters enabled in the application. # * # * @return string[]|Data' - name: getVoterStrategy visibility: public parameters: [] comment: '# * Returns the strategy configured for the security voters.' - name: getAccessDecisionLog visibility: public parameters: [] comment: '# * Returns the log of the security decisions made by the access decision manager.' - name: getFirewall visibility: public parameters: [] comment: '# * Returns the configuration of the current firewall context.' - name: getListeners visibility: public parameters: [] comment: null - name: getAuthenticators visibility: public parameters: [] comment: null - name: getAuthProfileToken visibility: public parameters: [] comment: null - name: getDeauthProfileToken visibility: public parameters: [] comment: null - name: getName visibility: public parameters: [] comment: null traits: - Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener - Symfony\Bundle\SecurityBundle\Security\FirewallMap - Symfony\Component\HttpFoundation\Cookie - Symfony\Component\HttpFoundation\Request - Symfony\Component\HttpFoundation\Response - Symfony\Component\HttpKernel\DataCollector\DataCollector - Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface - Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface - Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken - Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface - Symfony\Component\Security\Core\Authorization\TraceableAccessDecisionManager - Symfony\Component\Security\Core\Authorization\Voter\TraceableVoter - Symfony\Component\Security\Core\Role\RoleHierarchyInterface - Symfony\Component\Security\Http\Firewall\SwitchUserListener - Symfony\Component\Security\Http\FirewallMapInterface - Symfony\Component\Security\Http\Logout\LogoutUrlGenerator - Symfony\Component\VarDumper\Caster\ClassStub - Symfony\Component\VarDumper\Cloner\Data interfaces: - LateDataCollectorInterface