2017-08-28 20 views
5

Tôi có một ứng dụng nút có thư viện hộ chiếu. Tôi sử dụng chiến lược hộ chiếu như thế này:Hộ chiếu - ghi đè chiến lược động

passport.use(someStrategy) 

Có thể tự động ghi đè chiến lược đó sau này không? Trong khi chạy ứng dụng, tôi muốn sử dụng một chiến lược khác. Trên thực tế cùng một chiến lược, nhưng với một cấu hình khác nhau.

Nếu tôi chỉ cần tạo hộ chiếu khác.use (someOtherStrategy), thì không phải chỉ cần thêm một 'middleware' khác vào hộ chiếu? Sau đó, điều đó sẽ không xóa cái cũ, chỉ cần thêm một cái nữa. Tôi muốn cái cũ bị xóa. Vì vậy, ghi đè hoặc xóa và thêm một hình mới.

Trả lời

0

Đào trong mã nguồn hộ chiếu tiết lộ rằng việc ghi đè có thể được thực hiện dễ dàng. Dưới đây là phần có liên quan của mã:

Authenticator.prototype.use = function(name, strategy) { 
    if (!strategy) { 
    strategy = name; 
    name = strategy.name; 
    } 
    if (!name) { throw new Error('Authentication strategies must have a name'); } 

    this._strategies[name] = strategy; 
    return this; 
}; 
... 
... 
Authenticator.prototype.unuse = function(name) { 
    delete this._strategies[name]; 
    return this; 
}; 

Như có thể thấy từ mã, nếu chiến lược mà bạn sử dụng có một cái tên đã được sử dụng bởi một chiến lược khác trong danh sách _strategies, sau đó nó được thay thế theo chiến lược mới. Ngoài ra người ta có thể xóa các chiến lược với phương pháp không sử dụng, như đã thấy trong các mã cũng.

@Mitch Câu trả lời của bạn rất hữu ích, nhưng rất ít chủ đề. Có lẽ một phần vì tôi không siêu rõ ràng rằng tôi đang tìm kiếm một cách để ghi đè lên một chiến lược hiện có, không chỉ cách cấu hình nhiều chiến lược. Xin lỗi, tôi không rõ ràng trong mô tả câu hỏi của tôi.

0

Có thể định cấu hình nhiều chiến lược có tên trong hộ chiếu, thậm chí cùng loại. Dưới đây tôi có thể có hai trường hợp của myStrategy với configs khác nhau, nhưng đặt tên khác nhau,

Ví dụ:

passport.use('someStrategy', new myStrategy(options)) 
passport.use('anotherStrategy', new myStrategy(differentOptions)); 

Rồi sau đó, khi chứng thực bạn có thể xác định những chiến lược để sử dụng:

passport.authenticate('someStrategy', ...); 

Sử dụng ở trên, bạn có thể định cấu hình nhiều chiến lược và dựa trên điều kiện, quyết định nên sử dụng chiến lược nào:

if (condition){ 
    passport.authenticate('someStrategy', ...); 
} 
else{ 
    passport.authenticate('anotherStrategy', ...); 
} 

Hoặc:

let strategyToUse = determineStrategy(); //dynamically choose which strategy you want 
passport.authenticate(strategyToUse, ...); 

Xóa chiến lược từ trung ngăn xếp là một phức tạp hơn chút và không có chức năng sẵn có để làm điều đó tôi không nghĩ vậy. Nó có thể liên quan đến việc nối chiến lược ra khỏi ngăn xếp theo cách thủ công. This câu hỏi có thể giúp bạn loại bỏ phần mềm trung gian khỏi ngăn xếp; mục đích của nó hướng tới thể hiện/kết nối như vậy cũng nên áp dụng cho hộ chiếu ở một mức độ nào đó.

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