我想为我的apache tapestry
网站创建一个登录功能,在登录后,应该显示已登录用户的电子邮件,而不是“登录”和“注册”按钮,以及“注销”按钮。Apache Tapestry用户登录功能
任何人都可以请告诉如何实现这个最好的方式?
我似乎无法弄清楚我应该如何检测用户是否登录,在前端部分,为了显示不同的菜单选项(我是新的挂毯)。
最好的问候,马吕斯。
我想为我的apache tapestry
网站创建一个登录功能,在登录后,应该显示已登录用户的电子邮件,而不是“登录”和“注册”按钮,以及“注销”按钮。Apache Tapestry用户登录功能
任何人都可以请告诉如何实现这个最好的方式?
我似乎无法弄清楚我应该如何检测用户是否登录,在前端部分,为了显示不同的菜单选项(我是新的挂毯)。
最好的问候,马吕斯。
认证(其中登录是一个部分)是非常特定于应用程序的。你如何定义一个用户(或者你是否称之为“客户”)并不是框架的功能。
通常,您将有一个代表您的用户的SessionStateObject。然后,您可以使用这样的事情在你的布局:
<t:if test="user">
<t:logoutLink/>
<p:else>
<t:signInForm/>
</t:if>
再次,组件LogoutLink和SignInForm是为你实现。
用户可以从Java代码公开为:
@Property @sessionState(创建=假) 私人用户的用户;
这表示用户字段链接到存储在HTTP会话中的值;此外,当字段第一次被读取时,用户不会被创建;相反,您的SignInForm组件应该分配给它的用户字段。
关于这个问题的一点点研究后,我发现了以下方法:
1)我创建了一个Authenticator接口
public interface Authenticator {
Users getLoggedUser();
boolean isLoggedIn();
void login(String email, String password) throws AuthenticationException;
void logout();
}
2)还创建了实现,一个AuthenticatorImpl.java类接口
public class AuthenticatorImpl implements Authenticator {
public static final String AUTH_TOKEN = "authToken";
@Inject
private StartDAO dao;
@Inject
private Request request;
public void login(String email, String password) throws AuthenticationException
{
Users user = dao.findUniqueWithNamedQuery("from Users u where u.Email = '" + email + "' and u.Password = '" + password + "'");
if (user == null) { throw new AuthenticationException("The user doesn't exist"); }
request.getSession(true).setAttribute(AUTH_TOKEN, user);
}
public boolean isLoggedIn()
{
Session session = request.getSession(false);
if (session != null) { return session.getAttribute(AUTH_TOKEN) != null; }
return false;
}
public void logout()
{
Session session = request.getSession(false);
if (session != null)
{
session.setAttribute(AUTH_TOKEN, null);
session.invalidate();
}
}
public Users getLoggedUser()
{
Users user = null;
if (isLoggedIn())
{
user = (Users) request.getSession(true).getAttribute(AUTH_TOKEN);
}
return user;
}
}
3)创建在AppModule.java类对应的结合
public static void bind(ServiceBinder binder)
{
binder.bind(StartDAO.class, StartDAOImpl.class);
binder.bind(Authenticator.class, AuthenticatorImpl.class);
}
4)和我Layout.java页面上,我用它通过以下方式
@Property
private Users user;
@Inject
private Authenticator authenticator;
void setupRender()
{
if(authenticator.getLoggedUser().getAccountType().equals("Administrator")){
administrator = authenticator.getLoggedUser();
}
user = authenticator.getLoggedUser();
}
Object onLogout(){
authenticator.logout();
return Login.class;
}
Layout.tml
<t:if test="user">
<span class="navbar-right btn navbar-btn" style="color: white;">
Welcome ${user.Name}! <a t:type="eventLink" t:event="Logout" href="#">(Logout)</a>
</span>
</t:if>
<t:if negate="true" test="user">
<span class="navbar-right">
<t:pagelink page="user/create" class="btn btn-default navbar-btn">Register</t:pagelink>
<t:pagelink page="user/login" class="btn btn-default navbar-btn">Sign in</t:pagelink>
</span>
</t:if>
这个工作对我来说没有任何问题。希望它能帮助别人。
最好的问候,马吕斯。