我想用密码保护Wicket中的网页,以便用户只有在他/她登录后才能访问它。
我还希望页面显示登录页面,然后登录用户试图访问的原始页面。
这是如何用wicket完成的?我已经创建了一个登录页面并扩展了会话类。
答案 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());
}
}
});