2013-01-02 29 views
12

Tôi có một ứng dụng web sử dụng Shiro để xác thực. Các bộ phận có liên quan của web.xml và shiro.ini là:Làm thế nào tôi có thể chuyển hướng các yêu cầu đến một cấu hình đăng nhập ShiroUrl nếu người dùng đã được xác thực?

<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

[main] 
authc.loginUrl = /authoring/login.html 
authc.successUrl = /authoring 
logout.redirectUrl = /authoring/login.html 

[users] 
foo = foo 

[urls] 
/authoring/logout = logout 
/authoring/** = authc 

Shiro chặn một cách chính xác tất cả các yêu cầu từ khách hàng không xác thực và chuyển hướng đến các loginUrl cấu hình (và sau đó chuyển tiếp cho họ trên trang được yêu cầu sau khi xác thực thành công). Điều tôi muốn xảy ra là, nếu một khách hàng được xác thực thực hiện yêu cầu rõ ràng tới /authoring/login.html, hãy chuyển hướng đến/authoring. Điều này sẽ CHỈ xảy ra nếu khách hàng được xác thực.

Ví dụ: suy nghĩ về cách Gmail hoạt động - cố truy cập mail.google.com (hoặc thậm chí https://accounts.google.com/ServiceLogin) khi bạn đã đăng nhập chuyển hướng bạn đến hộp thư đến. Điều này có thể với Shiro ra khỏi hộp? Nếu không, cách thích hợp để thực hiện nó là gì?

Trả lời

1

Bạn có thể xử lý các đăng nhập yêu cầu cho bản thân hoặc sử dụng khuôn khổ của bạn, bạn sẽ cần phải thay đổi shiro.ini của bạn để sử dụng một PassThruAuthenticationFilter

authc = org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter 

Bây giờ bạn có thể kiểm tra nếu người dùng đang đăng nhập và chuyển hướng nếu đúng:

Subject currentUser = SecurityUtils.getSubject(); 
if(currentUser.isAuthenticated()){ 
    //redirect 
}else{ 
    AuthenticationToken token = new UsernamePasswordToken(username, password); 
    currentUser.login(token); 
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml"); 
} 

Đây không phải là giải pháp hoàn toàn ngoài hộp. Tôi không chắc chắn liệu bạn có thể nhận được url thành công bên ngoài xác thực hay không, bạn có thể chuyển hướng thủ công tới WebUtils.issueRedirect(req, resp, url)

+0

Bạn có đề xuất mở rộng PassThruAuthenticationFilter và sau đó đặt mã đó bằng phương pháp ghi đè không? Nếu vậy phương pháp nào - tôi dường như không thể tìm ra phương pháp phù hợp. Hay bạn đang nói rằng mã phải ở trong một bộ điều khiển? Chúng tôi hiện không có bộ điều khiển đăng nhập và tôi đang cố gắng tìm hiểu cách sử dụng đề xuất của bạn. – alan

+0

Không, tôi khuyên bạn nên đặt mã đó vào bất cứ thứ gì phục vụ trang đăng nhập của bạn. Tôi sử dụng jsf để mã đi bên trong phương thức đăng nhập của tôi trong bean Backing của tôi –

+0

Bạn có thể mở rộng bộ lọc mặc định 'org.apache.shiro.web.filter.authc.FormAuthenticationFilter' để làm những gì bạn muốn, có thể bạn sẽ có quyền truy cập vào url thành công từ đây –

1

Tôi gặp phải vấn đề tương tự và làm việc xung quanh nó bằng cách chuyển trang đăng nhập thành JSP và thêm chuyển hướng ngay từ đầu:

<% 
    if (SecurityUtils.getSubject().isAuthenticated()) { 
     response.sendRedirect(request.getContextPath()); 
    } 
%> 
Các vấn đề liên quan