Làm thế nào để phát hiện nếu người dùng là Siêu người dùng?


20

Để xác định xem khách truy cập có phải là khách hay không , chúng tôi sử dụng một cái gì đó như thế này:

if ($user->guest) {
echo 'Hello, guest!';
}

Bây giờ, nếu tôi muốn xác định xem khách truy cập có phải là SuperUser (Quản trị viên) đã đăng ký hay không, thì mã đó sẽ là gì?

Tôi có một số tệp PHP bên ngoài mà bất kỳ ai cũng không muốn truy cập ngoại trừ SuperUsers của Trang web Joomla của tôi. Chỉ cần cố gắng bảo mật các tệp bằng cách nhập Joomla CMS.


1
Buồn cười tôi cần điều này tối qua và chỉ cần googled cho đến khi tôi tìm thấy một giải pháp. Trong trường hợp của tôi, tôi đã ghi đè đầu ra từ RSFiles để thanh công cụ chỉ hiển thị cho quản trị viên.
Brian Peat

1
Trên thực tế $ user-> get ('isRoot') trong câu trả lời được chấp nhận, không nên được sử dụng. Rất có thể trong các phiên bản Joomla mới nhất (3.6 trở lên), nó sẽ không hoạt động khi được gọi như thế này bên ngoài JUser :: Authorize (). Thay vào đó, hãy sử dụng $ user-> ủy quyền ('thông số của bạn tại đây'), như câu trả lời của dev-m.
FFrewin

Câu trả lời:


28

các mã này sẽ xác định xem người dùng đã đăng nhập hiện tại có phải là siêu người dùng hay không -

$user = JFactory::getUser();
$isroot = $user->authorise('core.admin');

mã đó sẽ kiểm tra những gì được ánh xạ tới quyền "Siêu người dùng" trong cấu hình toàn cầu và không chỉ ở cấp thành phần. Kiểm tra nó so sánh với các cách khác.


2
Giải thích trong câu trả lời này hơi yếu, nhưng tôi nghĩ core.adminlà một sự cho phép tốt hơn để kiểm tra hơn core.edit.
Brilliand

1
Tôi không đồng ý. core.admin là quyền sử dụng để kiểm soát quyền truy cập vào cấu hình toàn cầu, vì vậy đây là cách thích hợp để kiểm tra xem người dùng có phải là siêu quản trị viên hay không. Nếu bạn kiểm tra nhóm 8 như câu trả lời được chấp nhận, nếu Joomla! bao giờ quyết định chọn ngẫu nhiên nó vì mục đích bảo mật, tập lệnh của bạn sẽ bị hỏng. Luôn luôn mã với sự thay đổi trong tâm trí. Trừ khi bạn không bao giờ có ý định nâng cấp.
Mathew Lenning

Đây rõ ràng là trận đấu tốt nhất để kiểm tra SuperUser. Nó sẽ kiểm tra cả về sự không an toàn và sự cho phép của SuperUser. github.com/j Joomla / j 1.0 IsRoot có thể được sử dụng trực tiếp vì đây là tài sản được bảo vệ. github.com/j Joomla / j Joomla
Peter Wiseman

Chỉ cần xóa mọi nghi ngờ về việc liệu mã này có đúng hay không: mã này được sử dụng trong lõi của Joomla (Joomla 3.5.1) để kiểm tra xem người dùng có phải là siêu quản trị viên hay không. Bạn có thể tìm thấy nó trong dòng 747 của libraries/joomla/user/user.phptập tin. Đây là cái này:$iAmSuperAdmin = $my->authorise('core.admin');
itoctopus

8

Để xác định trạng thái "Siêu người dùng", bạn phải kiểm tra $user->isRoot. Thuộc tính này được đặt sau khi kiểm tra ủy quyền đầu tiên được thực hiện và người dùng được phát hiện là siêu quản trị viên.

Tuy nhiên, thông thường bạn thực sự muốn kiểm tra xem người dùng có các quyền nhất định như được mô tả trong các câu trả lời khác hay không.


3
Điều này giả sử $ user-> Authorize () đã được gọi bởi một thứ khác để điền vào thuộc tính isRoot. Cũng lưu ý rằng thuộc tính isRoot được bảo vệ nên cần được truy cập thông qua $ user-> get ('isRoot').
Peter Wiseman

6

Thử đi,

$user  = JFactory::getUser();

$user_groups = $user->groups;

print_r($user_groups);

Điều này sẽ trả về một mảng, theo mặc định người dùng Quản trị viên Joomla Siêu quản trị viên (Nhóm 8) và Quản trị viên (Nhóm 7).

Bạn có thể kiểm tra mảng có bất kỳ giá trị nào trong số này không thì đó phải là người dùng Quản trị viên, Nếu bạn đã tạo nhóm Người dùng tùy chỉnh thì bạn cũng phải kiểm tra #__usergroups parent Id.

Hy vọng nó giúp..


6

Bạn có thể sử dụng một điều kiện để từ chối bất kỳ ai không thuộc một nhóm cụ thể.

$user = JFactory::getUser();
$groups = $user->groups;

if (in_array(8, $groups)):

 //only enter if the user is in the group 8 (group 8 = Super-Administrator)

endif;

1
Số ma thuật không phải là một giải pháp tuyệt vời. Bạn có thể cấp quyền Super Admin cho bất kỳ nhóm nào và / hoặc xóa nhóm Super Admin mặc định.
David Hayes

Tôi đã sử dụng một cái gì đó như if(in_array(8, $user->groups))và nó làm việc cho tôi
Linga

4

Hãy thử mã bên dưới để kiểm tra xem người dùng đăng nhập là siêu quản trị viên hay người dùng khác ...

$user = JFactory::getUser();
$isAdmin = $user->get('isRoot');
if ($isAdmin) {
echo 'You are an Administrator';
}
else  {
echo 'You are not Administrator';
}

OR

function isSuperAdmin()
{
  $user = JFactory::getUser();
  return $user->get('isRoot');
}    

if (isSuperAdmin()) 
{
  echo 'You are an Administrator';
}
else  {
  echo 'You are not Administrator';
}

1
Trên thực tế $ user-> get ('isRoot') không nên được sử dụng. Rất có thể trong các phiên bản Joomla mới nhất (3.6 trở lên), nó sẽ không hoạt động khi được gọi như thế này bên ngoài JUser :: Authorize (). Thay vào đó, hãy sử dụng $ user-> ủy quyền ('thông số của bạn tại đây'), như câu trả lời của dev-m.
FFrewin

Tôi sẽ kiểm tra nó trước, cảm ơn vì đã chỉ ra. :)
saibbyweb

1
$user->get('isRoot');không hoạt động cho J3.6.2.
saibbyweb

2

Joomla @since 3.2, trường UsergroupList sử dụng điều này để kiểm tra:

$isSuperUser = JFactory::getUser()->authorise('core.admin');

Câu trả lời này rất giống với câu trả lời của @ dev-m .
Farahmand

@Farahmand bạn nói đúng, tôi vừa thêm vào để xác nhận phương thức ưa thích của Joomla là gì và nó vẫn còn hiệu lực cho phiên bản Joomla 3+
Pedro Bicudo Maschio

Đuợc. Dù sao, câu hỏi đã được gắn thẻ j Joomla-3.x .
Farahmand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.