通过扩展将方法添加到 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);
}
}
我正在使用 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);
}
}