如何删除接缝安全模块添加的状态消息?

时间:2010-04-23 04:25:08

标签: java seam

我想在暂停的用户尝试登录时显示不同的状态消息。如果用户处于活动状态,我们将从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);
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

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

somePropertiesFile.properties

org.jboss.seam.loginFailed=<YOUR_CUSTOM_MESSAGE_GOES_HERE>

使用以下

<h:messages globalOnly="true"/>

显示身份验证消息


<强>更新

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

从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}"/>

现在我希望它运作正常!

答案 1 :(得分:1)

如果在message.properties中将消息设置为空白:

<强> org.jboss.seam.loginFailed =

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

这将导致接缝系统状态消息不可见

然后将自定义statusMessage添加到页面中。

答案 2 :(得分:0)

我有类似的问题(这个消息是许多信任我的人之一!)我只是不再使用接缝安全模块了。它不是非常灵活/可扩展,即使是所有医生都说它(我认为这是开发人员编写所有内容的很多自我反拍)。一个类似的例子我试图挤压这个是一堆麻烦是在登录过程中处理强制密码更改。在决定整个接缝安全模块不符合标准之前,我撕掉了很多头发。这有点痛苦,但我绝对没有遗憾。祝你好运!