2011-09-05 59 views
5

Trong trò chơi của tôi! ứng dụng, tôi đã mã hóa các controllers.Security nhưtrang sau khi đăng nhập trong playframework

class Security extends controllers.Secure.Security { 
... 
    static void onDisconnected() {  
     Application.index(); 
    } 
    static void onAuthenticated() { 
     User user = User.find("byEmail",Security.connected()).first(); 
     if(user.isAdmin()) { 
     Admin.index(); 
     }else { 
      System.out.println("onAuthenticated()::user not admin"); 
    } 
} 

tôi đã thiết lập các tuyến đường như

GET  /admin/?    Admin.index 
*  /admin    module:crud 
GET /     Application.index 

Khi tôi đang trên một trang nói Trang X và nhấp vào liên kết đăng nhập, biểu mẫu đăng nhập xuất hiện và Tôi có thể đăng nhập. Nếu tôi đăng nhập với tư cách quản trị viên, nó sẽ đưa tôi đến Admin.index() và từ đó đến Admin/index.html view.So đến nay rất tốt

Nhưng, khi tôi ở trangX và nhấp trên liên kết đăng nhập, tôi hy vọng sẽ trở lại trangX.Instead, phương thức Application.index() được gọi và tôi được đưa đến Application.index.htm ml .. Đây có phải là hành vi mong đợi không? Tôi phải làm gì để truy cập trangX sau khi đăng nhập?

update:

tôi đã cố gắng lưu trữ các url trong flash sử dụng @Before trong bộ điều khiển an ninh

class Security extends controllers.Secure.Security { 
    @Before 
    static void storeCurrentUrl() { 
     System.out.println("storeCurrentUrl()"); 
     flash.put("url", "GET".equals(request.method) ? request.url : "/"); 
    } 
    static boolean authenticate(String username, String password) { 
    ... 
    } 

    static void onAuthenticated() { 
     ... 
     String url = flash.get("url"); 
     System.out.println("url="+url); 
     if(!user.isAdmin()) { 
     if(url!=null) { 
     System.out.println("url not null"); 
     redirect(url); 
    }else { 
     System.out.println("url null ..go to /"); 
     redirect("/"); 
    } 
     } 
    } 

Khi tôi đăng nhập, tôi nhận được những đầu ra thiết bị đầu cuối

url=null 
url null ..go to/
index() 

Tôi đã đưa các liên kết đăng nhập/đăng xuất trong mẫu main.html được tất cả các trang khác thừa kế

<div id="main"> 
    <div class="auth"> 
    <a href="@{Admin.index()}">Go to Admin Area</a><br/><br/> 
    <a href="@{Secure.login()}">Login</a><br/><br/> 
    <a href="@{Secure.logout()}">Log out</a> 
</div> 

Trả lời

7

Trong bạn điều khiển, trước khi gọi 'login()' đặt 'url' vào một cái gì đó đèn flash như:

flash.put("url", "GET".equals(request.method) ? request.url : "/"); 

Khi đăng nhập thành công trong, có được 'url' và chuyển hướng.

String url = flash.get("url"); 
redirect(url); //you may redirect to "/" if url is null 
+0

cảm ơn câu trả lời..tất cả khi tôi thử điều này, tôi nhận được url là null. Có vẻ như @Trước khi không được thực hiện.Tôi đã cập nhật câu hỏi..Xin vui lòng xem? –

+0

Để nhận được phương thức @Trước được gọi, nó phải là một phần của cùng một Bộ điều khiển trong đó hành động đến được xác định. Ở đây storeCurrentUrl() không nằm trong Controller mà hành vi login() được định nghĩa.Do đó storeCurrentUrl() sẽ không bao giờ được gọi. – sojin

+1

Trường hợp của bạn sẽ trở nên khó khăn một chút, vì Play là không trạng thái, nó không bao giờ lưu trữ url vào trang hiện tại của bạn (pageX) để được tham chiếu trong yêu cầu tiếp theo. Một cách có thể là (mặc dù tôi cảm thấy hơi đứt quãng), bạn có thể giữ url trang hiện tại trong nháy mắt bất cứ khi nào trang đó được phân phối, sao cho nó sẽ ở đó trong flash cho chuyển hướng khi yêu cầu tiếp theo (trên xác thực không thành công). – sojin

0

Đây sẽ là hành vi mong đợi vì đây là cách định tuyến của bạn được thiết lập. Nhấp vào đăng nhập và được chuyển hướng đến Application.index hoặc Admin.index nếu người dùng quản trị.

Nếu bạn muốn truy xuất trang mà bạn đã nhấp vào liên kết đăng nhập từ bạn có thể thêm hành động hiện tại vào liên kết đăng nhập và sau khi chuyển hướng được xác thực đến hành động này.

tức là. liên kết đăng nhập: GET /login?action=Application.something -> đưa bạn đến trang đăng nhập sau đó lưu hành động dưới dạng trường ẩn trong biểu mẫu đăng nhập của bạn. Khi bạn xác thực người dùng, hãy kết xuất hành động.

-2

Chơi đã làm chuyển hướng đến url ban đầu khi bạn cố gắng truy cập vào một trang được bảo vệ trong khi chưa đăng nhập.

Nếu bạn muốn sử dụng này, bạn ca đưa url của bạn trong phạm vi đèn flash trong phương pháp "onAuthenticated". Trong mã nguồn, hãy phát cuộc gọi "redirectToOriginalURL" ngay sau đó dựa trên giá trị của giá trị "url".

static void onAuthenticated() { 
    flash.put("url", "GET".equals(request.method) ? request.url : "/"); 
} 
+2

vào thời điểm bạn truy cập onAuthenticated(), request.url sẽ là login() form action :) – sojin

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