Как определить URL-адрес ответа на OpenIDAuthenticationFilter? - PullRequest
0 голосов
/ 09 декабря 2011

у меня CustomOpenIDAuthenticationFilter расширяется org.springframework.security.openid.OpenIDAuthenticationFilter. Я хочу определить URL-адрес ответа после успешной аутентификации , но не знаю, как это сделать.Любая помощь, которую вы могли бы получить, будет очень признательна.

На данный момент у меня есть следующий код:

public class CustomOpenIDAuthenticationFilter extends OpenIDAuthenticationFilter{
protected static Logger logger = Logger.getLogger("service");

    public CustomOpenIDAuthenticationFilter(){
        super();
        ProxyProperties proxyProps = new ProxyProperties();
        proxyProps.setProxyHostName(PROXYNAME);
        proxyProps.setProxyPort(PROXYPORT);
        HttpClientFactory.setProxyProperties(proxyProps);
    }

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException, IOException {   
        //i think the response url should be defined here. 
        Authentication au = super.attemptAuthentication(request, response);     
        return au;
    }
}

Редактировать

Извините за ваше время.Таким образом, когда моя страница входа отправляет запрос аутентификации поставщику openid, запрос содержит returnToUrl, где «URL-адрес на сайте потребителя, где поставщик OpenID будет возвращать пользователя после генерации ответа аутентификации».В приложении, не являющемся пружиной, я бы сделал

AuthRequest authRequest = manager.authenticate(discovered, returnToUrl);

Мой вопрос: как я могу указать этот returnToUrl в моем CustomOpenIDAuthenticationFilter.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Чтобы указать returnToUrl, вы можете переопределить метод String buildReturnToUrl(HttpServletRequest request).Пример создания этого произвольного URL-адреса приведен ниже:

public class CustomOpenIDAuthenticationFilter extends OpenIDAuthenticationFilter {
  ...
  protected String buildReturnToUrl(HttpServletRequest request) {
    // this URL needs to be processed by CustomOpenIDAuthenticationFilter to validate
    // the OpenID response and authenticate the user
    return "https://example.com";    
  }
}

Поскольку в комментарии упоминается, что этот URL-адрес должен быть URL-адресом, который CustomOpenIDAuthenticationFilter будет обрабатывать, поскольку именно он проверяет ответ OpenID.

1 голос
/ 21 марта 2012

Этого также можно добиться, создав пользовательский фильтр на месте перед OPENID_FILTER

    </http>
         ...
         <custom-filter before="OPENID_FILTER" ref="myBeforeOpenIDFilter" />
    </http>

    <beans:bean id="myBeforeOpenIDFilter"class="com.example.provider.openid.MyBeforeOpenIdFilter" />

И ниже приведена моя реализация этого пользовательского фильтра

    package com.example.provider.openid;

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class MyBeforeOpenIdFilter implements Filter{

static Logger logger = LoggerFactory.getLogger(MyBeforeOpenIdFilter.class);

static class FilteredRequest extends HttpServletRequestWrapper {

    public FilteredRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public java.lang.StringBuffer getRequestURL(){
            String baseUrl = (String) super.getSession().getServletContext().getAttribute("applicationBaseUrl");
        StringBuffer sb = super.getRequestURL();

        int index = sb.indexOf("/j_spring_openid_security_check");
        if(index != -1){
            // here replace the host etc with proper value
            if(baseUrl.endsWith("/")){
                baseUrl = baseUrl.substring(0, baseUrl.length()-1);
            }
            logger.debug("Changing the getRequestURL to inject the correct host so openid login could work behind proxy");
            logger.debug("Original getRequestURL: "+sb.toString());
            logger.debug("Replacing the baseUrl with: "+baseUrl);
            sb.replace(0, index, baseUrl);
            logger.debug("New getRequestURL: "+sb.toString());
        }
        return sb;
    }

}


@Override
public void init(FilterConfig filterConfig) throws ServletException {
    //No need to init
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new FilteredRequest((HttpServletRequest) request), response);
}

@Override
public void destroy() {
    //No need to destroy
}

    }

Таким образом, выможете определить ваш openid-провайдер, используя пространство имен по умолчанию, и иметь плагин фильтра, если вам это нужно.В моей реализации я беру baseUrl из контекста сервлета, но он может быть просто жестко задан

Надеюсь, это кому-нибудь поможет

Cheers Szymon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...