通过扩展将方法添加到Wicket 7中的AuthenticatedWebSession

时间:2015-08-30 05:07:14

标签: java wicket

我使用Wicket 7并将 AuthenticatedWebSession 扩展为名为 BasicAuthenticatedSession 的类。虽然我这样做,但我想添加一个返回有关经过身份验证的用户的其他信息的方法。

BasicAuthenticatedSession#authenticate 中,我得到一个 Sysuser 对象,它是数据库中用户的包装器。我使用此对象中的一些信息进行身份验证,但希望在整个会话期间访问所有信息(名字,姓氏等)。

我原本希望能够创建一个新的方法调用 getUser ,它会将此数据库对象返回给调用者。

但是,这种方法虽然声明为公开,但在尝试调用它时并不可见。我不确定这是否与Wicket有关,或者只是对我的继承如何工作的一般误解。 ;)

BasicAuthenticatedWebSession.java

// self is the view

UIResponder *responder = self;
while ((responder = [responder nextResponder])) {
    if ([responder isKindOfClass:UIViewController.class]) break;
}
return (UIViewController *)responder;

Test.java 此类无法编译,因为找不到 BasicAuthenticatedSession 中的 getSysuser 方法。

public class BasicAuthenticatedWebSession extends AuthenticatedWebSession {

    public BasicAuthenticatedWebSession(Request request) {
        super(request);
    }

    @Override
    protected boolean authenticate(String username, String password) {
        Sysuser[] sysusers;

        try {
            SysuserCriteria userCriteria = new SysuserCriteria();

            userCriteria.username.eq(username);
            sysusers = Sysuser.listSysuserByCriteria(userCriteria);
        } catch (PersistentException e) {
            e.printStackTrace();

            return false;
        }

        if (sysusers.length == 0) {
            return false;
        }

        this.username = username;
        this.userid   = sysusers[0].getId();

        return password.compareTo(sysusers[0].getPasswd()) == 0;
    }

    public Roles getRoles() {
        Roles     roles = new Roles();
        Sysuser[] sysusers;

        if (isSignedIn()) {
            roles.add("SIGNED_IN");
        }

        try {
            SysuserCriteria sysuserCriteria = new SysuserCriteria();

            sysuserCriteria.username.eq(username);
            sysusers = Sysuser.listSysuserByCriteria(sysuserCriteria);

            for (Object sysuser : sysusers) {
                SysroleSetCollection sysroles = ((Sysuser) sysuser).sysrole;

                for (Sysrole sysrole : sysroles.toArray()) {
                    roles.add(sysrole.getRolename().toUpperCase());
                }
            }
        } catch (PersistentException e) {
            e.printStackTrace();
        }

        return roles;
    }

    public Sysuser getSysuser() {
        return sysuser;
    }
}

1 个答案:

答案 0 :(得分:1)

Wicket项目需要特定的"覆盖"静态方法,我想你返回原始的wicket API会话。我的项目编辑过的副本(会话是你的类名)

public class BasicAuthenticatedWebSession extends AuthenticatedWebSession {

public static BasicAuthenticatedWebSession get() {
        return (BasicAuthenticatedWebSession ) Session.get();
    }

...
}

和XxxxxApplication类

public class MyProject extends AuthenticatedWebApplication
{
    ...

@Override
    public Session newSession(Request request, Response response) {
        return new BasicAuthenticatedWebSession (request);
    }
}