2014-08-28 108 views
0

我想为我的apache tapestry网站创建一个登录功能,在登录后,应该显示已登录用户的电子邮件,而不是“登录”和“注册”按钮,以及“注销”按钮。Apache Tapestry用户登录功能

任何人都可以请告诉如何实现这个最好的方式?

我似乎无法弄清楚我应该如何检测用户是否登录,在前端部分,为了显示不同的菜单选项(我是新的挂毯)。

最好的问候,马吕斯。

回答

2

认证(其中登录是一个部分)是非常特定于应用程序的。你如何定义一个用户(或者你是否称之为“客户”)并不是框架的功能。

通常,您将有一个代表您的用户的SessionStateObject。然后,您可以使用这样的事情在你的布局:

<t:if test="user"> 
    <t:logoutLink/> 
    <p:else> 
    <t:signInForm/> 
</t:if> 

再次,组件​​LogoutLink和SignInForm是为你实现。

用户可以从Java代码公开为:

@Property @sessionState(创建=假) 私人用户的用户;

这表示用户字段链接到存储在HTTP会话中的值;此外,当字段第一次被读取时,用户不会被创建;相反,您的SignInForm组件应该分配给它的用户字段。

0

关于这个问题的一点点研究后,我发现了以下方法:

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> 

这个工作对我来说没有任何问题。希望它能帮助别人。

最好的问候,马吕斯。