如何在Wicket上使用Google App Engine安全性?

时间:2011-07-19 21:12:53

标签: security google-app-engine wicket

我正在开发一个Wicket GAE应用程序,一切看起来都很好。但我有一个问题,如何正确地将GAE的安全性与Wicket相结合?

我有两个与安全相关的用例:

  1. 允许经过身份验证的用户的页面:只有已登录的用户才能看到这些用户 - 其他用户必须重定向到Google的身份验证(并且在成功后,返回同一页面)
  2. 允许某些用户操作的页面:任何用户都可以看到该页面,但只有特殊用户才能运行操作(例如:任何人都可以阅读新闻,但只有特定帖子的作者可以编辑)。
  3. 第二个我猜我可以通过“隐藏”表格和/或行动(其他建议是受欢迎的)。第一个我找不到怎么做。

    GAE指示使用基于servlet的身份验证或某些API调用,通过返回链接重定向到Google的身份验证。我想这适用于Wicket的重定向,但不应该是401重定向吗?而且,更重要的是:如何测试它?

    如果我使用Wicket的安全性,如何定义用户可以访问的页面以及如何发送给Google的身份验证?

1 个答案:

答案 0 :(得分:0)

visural-wicket库的安全功能(完全披露 - 这是我的开源项目)可能允许您正在寻找的集成。

这篇博客文章解释了基本机制 -

http://www.richardnichols.net/2011/09/securing-wicket-with-visural-wicket/

您可以使用他们的UserService集成Google的安全性,以返回包含Google用户的IClient -

public class GoogleUser implements IClient<String> {
    private final User user;
    private final boolean admin;
    public GoogleUser(User user, boolean admin) {
        this.user = user;
    }    
    public String getId() {
        return user.getUserId();
    }
    public User getUser() {
        return user;
    }
    public boolean isAdmin() {
        return admin;
    }
}

public class MyApp extends Application {

    public void init() {
        // ...
        getSecuritySettings().setAuthorizationStrategy(new com.visural.wicket.security.AuthorizationStrategy(new IClientProvider() {
            public IClient getCurrentClient() {
                UserService s = UserServiceFactory.getUserService();
                return new GoogleUser(s.getCurrentUser(), s.isUserAdmin());
            }
        }));
        // ...
    }
}

然后,您可以在您的网页或组件中实现安全性 -

public class MyPage extends WebPage implements ISecureRenderInstance {
    // ...

    public IPrivilege getRenderPrivilege() {
       return new IPrivilege<GoogleUser>() {
           public boolean isGrantedToClient(GoogleUser client) {
               return client != null && client.isAdmin()
           }
       };
       // instead of returning a anonymous class like this, you could also
       // package up common privileges into a singleton instance,
       // e.g. return Privilege.ADMIN;
    }
}