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

Adding methods to AuthenticatedWebSession in Wicket 7 by extension

我正在使用 Wicket 7 并将 AuthenticatedWebSession 扩展为一个名为 BasicAuthenticatedSession 的 class。当我这样做时,我想添加一个方法,returns 一些关于经过身份验证的用户的附加信息。

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

我希望能够创建一个新的方法调用 getUser,它将 return 这个数据库对象提供给调用者。

但是,即使已声明 public,此方法在尝试调用时也不可见。我不确定这是否与 Wicket 有关,或者只是我对继承的工作原理的普遍误解。 ;)

BasicAuthenticatedWebSession.java

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;
    }
}

Test.java 此 class 无法编译为 BasicAuthenticatedSession 中的 getSysuser 方法 未找到。

public class Test {
    public Test() {
    }

    public void foo {
        if(BasicAuthenticatedSession.get().isSignedIn()) {
            Sysuser sysUser = BasicAuthenticatedSession.get().getSysuser();
            System.out.println(sysuser.getFirstname);
        }
    }
}

Wicket 项目需要特定的 "override" 静态方法,我猜你 return 原始 wicket API 会话。从我的项目编辑副本(会话是你的 classname)

public class BasicAuthenticatedWebSession extends AuthenticatedWebSession {

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

...
}

并且在 XxxxxApplication class

public class MyProject extends AuthenticatedWebApplication
{
    ...

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