2009-01-27 45 views
7

Tôi đang viết một ứng dụng web nhỏ trong Grails và tôi có câu hỏi sau đây về các phương pháp hay nhất cho thiết kế bộ điều khiển và sử dụng GORM:Bộ điều khiển trong Grails

Tôi đang lưu đối tượng người dùng trong session.user. Hiện nay tất cả các phương pháp hành động của tôi bắt đầu với đoạn mã sau để đảm bảo người dùng hợp lệ được đăng nhập và đối tượng người dùng là tươi:

class FooController { 
    def actionMethodThatRequiresAValidUser = { 
    if (!session?.user) { 
     redirect(controller: "authentication", action: "login") 
    } 
    session.user.refresh() 
    ... 
    /* do stuff */ 
    ... 
    } 
} 

Có phải đó là thực hành tốt nhất? Nó có thể được thực hiện một cách tốt hơn và/hoặc ngắn gọn hơn không?

Trả lời

9

Sử dụng filter, theo cách đó bạn có thể đặt cùng một mã lặp lại đó trong bộ lọc và giữ bộ điều khiển tập trung vào hành động thực.

+0

Không lọc giới thiệu mã "ẩn" không rõ ràng ngay lập tức cho nhà phát triển mà sau này đọc mã? –

1

Tôi đồng ý với các đề xuất bộ lọc mà người khác đã thực hiện. Nếu điều đó không làm việc cho bạn, bạn có thể xác định một beforeInterceptor trên bộ điều khiển của bạn để giảm thiểu một số trùng lặp là tốt.

3

Tôi nghĩ rằng việc sử dụng beforeInterceptor là phù hợp.Và hãy xem xét điều này JSecurity plugin. Cho plugin xác thực người dùng jsecurity rất hữu ích.

1

Có nhiều cách tiếp cận Better là bộ lọc sử dụng (trước đó) và đặt if (phiên .user!?) { chuyển hướng (điều khiển: "xác thực", hành động: "login") } mã này trong bộ lọc.

điều thứ hai bạn có thể sử dụng plugin bảo mật mùa xuân để bạn không phải lo lắng về phiên người dùng, nó sẽ tự động kiểm soát nó. thấy http://blog.springsource.org/2010/08/11/simplified-spring-security-with-grails/ để biết thêm thông tin về plugin

0

Sử dụng Spring Security Core .... đồ Vai trò của tập quán (Thành viên) trong hệ thống .. Cấu hình tương tự khi cài đặt Plugin ... và không quên tạo người dùng quản trị về bootstrap ...

+0

Câu hỏi có liên quan đến thực tiễn tốt nhất hoặc thực hiện nó theo cách tốt hơn. Xin vui lòng giải thích lý do tại sao nó là một cách thực hành tốt nhất/cách tốt hơn vì sử dụng 'Spring Security Core' – kgdesouz

+0

Dưới đây là một số lợi thế mà tôi có thể nghĩ đến: Top 1. Sử dụng Spring Security cho chúng ta khả năng kiểm tra tốt mã để quản lý bảo mật. 2. Chúng ta có lớp springSecurityService có nhiều phương thức hữu ích bao gồm getCurrentUser(). Do đó, chúng ta không cần phải làm điều đó. –

0

Nếu bạn không tìm kiếm một câu trả lời hoàn toàn an toàn, như xuân an Core, bạn có thể sử dụng mã này từ tài liệu grails như một bộ lọc:

class SecurityFilters { 
    def filters = { 
     loginCheck(controller:'*', action:'*') { 
      before = { 
       if(!session.user && !actionName.equals('login')) { 
        redirect(action:'login') 
        return false 
       } 
      } 
     } 
    } 
} 
0

Tôi bảo mật mùa xuân thứ hai. Bạn đang cố gắng phát minh lại bánh xe ở đây. Tất cả điều này đã được thực hiện cho bạn và nhiều hơn nữa.

1

Hãy xem Spring Security Core Plugin là một khung làm giàu cho mục đích bảo mật. Bạn có thể sử dụng phương thức springSecurityService.isLoggedin() sau khi tiêm khuôn khổ, nhưng khung công tác cung cấp cho nhiều quyền truy cập tốt hơn và các điều khiển đặc quyền cũng tránh được nhu cầu về bản mẫu.

+0

Tôi tin rằng bạn có một câu trả lời hay. Hãy xem xét phát triển nó bằng cách có thêm bình luận và tham khảo hỗ trợ. – SQLMason

1
import grails.plugins.springsecurity.Secured 

@Secured ([ 'ROLE_ADMIN', 'ROLE_SUB_ADMIN', 'ROLE_USER'])

lớp DashboardController {

def tạo() {

[bankInstance: new Bank(params)] 

} 

def save() { 
    def bankInstance = new Bank(params) 
    if (!bankInstance.save(flush: true)) { 
     render(view: "create", model: [bankInstance: bankInstance]) 
     return 
    } 

    flash.message = message(code: 'default.created.message', args: [message(code: 'bank.label', default: 'Bank'), bankInstance.id]) 
    redirect(action: "show", id: bankInstance.id) 
} 
Các vấn đề liên quan