2010-08-25 28 views
6

Tôi muốn ngăn người dùng bị cấm đăng nhập vào trang web và cung cấp cho họ thông báo rằng họ bị cấm. Tôi đã cố gắng sử dụng isAuthorized() cho điều này nhưng nó cho phép người dùng đăng nhập và chỉ sau đó từ chối anh ta cho phép các hành động trái phép. Vì vậy, về cơ bản tôi muốn biết nơi để đặt điều kiện sẽ kiểm tra xem bảng người dùng là bị cấm = true, trước khi quá trình đăng nhập diễn ra. Ngay bây giờ chức năng đăng nhập của tôi là trống rỗng vì nó đang được tự động kiểm soát bởi các thành phần Auth.CakePHP Auth Component Kiểm tra người dùng Trước khi đăng nhập

+0

Như @benjamin đã chỉ ra, có các chiến lược tự kiểm tra SIMPLE ... Đơn giản nhất, tại [controller] (http: //api.cakephp.org/file/Cake/Controller/Component/SessionComponent.php) hoặc * view_file.ctp *, là 'if ($ this-> Session-> check ('Auth.User')) doSomeThing()'. –

+0

Đối với những người ở đây tìm kiếm câu trả lời (giống như tôi), nếu bạn đang cố gắng sử dụng '$ components' trực tiếp thì tên khóa phải là' scope', không phải 'userScope'. Tất cả tín dụng cho câu trả lời của @Matthew bên dưới. –

Trả lời

12

Cuối cùng, tôi đã tìm thấy giải pháp bằng cách thực hiện API. Tôi tự hỏi liệu có ai đã từng sử dụng cái này không, không ai chỉ cho tôi điều này, hoặc có lẽ tôi không đủ rõ ràng. Dù sao, để thêm điều kiện vào quy trình đăng nhập bạn chỉ cần đặt nó vào biến $ this-> Auth-> userScope

Vì vậy, để kiểm tra xem người dùng có bị cấm hay không, tôi vừa thêm dòng này vào beforeFilter() trong AppController của tôi,

$this->Auth->userScope = array('User.banned'=>0); 

Hy vọng điều này sẽ giúp ai đó.

+1

Điều này thường được viết là '$ this-> Auth-> userScope = array ('User.active' => 1); ' –

+0

ya one và điều tương tự ... nhưng ít nhất tôi biết bây giờ đặt các điều kiện này ở đâu :) –

+0

Làm cách nào để bạn phân biệt giữa "Thông tin đăng nhập không chính xác" và "Người dùng bị cấm" nếu bạn sử dụng cách này? –

3

Nếu bạn có toàn bộ hệ thống Auth đã được thiết lập và đang chạy, tại sao bạn không thực hiện theo nguyên tắc KISS và thu hồi mật khẩu hoặc thay đổi tên người dùng? Nếu họ không còn có thể xác thực với hệ thống của bạn như họ có thể trước đó họ sẽ có thể suy luận rằng họ bị cấm.

Nếu điều đó không đủ, thì bạn cũng có thể thêm mã bên dưới.

function login() { 
    if ($this->Session->read('Auth.User')) { 
    $this->Session->setFlash('You are alreadylogged in!~~~~~~~~~~~'); 
    } 
    $this->Session->setFlash('You have been banned!');  
    $this->redirect(array('controller'=>'users','action'=>'index')); 
} 

Sửa 1: Đối với một động hơn tiếp cận như bạn đã chỉ ra trong bình luận của bạn, bạn có thể kiểm tra cột is_banned của hồ sơ người dùng dưới lo lắng UsersController::beforeFilter() của bạn và thiết lập tin nhắn nhấp nháy của bạn cho phù hợp. Cũng thực hiện chuyển hướng dựa trên kết quả của $this->Session->read('Auth.User.is_banned'). Có lẽ bạn muốn có một cái nhìn tại đầu ra của <?php debug $this->Session->read('Auth.User) ?> trước khi tấn công vấn đề của bạn.

Chỉnh sửa 2: Lỗi của tôi. Bạn có thể lưu trữ is_banned ở đâu đó trong phiên qua $this->Session->write(...). Sau khi bạn đọc is_banned = true, bạn có thể đăng xuất người dùng.

+0

cũng ... sẽ phức tạp vì tôi muốn quản trị viên có thể cấm và cũng bỏ cấm người dùng bất cứ khi nào cần phát sinh. việc thay đổi tên người dùng hoặc mật khẩu sẽ yêu cầu tôi lưu giữ hồ sơ nếu tôi muốn thay đổi nó về bản gốc. –

+0

@edit: tôi không chắc chắn làm thế nào mà sẽ làm việc ... nó thậm chí không kiểm tra nếu người dùng đã cấm lĩnh vực thiết lập để đúng sự thật. –

+0

Tôi bị nhầm lẫn bởi nhận xét cuối cùng của bạn. tôi chỉ cam kết và bình luận của bạn để chỉnh sửa của tôi đã được đặt ra? – benjamin

2

bạn phải sử dụng:

/** Function is executed after the login*/ 
function isAuthorized() { 
return true; 
} 

nơi bạn có thể kiểm tra nếu người dùng bị cấm hay không. tức là

/** Function is executed after the login*/ 
function isAuthorized() { 
if($this->Auth->user('banned') == 1){ //column banned should be in the users table 
     $this->Session->setFlash('You have been banned!');  
     return false; 
    } 
    return true; 
} 

Tôi tin rằng đây là cách chính xác.

+0

tốt, đây là cách tôi đang làm nó hiện tại, nhưng điều này cho phép người dùng đăng nhập và sau đó nói với anh ta rằng anh ta bị cấm. Tôi chỉ muốn biết nếu nó có thể được thực hiện trước khi đăng nhập anh ta. –

+1

Vâng, làm thế nào bạn có thể xác định rằng người dùng bị cấm nếu anh ta không được xác định :) Về cơ bản trong chức năng đó bạn phải chuyển hướng người dùng đến hành động đăng xuất (nếu anh ta bị cấm), vì vậy anh ta sẽ bị đăng xuất ngay lập tức sau khi trường bị cấm được chọn. –

+0

Khi đoạn mã của bạn phát ra âm thanh: +1 Trân trọng – benjamin

1

Sau khi đọc nhận xét cuối cùng của bạn về cách của Nik, tôi nghĩ rằng bạn có thể tinh chỉnh giải pháp ban đầu của mình bằng cách đăng nhập người dùng theo cách thủ công qua $ this-> Auth-> logout() tại vị trí thích hợp trong mã của bạn (theo sau một chuyển hướng). Bằng cách này, có vẻ như họ không bao giờ đăng nhập.

+0

bạn đã đúng ... đang nghĩ về cùng một dòng và tôi đoán đó là giải pháp dễ nhất cho việc này. cảm ơn tất cả các bạn. –

6

Ngoài ra để: $this->Auth->userScope = array('User.banned'=>0);

Điều này có thể được thực hiện khi bạn bao gồm phần Auth của bạn. Điều này có thể tiết kiệm một số lượng nhỏ trên không như $this->Auth->userScope không được gọi là mỗi khi một bộ điều khiển được phân tích cú pháp.

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array(
       'passwordHasher' => 'Blowfish', 
       'scope' => array('User.banned' => 0) 
      ) 
     ), 
     'authorize' => array('Controller') 
    ) 
); 
+0

Cảm ơn @Matthew, điều này đã thực sự giúp tôi rất nhiều khi tôi đang cố gắng sử dụng 'userScope' như một khóa mảng. –

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