274 lines
10 KiB
Twig
274 lines
10 KiB
Twig
{% extends '@WebProfiler/Profiler/layout.html.twig' %}
|
|
|
|
{% block page_title 'Security' %}
|
|
|
|
{% block toolbar %}
|
|
{% if collector.token %}
|
|
{% set is_authenticated = collector.enabled and collector.authenticated %}
|
|
{% set color_code = is_authenticated ? '' : 'yellow' %}
|
|
{% else %}
|
|
{% set color_code = collector.enabled ? 'red' : '' %}
|
|
{% endif %}
|
|
|
|
{% set icon %}
|
|
{{ include('@Security/Collector/icon.svg') }}
|
|
<span class="sf-toolbar-value">{{ collector.user|default('n/a') }}</span>
|
|
{% endset %}
|
|
|
|
{% set text %}
|
|
{% if collector.enabled %}
|
|
{% if collector.token %}
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Logged in as</b>
|
|
<span>{{ collector.user }}</span>
|
|
</div>
|
|
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Authenticated</b>
|
|
<span class="sf-toolbar-status sf-toolbar-status-{{ is_authenticated ? 'green' : 'red' }}">{{ is_authenticated ? 'Yes' : 'No' }}</span>
|
|
</div>
|
|
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Token class</b>
|
|
<span>{{ collector.tokenClass|abbr_class }}</span>
|
|
</div>
|
|
{% else %}
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Authenticated</b>
|
|
<span class="sf-toolbar-status sf-toolbar-status-red">No</span>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if collector.firewall %}
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Firewall name</b>
|
|
<span>{{ collector.firewall.name }}</span>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if collector.token and collector.logoutUrl %}
|
|
<div class="sf-toolbar-info-piece">
|
|
<b>Actions</b>
|
|
<span><a href="{{ collector.logoutUrl }}">Logout</a></span>
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<div class="sf-toolbar-info-piece">
|
|
<span>The security is disabled.</span>
|
|
</div>
|
|
{% endif %}
|
|
{% endset %}
|
|
|
|
{{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: profiler_url, status: color_code }) }}
|
|
{% endblock %}
|
|
|
|
{% block menu %}
|
|
<span class="label {{ not collector.enabled or not collector.token ? 'disabled' }}">
|
|
<span class="icon">{{ include('@Security/Collector/icon.svg') }}</span>
|
|
<strong>Security</strong>
|
|
</span>
|
|
{% endblock %}
|
|
|
|
{% block panel %}
|
|
<h2>Security Token</h2>
|
|
|
|
{% if collector.enabled %}
|
|
{% if collector.token %}
|
|
<div class="metrics">
|
|
<div class="metric">
|
|
<span class="value">{{ collector.user == 'anon.' ? 'Anonymous' : collector.user }}</span>
|
|
<span class="label">Username</span>
|
|
</div>
|
|
|
|
<div class="metric">
|
|
<span class="value">{{ include('@WebProfiler/Icon/' ~ (collector.authenticated ? 'yes' : 'no') ~ '.svg') }}</span>
|
|
<span class="label">Authenticated</span>
|
|
</div>
|
|
</div>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="key">Property</th>
|
|
<th scope="col">Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th>Roles</th>
|
|
<td>
|
|
{{ collector.roles is empty ? 'none' : profiler_dump(collector.roles, maxDepth=1) }}
|
|
|
|
{% if not collector.authenticated and collector.roles is empty %}
|
|
<p class="help">User is not authenticated probably because they have no roles.</p>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
|
|
{% if collector.supportsRoleHierarchy %}
|
|
<tr>
|
|
<th>Inherited Roles</th>
|
|
<td>{{ collector.inheritedRoles is empty ? 'none' : profiler_dump(collector.inheritedRoles, maxDepth=1) }}</td>
|
|
</tr>
|
|
{% endif %}
|
|
|
|
{% if collector.token %}
|
|
<tr>
|
|
<th>Token</th>
|
|
<td>{{ profiler_dump(collector.token) }}</td>
|
|
</tr>
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
{% elseif collector.enabled %}
|
|
<div class="empty">
|
|
<p>There is no security token.</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
|
|
<h2>Security Firewall</h2>
|
|
|
|
{% if collector.firewall %}
|
|
<div class="metrics">
|
|
<div class="metric">
|
|
<span class="value">{{ collector.firewall.name }}</span>
|
|
<span class="label">Name</span>
|
|
</div>
|
|
<div class="metric">
|
|
<span class="value">{{ include('@WebProfiler/Icon/' ~ (collector.firewall.security_enabled ? 'yes' : 'no') ~ '.svg') }}</span>
|
|
<span class="label">Security enabled</span>
|
|
</div>
|
|
<div class="metric">
|
|
<span class="value">{{ include('@WebProfiler/Icon/' ~ (collector.firewall.stateless ? 'yes' : 'no') ~ '.svg') }}</span>
|
|
<span class="label">Stateless</span>
|
|
</div>
|
|
<div class="metric">
|
|
<span class="value">{{ include('@WebProfiler/Icon/' ~ (collector.firewall.allows_anonymous ? 'yes' : 'no') ~ '.svg') }}</span>
|
|
<span class="label">Allows anonymous</span>
|
|
</div>
|
|
</div>
|
|
|
|
{% if collector.firewall.security_enabled %}
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="key">Key</th>
|
|
<th scope="col">Value</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th>provider</th>
|
|
<td>{{ collector.firewall.provider ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>context</th>
|
|
<td>{{ collector.firewall.context ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>entry_point</th>
|
|
<td>{{ collector.firewall.entry_point ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>user_checker</th>
|
|
<td>{{ collector.firewall.user_checker ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>access_denied_handler</th>
|
|
<td>{{ collector.firewall.access_denied_handler ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>access_denied_url</th>
|
|
<td>{{ collector.firewall.access_denied_url ?: '(none)' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>listeners</th>
|
|
<td>{{ collector.firewall.listeners is empty ? '(none)' : profiler_dump(collector.firewall.listeners, maxDepth=1) }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% elseif collector.enabled %}
|
|
<div class="empty">
|
|
<p>This request was not covered by any firewall.</p>
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<div class="empty">
|
|
<p>The security component is disabled.</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if collector.voters|default([]) is not empty %}
|
|
<h2>Security Voters <small>({{ collector.voters|length }})</small></h2>
|
|
|
|
<div class="metrics">
|
|
<div class="metric">
|
|
<span class="value">{{ collector.voterStrategy|default('unknown') }}</span>
|
|
<span class="label">Strategy</span>
|
|
</div>
|
|
</div>
|
|
|
|
<table class="voters">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Voter class</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
{% for voter in collector.voters %}
|
|
<tr>
|
|
<td class="font-normal text-small text-muted nowrap">{{ loop.index }}</td>
|
|
<td class="font-normal">{{ voter }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if collector.accessDecisionLog|default([]) is not empty %}
|
|
<h2>Access decision log</h2>
|
|
|
|
<table class="decision-log">
|
|
<col style="width: 30px">
|
|
<col style="width: 120px">
|
|
<col style="width: 25%">
|
|
<col style="width: 60%">
|
|
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Result</th>
|
|
<th>Attributes</th>
|
|
<th>Object</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
{% for decision in collector.accessDecisionLog %}
|
|
<tr>
|
|
<td class="font-normal text-small text-muted nowrap">{{ loop.index }}</td>
|
|
<td class="font-normal">
|
|
{{ decision.result
|
|
? '<span class="label status-success same-width">GRANTED</span>'
|
|
: '<span class="label status-error same-width">DENIED</span>'
|
|
}}
|
|
</td>
|
|
<td>
|
|
{% if decision.attributes|length == 1 %}
|
|
{{ decision.attributes|first }}
|
|
{% else %}
|
|
{{ profiler_dump(decision.attributes) }}
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ profiler_dump(decision.object) }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% endblock %}
|