2012-04-17 36 views
11

Tôi đã làm theo công thức 'Cách tải Người dùng An ninh từ Cơ sở dữ liệu (Nhà cung cấp Thực thể)' từ sách nấu ăn của Symfony2 (http://symfony.com /doc/current/cookbook/security/entity_provider.html), ngoại trừ tôi không sử dụng Nhà cung cấp thực thể tùy chỉnh - điều đó có nghĩa là lớp người dùng của tôi đang sử dụng tải chậm cho các vai trò.Vai trò/nhóm Symfony2 - is_granted không phát hiện vai trò người dùng có

Tường lửa/kiểm soát truy cập trong bảo mật đều hoạt động tốt. Tôi có một số tuyến đường mà chỉ người dùng ROLE_ADMIN mới có thể truy cập và một số người dùng ROLE_USER có thể truy cập - những công việc này tốt.

Vấn đề là trong mẫu cơ sở của tôi, tôi có một thanh sẽ được hiển thị như:

<p>Logged in as: {{ app.user.username }} {% if is_granted('ROLE_ADMIN') %}| <a href="{{ path('bassettprovidentia_skeleton_admindashboard') }}">Admin area</a> {% endif %}| <a href="#">Settings</a> | <a href="{{ path('bassettprovidentia_skeleton_logout') }}">Log out</a></p> 

Mặc dù người dùng của tôi có vai trò ROLE_ADMIN trong cơ sở dữ liệu (và có thể truy cập các URL bị hạn chế đó vai trò), liên kết "Khu vực quản trị" không được hiển thị!

Trong hình thức tương tự, tôi có điều này:

<p>Roles: {% for role in app.user.roles %}{{ role.name }} [{{ role.role }}]{% if not loop.last %}, {% endif %}{% endfor %}</p> 

Nó hoạt động tốt! Tất cả các vai trò mà người dùng đã được hiển thị!

Tôi đang làm gì sai?

Việc lười biếng có đáng trách không?

Nó không gây ra sự cố ở nơi khác.

+1

Vậy điều gì sẽ xảy ra khi bạn háo hức tải vai trò trong nhà cung cấp dịch vụ của mình? – Cerad

Trả lời

18

OK - Tôi đã tìm thấy câu trả lời. Tôi không thể tin được nó hiển nhiên như thế nào.

Vai trò người dùng được lấy từ đối tượng app.user (tức là đoạn thứ hai) rõ ràng được lấy từ cơ sở dữ liệu và khi tôi yêu cầu chúng.

Cuộc gọi is_granted() rõ ràng sử dụng phiên để xem vai trò của người dùng. Tôi đã chơi đùa và thay đổi vai trò trong khi quên đăng xuất và đăng nhập lại - không có gì lạ khi một số vai diễn không được hiển thị.

Sau khi đăng nhập và đăng xuất và chơi với các vai trò khác nhau, tôi có thể xác nhận rằng tất cả đều hoạt động tốt.

Nếu tôi không nghỉ ngơi và quay lại sáng nay, tôi có thể đã theo đuổi bản thân mình trong vòng kết nối hàng giờ; có một bài học để được học ở đó.

+0

Bạn đã lưu ngày của tôi, cảm ơn bạn! – Moonchild

+0

Lưu ý rằng thao tác này tương tự với điều khiển truy cập và tường lửa trong cấu hình và bên trong bộ điều khiển. –

+0

Cảm ơn người đàn ông! Vấn đề này là quá ngu ngốc để trung thực, và tôi không thể tìm ra lý do tại sao nó xảy ra trong 30 phút ... – Cowwando

Các vấn đề liên quan