Автоматический вход в систему с использованием учетных данных - PullRequest
2 голосов
/ 08 октября 2009

Я успешно создал проект с использованием учетных данных для аутентификации, но сейчас некоторые требования изменились (как обычно), и мне нужно автоматически аутентифицировать пользователя. Смотрите пример ниже:

пользователь вызывает страницу: http://server:port/project/index.jsp?parameter=xyz. Эта страница должна вызвать компонент шва и получить параметр для заполнения credentials.username, но он не работает должным образом.

my pages.xml:

<page view-id="*" action="#{authenticator.authenticate}" >
    <rewrite pattern="/index/{cpf}" />
    <rewrite pattern="/home/{cpf}" />
    <param name="#{credentials.username}" value="123456" />
    <param name="authenticator.teste" value="#{param['cpf']}" />
    <param name="cpf" value="#{param['cpf']}" />
    <param name="token" value="#{param['cpf']}" />
    <navigation >
        <rule if-outcome="home">
            <redirect view-id="/home.xhtml" />
        </rule>
        <rule if-outcome="index">
            <redirect view-id="#{authenticator.authenticate}" include-page-params="true" />
        </rule>
    </navigation>
</page>

мой authenticatorBean (здесь очень много тестов, я попробовал все):

@Stateless
@Name("authenticator")
public class AuthenticatorBean implements Authenticator {

    @Out String token;
    @Out String cpf;
    @Out String xyz;
    @Out String teste;

    @Logger private Log log;
    @In EntityManager entityManager;
    @In Identity identity;
    @In Credentials credentials;
    public boolean authenticate() {

        System.out.println(credentials.getUsername());

        System.out.println(cpf);
        System.out.println(xyz);
        System.out.println(teste);


        @SuppressWarnings("unused")
        FacesContext fcx = FacesContext.getCurrentInstance();
        String cpf = fcx.getExternalContext().getRequestContextPath();
        String cpf2 = fcx.getExternalContext().getRequestParameterMap().get("token");
        String cpf21 = fcx.getExternalContext().getRequestParameterMap().get("cpf");
        String cpf22 = fcx.getExternalContext().getRequestParameterMap().get("xyz");
        String cpf23 = fcx.getExternalContext().getRequestParameterMap().get("teste");
        String cpf3 = fcx.getExternalContext().getInitParameter("cpf");
        String cpf4 = fcx.getExternalContext().getRequestPathInfo();
        String cpf5 = fcx.getExternalContext().getRequestServletPath();
        Object cpf6 = fcx.getExternalContext().getRequest();
        Object cpf7 = fcx.getExternalContext().getContext();
        Object cpf8 = fcx.getExternalContext().getRequestMap();
        Object cpf9 = fcx.getExternalContext().getRequestParameterNames();

        log.info("authenticating {0}", credentials.getUsername());
        Usuario usuario = (Usuario) entityManager.createQuery("select u from Usuario u where u.cpf = :cpf")
        .setParameter("cpf", credentials.getUsername())
        .getSingleResult();

        log.info("authenticating {0}", credentials.getUsername());

        if (usuario != null) {
             identity.addRole("admin");
             return Boolean.TRUE;
        }

        return false;
    }

}

Может кто-нибудь мне помочь? я не могу получить параметр в authenticatorBean

Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

это довольно просто. Смотри ниже:

PAGES.XML

<page view-id="/home.xhtml">
        <action execute="#{identity.login}" if="#{not identity.loggedIn}" />
        <param name="username" />
        <navigation from-action="#{identity.login}">
            <rule if="#{identity.loggedIn}">
                <redirect view-id="/home.xhtml"/>
            </rule>
            <rule if="#{not identity.loggedIn}">
                <redirect view-id="/error.xhtml"/>
            </rule>
        </navigation>
    </page>

Как видите, я объявляю параметр username и когда клиент вводит URL "http://host:port/project/home.seam?username=xyz", параметр получает переменная username в компоненте seam:

@Logger private Log log;

@In(required = true)
private String username;

@In(required=false, scope=ScopeType.SESSION)
Usuario usuario;

@In @Out
Identity identity;

@In @Out
Credentials credentials;

public boolean authenticate(){

    log.info("authenticating {0}", username);

    try {

        UsuarioBean usuarioBean = (UsuarioBean) Component.getInstance(UsuarioBean.class, true);
        usuario = usuarioBean.validaUsuario(username);

        if (usuario == null){
            throw new AuthorizationException("login failed");
        }else{
            credentials.setUsername(usuario.getNome());
            return Boolean.TRUE;
        }

    }catch(Exception e){
        log.error("falha na autenticação do usuario {0} : {1}", username, e.getCause().toString());
        throw new AuthorizationException("login failed");
    }

}

Я надеюсь, что эта информация будет полезна для вас. Удачи!

1 голос
/ 16 ноября 2009

В этом FAQ по шву показано, как получить доступ к объекту HttpServletRequest.

Объект HttpServletRequest имеет метод с именем getRemoteUser ().

Эта библиотека с открытым исходным кодом, http://spnego.sourceforge.net,, позволит вашему серверу приложений выполнять интегрированную проверку подлинности Windows / sso.

Он устанавливается как фильтр сервлетов.

В вашем файле web.xml определите фильтр так, чтобы он работал перед любым компонентом Seam.

0 голосов
/ 26 октября 2009

Я сталкиваюсь с подобной проблемой, хотя в моем случае нет страницы:

Шов: вход в систему с помощью внешнего приложения единого входа

Я вижу, вы выбрали другой маршрут.

Сейчас я рассматриваю создание страницы JSF, которая будет принимать мой параметр, сохранять в форме значения через JS и автоматически отправлять. это ужасно, но это должно сработать.

...