2010-04-23 46 views
2

我想显示一个不同的状态消息,当一个被暂停的用户试图登录。如果用户处于活动状态,我们会从authenticate方法返回true,否则我们会添加一个自定义的StatusMessage消息,提示“用户X已被暂停”。底层的身份验证也失败并添加一个StatusMessage。我尝试用下面的方法去除seam生成的statusMessage,但它似乎不起作用,并向我显示2种不同的状态消息(我的自定义消息,接缝生成)。这里会有什么问题?如何删除由接缝安全模块添加的状态消息?

StatusMessages statusMessages; 

statusMessages.clear() 
statusMessages.clearGlobalMessages() 
statusMessages.clearKeyedMessages(id) 

EDIT1:

public boolean authenticate() { 

    log.info("Authenticating {0}", identity.getCredentials().getUsername()); 

    String username = identity.getCredentials().getUsername(); 
    String password = identity.getCredentials().getPassword(); 

    // return true if the authentication was 
    // successful, false otherwise 
    try { 
     Query query = entityManager.createNamedQuery("user.by.login.id"); 
     query.setParameter("loginId", username); 
     // only active users can log in 
     query.setParameter("status", "ACTIVE"); 

     currentUser = (User)query.getSingleResult(); 
    } catch (PersistenceException ignore) { 
     // Provide a status message for the locked account 
     statusMessages.clearGlobalMessages(); 
     statusMessages.addFromResourceBundle(
       "login.account.locked", new Object[] { username }); 
     return false; 
    } 

    IdentityManager identityManager = IdentityManager.instance(); 
    if (!identityManager.authenticate(username, "password")) { 
     return false; 
    } else { 
     log.info("Authenticated user {0} successfully", username); 
    } 
} 

回答

2

你可以看到Seam使用状态消息(您必须资源包中定义它们)

  • org.jboss.seam.loginFailed
  • org.jboss.seam.loginSuccessful
  • org.jbos s.seam.NotLoggedIn

所以,你可能要覆盖org.jboss.seam.loginFailed键(不要忘记注册您的资源包)

somePropertiesFile.properties 

org.jboss.seam.loginFailed=<YOUR_CUSTOM_MESSAGE_GOES_HERE> 

,并使用以下一个

<h:messages globalOnly="true"/> 

要显示身份验证消息


UPDATE

如果您想自定义消息,请执行以下操作

使用Seam 2.1开始,您应该通过注入凭证,而不是身份

@Name("authenticationManager") 
public class AuthenticationManager { 

    private @In org.jboss.seam.security.Credentials credentials; 

    public boolean authenticate() { 

     private String username = credentials.getUsername(); 
     private String password = credentials.getPassword(); 

     try { 

      Query query = entityManager.createNamedQuery("user.by.login.id"); 
      query.setParameter("loginId", username); 
      query.setParameter("status", "ACTIVE"); 

      currentUser = (User) query.getSingleResult(); 

     } catch (PersistenceException ignore) { 
      return false; 
     } 

     return true; 
    } 

} 

验证您的用户而在你身边JSF Form,再次使用凭证代替身份

<h:inputText id="username" value="#{credentials.username}"/> 
<h:inputText id="password" value="#{credentials.password}"/> 

要显示您的自定义消息,做如下

<h:outputText value="#{credentials.username} has been suspended" rendered="#{not identity.loggedIn}"/> 

现在我希望它工作正常!

+0

渲染似乎是缝中的一个无效标记2.2 – Joe 2010-04-24 16:54:58

+0

我尝试了在我的WEB-INF \ pages.xml中重定向的建议,但我仍然碰巧只获得“登录失败”消息。即使我抛出LockedAccount异常,我也不会收到“自定义消息”。 – Joe 2010-04-24 17:19:31

+1

=默认存在于我的template.xhtml文件中 – Joe 2010-04-24 17:20:32

0

我有类似的问题(此消息的事情是很多的信任的一个我!),我只是不再使用煤层安全模块。这不是很灵活的/可扩展的,即使所有的文档说,这是(我认为这是通过谁写的所有的开发者的部分很多自背轻拍的)。一个类似的例子,我在尝试加入这个过程中遇到了一些麻烦,那就是在登录过程中处理强制密码更改。在决定整个缝纫安全模块没有达到标准之前,我撕下了很多头发。这有点痛苦,但我绝对没有后悔。祝你好运!

+0

基于JPA的权限存储肯定需要从性能角度进行改进。用户定义的消息不像您提到的那样容易定制。但我对煤层的整体安全框架感到满意。 – Joe 2010-05-07 02:21:54

1

如果在消息中将消息设置为空白。属性:

org.jboss.seam.loginFailed =

org.jboss.seam.loginSuccessful =欢迎,#0!

这将导致接缝系统状态信息是不是隐形

那么你添加自定义statusMessage到页面中。