你如何使用Wicket密码保护页面?

时间:2010-05-25 00:37:35

标签: wicket

我想用密码保护Wicket中的网页,以便用户只有在他/她登录后才能访问它。

我还希望页面显示登录页面,然后登录用户试图访问的原始页面。

这是如何用wicket完成的?我已经创建了一个登录页面并扩展了会话类。

1 个答案:

答案 0 :(得分:7)

框架提供的方法是为您的应用提供IAuthorizationStrategy实例,例如,通过添加到您的应用init()方法:

init() {
    ...
    getSecuritySettings().setAuthorizationStrategy(...)
}

Wicket授权功能的一个工作示例是Wicket Stuff here,它展示了一些相当复杂的东西。对于非常简单的案例,请查看SimplePageAuthorizationStrategy。在一个非常基础的层面上,这可以像这样使用(取自链接的Javadoc):

SimplePageAuthorizationStrategy authorizationStrategy = new SimplePageAuthorizationStrategy(
    MySecureWebPage.class, MySignInPage.class)
 {
        protected boolean isAuthorized()
        {
            // Authorize access based on user authentication in the session
            return (((MySession)Session.get()).isSignedIn());
        }
 };
 getSecuritySettings().setAuthorizationStrategy(authorizationStrategy);

编辑以回复评论

如果您只是使用SimplePageAuthorizationStrategy之类的东西而不是那个类本身,那么我认为这是最好的前进方式。我做了类似这样的事情来捕获用自定义注释注释的页面:

IAuthorizationStrategy authorizationStrategy = new AbstractPageAuthorizationStrategy()
 {
        protected boolean isPageAuthorized(java.lang.Class<Page.class> pageClass)
        {
            if (pageClass.getAnnotation(Protected.class) != null) {
                return (((MySession)Session.get()).isSignedIn());
            } else {
                return true;
            }
        }
 };

然后你需要注册IUnauthorizedComponentInstantiationListener类似于SimplePageAuthorizationStrategy中的内容(链接到源代码),这应该是这样的:

new IUnauthorizedComponentInstantiationListener()
{
    public void onUnauthorizedInstantiation(final Component component)
    {
    if (component instanceof Page)
    {
        throw new RestartResponseAtInterceptPageException(MySignInPage.class);
    }
    else
    {
        throw new UnauthorizedInstantiationException(component.getClass());
    }
    }
});