摘要:添加驗證既然我們有一個管理面板,自然需要進行驗證。自定義驗證過程你可以用應用提供的實例來自定義驗證過程。通過繼承自該類,我們可以指定驗證用戶的方式。這個將給每個作者發布自己的文章的權限。現在在添加到控制器的鏈接接下來是創建模板。
添加驗證
既然我們有一個管理面板,自然需要進行驗證。幸運的是,Play已經提供了一個叫做Secure的模塊來幫助我們。
啟動Secure模塊在yabe/conf/application.conf啟動Secure模塊,然后重啟應用。
# 導入secure模塊 module.secure=${play.path}/modules/secure
在重啟后,Play應該提示說模塊已被加載。
Secure模塊提供一系列默認的路由。要導入這些路由,在/yabe/conf/routes加入:
# Import Secure routes * / module:secrue保護管理控制器
這個模塊提供了一個controllers.Secure控制器,它定義了所有所需的攔截器。當然我們可以繼承這個控制器,但是Java只支持單繼承,可能不可以這么做。
除了直接繼承Secure控制器,我們也可以給控制器加@With注解來告訴Play啟動對應的攔截器:
package controllers; import play.*; import play.mvc.*; @With(Secure.class) public class Posts extends CRUD { }
同樣處理Comments,Users和Tags控制器。
現在如果你想訪問管理面板,就會跳轉到登錄頁面。
不過,現在無論你往用戶/密碼框填什么,都會讓你通過。
自定義驗證過程你可以用應用提供的controllers.Secure.Security實例來自定義驗證過程。通過繼承自該類,我們可以指定驗證用戶的方式。
創建yabe/app/controllers/Security.java,并重載authenticata()方法:
package controllers; import models.*; public class Security extends Secure.Security { static boolean authenticate(String username, String password) { return true; } }
因為我們已經在模型層實現了User對象,驗證方法的實現就很簡單了:
static boolean authenticate(String username, String password) { return User.connect(username, password) != null; }
現在前往http://localhost:9000/logout登出,然后嘗試以initial-data.yml中的任意用戶登入,比如bob@gmail.com/secret。
重構管理面板我們通過CRUD模塊開啟了管理面板,但它跟博客的UI格格不入。所以我們還需要實現另一個管理面板。這個將給每個作者發布自己的文章的權限。當然,原來的管理面板還是可以留下來給超級管理員用。
讓我們創建一個Admin控制器:
package controllers; import play.*; import play.mvc.*; import java.util.*; import models.*; @With(Secure.class) public class Admin extends Controller { @Before static void setConnectedUser() { if(Security.isConnected()) { User user = User.find("byEmail", Security.connected()).first(); renderArgs.put("user", user.fullname); } } public static void index() { render(); } }
然后重構yabe/conf/routes里面的路由:
# Administration GET /admin/? Admin.index * /admin module:crud
記住路由文件中的順序是有確切含義的;排在前面的會比后面的優先匹配。所以Admin的路由要放在映射到CRUD模塊的路由的前面。否則,/admin/會被映射到CRUD.index而不是Admin.index。
現在在yabe/app/views/main.html添加到控制器的鏈接:
……
接下來是創建yabe/app/views/Admin/index.html模板。讓我們先從基礎開始:
Welcome ${user}!
現在,前往博客主頁,點擊“Log in to write something”鏈接,你應該到達新的管理面板:
好的開始!但因為管理面板將會有一系列新的頁面,我們需要定義一個父模板。創建yabe/app/views/admin.html:
Administration #{get "moreStyles" /}yabe. administration#{doLayout /}
如你所見,它像是前面用在博客引擎上的模板。這里替換了Log in鏈接成Log out,調用secure模塊提供的Secure控制器的logout action。
現在就把它用到yabe/app/views/Admin/index.html模板:
#{extends "admin.html" /} Welcome ${user}!
刷新!
嘗試下log out,它會讓你重新登錄:
我們是用secure模塊的默認方法來處理登出。不過自定義也是十分簡單的,重寫controllers.Security類中的onDisconnected()方法即可:
static void onDisconnected() {
Application.index();
}
你可以同樣重載onAuthenticated():
static void onAuthenticated() { Admin.index(); }添加身份
我們有兩個管理面板:一個用于編輯者,另一個用于管理員。如你曾見,User模型有一個isAdmin成員,表示一個用戶是否有管理員權限。
secure模塊不僅提供了authentication,還支持authorization。在secure模塊中,這叫做 profiles。要創建admin身份(profile),你僅需重寫controllers.Security中的 check()。
static boolean check(String profile) { if("admin".equals(profile)) { return User.find("byEmail", connected()).first().isAdmin; } return false; }
如果用戶具有管理員權限,我們可以提供一個管理員菜單。更新app/views/admin.html來添加頂級菜單:
… …
注意我們用#{secure.check /}標簽,只給admin用戶展示菜單。
但是我們的CRUD部分依然處于危險之中!如果用戶知道URL,他/她還是可以訪問它。我們必須保護這些控制器。最簡單的方法是使用@Check注解。舉個例子,對于Posts控制器:
package controllers; import play.*; import play.mvc.*; @Check("admin") @With(Secure.class) public class Posts extends CRUD { }
同樣處理Tags,Comments和Users控制器。現在作為普通用戶(比如``)登錄。你應該看不到CRUD管理員鏈接。如果試圖訪問http://localhost:9000/admin/u...,你會得到一個403 Forbidden響應。
自定義CRUD布局當我們使用基于CRUD的那個管理面板時,就無法使用管理布局了。因為CRUD模塊提供了自己的布局。不過當然我們可以重載掉它。使用Play命令:
play crud:ov --layout
你會得到一個/yabe/app/views/CRUD/layout.html。來把它的內容替換掉,集成我們的admin.html布局:
#{extends "admin.html" /} #{set "moreStyles"} #{/set}#{if flash.success}${flash.success}#{/if} #{if flash.error || error}${error ?: flash.error}#{/if}#{doLayout /}
如你所見,我們重用了crud.css并使用get/set模板變量機制來融合admin.html。現在看下CRUD模塊的管理面板,它應該跟管理布局結合在一起了:
美化登錄界面管理面板的界面大體上已經完成了。最后要做的,是美化登錄界面。如常,從自定義默認的css開始吧。
play secure:ov --css
要想維持原來的css,我們需要在頂部導入main.css。在yabe/public/stylesheets/secure.css頂部添加這一行:
@import url(main.css); …
加入這些到你的yabe/conf/messages文件來自定義登錄界面信息:
secure.username=Your email: secure.password=Your password: secure.signin=Log in now
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64096.html
摘要:設置驗證碼任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。 設置驗證碼 任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。 生成驗證碼 如何利用Play框架來生成驗證碼?簡單來說,我們需要增...
摘要:瀏覽和提交評論博客主頁現在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。刷新瀏覽器,檢查這次是否使用了正確的。給模板添加表單在后面試下提交新的評論。 瀏覽和提交評論 博客主頁現在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。 創建show action 要顯示文章內...
摘要:通過來實現一個基本的管理面板目前,我們還沒法使用博客的來寫新的文章,或修改評論。提供了一個即開即用的模塊,可以快速生成一個基本的管理面板。這是因為默認是以的輸出來得到一個模型對象的表示。在本教程的最后一章,你會學到關于本地化信息的更多東西。 通過CRUD來實現一個基本的管理面板 目前,我們還沒法使用博客的UI來寫新的文章,或修改評論。Play提供了一個即開即用的CRUD模塊,可以快速...
摘要:完成應用測試我們已經完成了我們想要創建的博客引擎。當然我們已經完成了測試所有模型層的功能。評估代碼覆蓋率當然我們還沒有完成應用所需的所有測試用例。如你所見,我們遠遠沒有完成對應用的全面測試。 完成應用測試 我們已經完成了我們想要創建的博客引擎。不過這個項目尚未完全結束。為了保證代碼的質量,我們需要添加更多的測試。 當然我們已經完成了測試所有模型層的功能。所以博客引擎的核心功能已經被...
摘要:確保你的文本編輯器已經做了相應的配置。第一個,會自動監測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現在應用日志中使用版本控制系統來追蹤變化當你開發一個項目時,最好使用版本控制系統來存儲你的源代碼。 Play是一個Java Web敏捷開發的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
閱讀 854·2021-11-19 11:29
閱讀 3349·2021-09-26 10:15
閱讀 2855·2021-09-22 10:02
閱讀 2433·2021-09-02 15:15
閱讀 1970·2019-08-30 15:56
閱讀 2408·2019-08-30 15:54
閱讀 2903·2019-08-29 16:59
閱讀 635·2019-08-29 16:20