Monday, June 11, 2012

Apache Wicket Auth/Roles 簡介 -- Authorization (2)

本文將延續前一篇的範例,將它的授權(authorization)應用到網頁中的某個元件,例如只有ADMIN才能看到某個Panel,其餘的使用者則無法看到!

在本文中我們會在網站中新增兩個頁面,這兩個頁面均是內部頁面(意即非bookmarkable),只是其中之一使用meta data進行授權,而另一頁則使用annotation授權。

所以,在首頁(HomePage.html)的地方,我們新增了兩個超連結,其中一個是AdminInternalPage.html(使用meta data授權);另一個是AdminInternalAnnotationPage.html(使用annotation授權):



            <div>
                <a href="#" wicket:id="adminBookmarkableLink">
                    前往bookmarkable AdminPage.html(使用metadata方式授權)
                </a>
                <br />
                <a href="#" wicket:id="adminInternalLink">
                    前往內部頁面AdminInternalPage.html(使用metadata方式授權)
                </a>
                <br />
            </div>
            <br />
            <div>
                <a href="#" wicket:id="adminAnnotBookmarkableLink">
                    前往bookmarkable AdminAnnotationPage.html(使用annotation方式授權)
                </a>
                <br />
                <a href="#" wicket:id="adminAnnotInternalLink">
                    前往內部頁面AdminInternalAnnotationPage.html(使用annotation方式授權)
                </a>
            </div>

接下來我們要修改HomePage.java的程式碼,以符合wicket的使用規則。

        //連到使用meta data授權方式的AdminPagelhtml
        add(new BookmarkablePageLink<Void>("adminBookmarkableLink", AdminPage.class));
        //連到使用meta data授權方式的AdminInternalPage.html
        add(new Link("adminInternalLink") {

            @Override
            public void onClick() {
                setResponsePage(new AdminInternalPage("foo"));
            }
        });
        //連到使用annotation授權方式的AdminAnnotationPagelhtml
        add(new BookmarkablePageLink<Void>("adminAnnotBookmarkableLink",
                AdminAnnotationPage.class));
        //連到使用annotation授權方式的AdminInternalAnnotationPagelhtml
        add(new Link("adminAnnotInternalLink") {

            @Override
            public void onClick() {
                setResponsePage(new AdminInternalAnnotationPage("bar"));
            }
        });

下一步,我們要建立AdminInternalPage.html及AdminInternalPage.java。


        <wicket:extend>
            歡迎光臨,你目前使用ADMIN角色登入,因此能看到此頁面!<br />
            本頁面使用meta data進行授權。
        </wicket:extend>

//AdminInternalPage.java

package com.myapp.wicket;

public final class AdminInternalPage extends BasePage {
    public AdminInternalPage(String dummy) {
    }
}


再來則是要建立AdminInternalAnnotationPage.html及AdminInternalAnnotationPage.java。


        <wicket:extend>
            歡迎光臨,你目前使用ADMIN角色登入,因此能看到此頁面!<br />
            本頁面使用meta data進行授權。
        </wicket:extend>


#AdminInternalAnnotationPage.java
package com.myapp.wicket;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;

@AuthorizeInstantiation("ADMIN")
public final class AdminInternalAnnotationPage extends BasePage {
    public AdminInternalAnnotationPage(String dummy) {
    }
}

最後則是在Appilcation.java,修改它的init()方法。

    @Override
    protected void init() {
        super.init();
        
        this.getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
        //註冊授權策略
        //使用角色授權策略
        getSecuritySettings().setAuthorizationStrategy(
                new RoleAuthorizationStrategy(new UserRolesAuthorizer()));
        //使用wicket metadata(html markup)的方式進行授權管理
        MetaDataRoleAuthorizationStrategy.authorize(AdminPage.class, "ADMIN");
        MetaDataRoleAuthorizationStrategy.authorize(AdminInternalPage.class, "ADMIN");
    }

No comments:

Post a Comment