1. Trang chủ
  2. » Công Nghệ Thông Tin

Làm chủ Grails: Chứng thực và phân quyền ppsx

31 299 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Làm chủ Grails: Chứng thực và phân quyền Đảm bảo an ninh cho các ứng dụng Grails của bạn Scott Davis , Tổng Biên tập, AboutGroovy.com Tóm tắt: Grails cung cấp tất cả các khối xây dựng cơ bản bạn cần để lắp ghép thành một ứng dụng Web an toàn, các khối này được sắp xếp từ mức thẩm định quyền đơn giản thông qua cơ chế đăng nhập đến việc phân quyền dựa trên vai trò, và trong phần Làm chủ Grails, Scott Davis cung cấp cho bạn những bài học thực hành về đảm bảo an ninh cho ứng dụng Grails của bạn. Bạn cũng sẽ được học về các trình gắn vào (plug-in) sao cho bạn có thể mở rộng khả năng đảm bảo an ninh cho ứng dụng của bạn theo nhiều hướng mới. Trong bài viết này, tôi tiếp tục việc xây dựng một "blog siêu nhỏ" có tên là Blogito. Tôi đã sử dụng lại các Users trong bài viết trước (" Rewiring Grails with custom URIs and codecs") bởi vì trường name là một phần của URI đầy đủ. Đã đến lúc thực thi hệ thống con User đầy đủ. Bạn sẽ học cách để tạo cơ chế đăng nhập, hạn chế hoạt động của người dùng dựa vào việc User có đăng nhập hay không, và thậm chí thêm vào một số quyền dựa trên vai trò của User. Để bắt đầu, người sử dụng cần có một cách đăng nhập vào blog sao cho họ có thể bổ sung các entry mới. Việc thẩm định quyền Việc thẩm định quyền có lẽ là một ý tưởng tốt đối với các máy chủ blog hỗ trợ nhiều người dùng. Dĩ nhiên là bạn không muốn một người dùng có tên là John Doe lại tình cờ bổ sung các entry lên blog hệt như người dùng tên Jane Smith. Việc thiết lập cơ sở cho việc thẩm định quyền là trả lời câu hỏi: "Bạn là ai?". Ngay sau đó, bạn sẽ có thêm một chút quyền nữa, và nó trả lời cho câu hỏi: "Bạn được phép làm gì?" Ví dụ 1 biểu diễn một tệp grails-app/domain/User.groovy mà bạn đã tạo ra vào lần trước: Ví dụ 1. Lớp User class User { static constraints = { login(unique:true) password(password:true) name() } static hasMany = [entries:Entry] String login String password String name String toString(){ name } } Các trường login và password đã được đặt đúng vị trí. Tất cả những gì bạn cần là cung cấp một điều khiển (controller) và một mẫu biểu (form). Hãy tạo ra tệp grails-app/controllers/UserController.groovy và thêm vào đoạn mã, như trong ví dụ 2: Ví dụ 2. Thêm xác thực quyền login , và logout cho điều khiển UserController class UserController { def scaffold = User def login = {} def authenticate = { def user = User.findByLoginAndPassword(params.login, params.password) if(user){ session.user = user flash.message = "Hello ${user.name}!" redirect(controller:"entry", action:"list") }else{ flash.message = "Sorry, ${params.login}. Please try again." redirect(action:"login") } } def logout = { flash.message = "Goodbye ${session.user.name}" session.user = null redirect(controller:"entry", action:"list") } } Một lệnh login rỗng đơn giản sẽ kết thúc ngay sau khi được gọi. Có nghĩa là việc viếng thăm trang http://localhost:9090/blogito/user/login bằng trình duyệt sẽ trả về tệp grails-app/views/user/login.gsp. (Bạn sẽ tạo ra tệp đó ngay lập tức.) Việc kết thúc authenticate sử dụng một phương thức GORM thuận tiện — findByLoginAndPassword() — để tìm ra thông tin kiểu như: tìm User trong cơ sở dữ liệu, mà giá trị login và password khớp với giá trị được đưa vào trong các trường này ở trên mẫu biểu và làm cho chúng khả dụng thông qua ánh xạ băm params. Nếu User tồn tại, thêm nó vào một phiên làm việc (session). Ngược lại, quay lại mẫu biểu đăng nhập và cho User một cơ hội khác để cung cấp thông tin xác thực đúng. Lệnh đăng xuất logout đưa ra lời chào tạm biệt User, xóa thông tin về người sử dụng trong phiên làm việc và sau đó chuyển đến hành động list trong EntryController. Đã đến lúc bạn tạo ra tệp login.gsp rồi. Bạn có thể gõ lại đoạn mã trong ví dụ 3 hoặc bạn có thể: 1. Gõ grails generate-views User tại cửa sổ dòng lệnh (command line). 2. Sao chép tệp create.gsp vào tệp login.gsp. 3. Sửa đi một chút để có mã kết quả. Ví dụ 3. login.gsp <html> <head> <meta name="layout" content="main" /> <title>Login</title> </head> <body> <div class="body"> <h1>Login</h1> <g:if test="${flash.message}"> <div class="message">${flash.message}</div> </g:if> <g:form action="authenticate" method="post" > <div class="dialog"> <table> <tbody> <tr class="prop"> <td class="name"> <label for="login">Login:</label> </td> <td> <input type="text" id="login" name="login"/> </td> </tr> <tr class="prop"> <td class="name"> <label for="password">Password:</label> </td> <td> <input type="password" id="password" name="password"/> </td> </tr> </tbody> </table> </div> <div class="buttons"> <span class="button"> <input class="save" type="submit" value="Login" /> </span> </div> </g:form> </div> </body> </html> Chú ý rằng action của mẫu biểu là authenticate, nó so khớp tên của bao đóng trong UserController.groovy. Các tên trong các thành phần nhập liệu — login và password — phù hợp với các tham số params.login và params.password trong bao đóng authenticate. Gõ grails run-app và thực hiện việc thẩm định quyền của bạn lặp lại vài lần. Thử đăng nhập với tên người dùng là jsmith và password là foo. (Nhớ rằng trong " Rewiring Grails with custom URIs and codecs (Mắc nối các Grail với các URI tùy chỉnh và các bộ mã hóa/giải mã)" bạn đã khởi tạo Blogito với một cặp người dùng trong grails-app/conf/BootStrap.groovy.) Việc đăng nhập của bạn bị lỗi, như trong hình 1: Hình 1. Thông báo lỗi đăng nhập Thử lại với tên đăng nhập jsmith và password là wordpass. Lần này việc đăng nhập đã thành công. Nếu thông báo chào mừng không xuất hiện trong grails-app/views/entry/list.gsp — thì đơn giản là bạn hãy — sao chép khối <g:if test="${flash.message}"> từ tệp login.gsp và dán vào đầu tệp list.gsp. Đăng nhập lại với tên jsmith để kiểm chứng rằng thông báo xuất hiện giống như trong hình 2: Hình 2. Một thông báo động xác thực việc đăng nhập thành công Đến đây bạn chắc chắn rằng quyền hạn của mình đã được thực thi, bạn nên tạo ra một thẻ TagLib sao cho việc đăng nhập và đăng xuất được dễ dàng. Việc tạo ra một quyền hạn TagLib [...]... nguyên.) Khởi động lại Grails và kiểm tra beforeInterceptor Thử vào trang http://localhost:9090/blogito/entry/create mà không đăng nhập Bạn sẽ bị chuyển đến trang đăng nhập Hãy đăng nhập vào trang với tên jsmith và thử lại Lần này bạn có thể tạo thành công một Entry mới Sự phân quyền mịn Sự phân quyền thô được đề xuất bởi beforeInterceptor mới chỉ là một sự khởi đầu cho việc phân quyền, nhưng bạn cũng có... cắm vào Lightweight Directory Access (LDAP - Giao thức truy cập thư mục đơn giản) cũng đưa ra cách tiếp cận tương tự, cho phép các ứng dụng Grails thúc đẩy cơ sở hạ tầng LDAP mà bạn đã có Sự thẩm định quyền và các trình gắn vào OpenID giới hạn chính bản thân nó vào câu chuyện thẩm định quyền Các giải pháp thẩm định khác cũng đề xuất các giải pháp phân quyền Trình cắm vào JSecurity đưa toàn bộ khung làm. .. phức tạp khác trong mẫu biểu thực hiện phân quyền Việc thêm những vai trò đơn giản cho User cho phép bạn hạn chế việc quản lý người dùng truy cập vào khu vực quản trị Sau khi đã có một blog Blogito an toàn rồi, bài viết tiếp theo về Làm chủ Grails có thể tập trung vào những nhiệm vụ chính sắp tới — đó là việc cung cấp cách thức để xác thực những người dùng được quyền tải tệp và cách những người sử dụng... thuê bao một kênh thông tin Atom Với sự hỗ trợ này, Blogito sẽ thực sự trở thành một ứng dụng blog Đến khi đó, hãy vui với việc làm chủ Grails Mục lục  Việc thẩm định quyền  Việc tạo ra một quyền hạn TagLib  Cơ bản về việc phân quyền  Sự phân quyền mịn  Việc thêm các vai trò  Chuyển blog lên mức tiếp theo bằng việc sử dụng trình gắn vào (plug-ins)  Kết luận ... khung làm việc bảo mật vào trong quá trình chạy, đề xuất các lớp miền soạn sẵn cho Users, Roles, và Permissions Trình cắm vào Spring Security thúc đẩy sự phát triển của các thư viện Spring Security (trước đây là Acegi Security), cho phép bạn sử dụng lại mã nguồn chương trình và tài liệu an ninh Spring Security mà bạn đã có Như bạn đã biết, có nhiều chiến lược xác thực và phân quyền có sẵn trong Grails... cắm vào để gửi một thông báo xác thực đến User và nói rằng, "Một tài khoản người dùng mới đã được tạo ra và sử dụng địa chỉ thư điện tử này Nhấn chuột vào liên kết để xác thực tài khoản mới của bạn." Trình cắm vào OpenID đưa ra một cách tiếp cận khác Thay vì bắt buộc người dùng cuối tạo ra một tổ hợp tên người dùng và mật khẩu mới mà họ chắc chắn sẽ bị quên, sự thẩm định quyền sẽ được ủy nhiệm cho nhà... trình gắn vào tại trang http://grails.org/plugin/list#security+tags cố gắng giải quyết các thách thức về việc thẩm định quyền và xác thực theo cách xử lý nhanh của grails install-plugin Ví dụ, trình cắm vào Authentication đề xuất một vài đặc tính hấp dẫn như: cho phép Users đăng ký một tài khoản thay vì bắt admin tạo ra tài khoản như một người được ủy quyền Bạn có thể cấu hình trình cắm vào để gửi... thành việc này, Grails đề xuất một phương thức chặn trước beforeInterceptor, cung cấp cho bạn một phương tiện hoàn hảo để thực hiện các hoạt động phân quyền trước khi bao đóng đích được gọi Thêm đoạn mã như trong ví dụ 7 vào điều khiển EntryController: Ví dụ 7 Thêm sự phân quyền vào điều khiển EntryController class EntryController { def beforeInterceptor = [action:this.&auth, except:["index", "list",... thể đẩy cách xử lý thường gặp vào trong một điều khiển chủ đơn và có thêm các điều khiển khác mở rộng nó khi cần bằng cách sử dụng các lớp Java Bạn có thể thêm một thứ nữa vào hạ tầng cơ sở thẩm định quyền để làm cho nó mạnh hơn: các vai trò Việc thêm các vai trò Việc gán một vai trò cho các Users là một cách thuận lợi để nhóm người dùng thành từng nhóm Bạn có thể gán quyền cho cả nhóm thay vì cho... việc phân quyền dựa trên vai trò, đăng nhập vào blog với tên jsmith và sau đó thử vào trang http://localhost:9090/blogito/user/create Bạn sẽ bị chuyển sang màn hình đăng nhập như trong hình 5: Hình 5 Việc chặn truy cập với tài khoản không có quyền người quản trị Bây giờ hãy đăng nhập như một admin Bạn có thể truy xuất đến tất cả các bao đóng Chuyển blog lên mức tiếp theo bằng việc sử dụng trình gắn vào . Làm chủ Grails: Chứng thực và phân quyền Đảm bảo an ninh cho các ứng dụng Grails của bạn Scott Davis , Tổng Biên. mới. Sự phân quyền mịn Sự phân quyền thô được đề xuất bởi beforeInterceptor mới chỉ là một sự khởi đầu cho việc phân quyền, nhưng bạn cũng có thể thêm các móc nối (hooks) phân quyền cho. từ mức thẩm định quyền đơn giản thông qua cơ chế đăng nhập đến việc phân quyền dựa trên vai trò, và trong phần Làm chủ Grails, Scott Davis cung cấp cho bạn những bài học thực hành về đảm bảo

Ngày đăng: 07/08/2014, 10:22

Xem thêm: Làm chủ Grails: Chứng thực và phân quyền ppsx

TỪ KHÓA LIÊN QUAN