2

我正在尝试从远程网页到我们的门户进行一些远程日志记录。来自远程网页的用户具有登录/密码字段,他将提交这些字段以在我们的门户中处理身份验证。如果一切正常,他将被记录。如果失败,他将被重定向到门户的标准登录页面,并出现匹配的验证错误(即“无效登录名/密码”)。

我试图通过一个 servlet 来实现,希望表单的安全字段将通过请求传输,直到它们到达门户的登录页面。

不幸的是,他们看起来好像没有达到它,因为我总是收到“无效密码/登录”错误。

由于我对 Spring 真的很陌生,我真的不确定如何实现它。我可能会考虑通过 BASE 64 编码数据传递信息,但我也不知道如何将这些信息传递给 Spring,也不确定这是一种安全的方法。

所以,如果你们中的任何人有任何想法,我会很高兴地阅读它!

这是远程表单代码:

<form id="connexion">
    <input id="j_username" name="j_username" type="text" value="Email" class="field"/>
    <input id="j_password" name="j_password" type="password" value="Mot de passe" class="field"/>
    <input type="button" class="btn" value="OK" onClick="javascript:register()"/>
</form>


function register(){

  urlSite=http://localhost:8080/monApp/DistantLogingServlet
this.document.location=urlSite

}

小服务程序部分:

 /**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 * @param request 
 * @param response 
 * @throws IOException 
 * @throws ServletException 
 */
 protected final void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {

    final ExternalContext context = FacesUtils.getFacesContext( request, response, servletContext).getExternalContext();

    final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check");

    dispatcher.forward(request, (ServletResponse) context.getResponse());

    FacesContext.getCurrentInstance().responseComplete();
}

门户的标准登录页面 (jsp):

<h:inputSecret
  id="j_password"
  type="text"
  name="j_password"
  value="#{user.password}"/>

<h:selectBooleanCheckbox
  id="_spring_security_remember_me"
  name="_spring_security_remember_me"
  value="#{user.rememberme}"
  class="float-left" /> 

<h:commandButton
  action="#{user.doLogin}"/>

还有java认证部分:

public final String doLogin() throws IOException, ServletException {

    final ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

    final HttpServletRequest request = ((HttpServletRequest) context.getRequest());

    final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check");

    dispatcher.forward(request, (ServletResponse) context.getResponse());

    FacesContext.getCurrentInstance().responseComplete();

    // It's OK to return null here because Faces is just going to exit.
    return null;

}

提前感谢您的关注!

4

1 回答 1

1

这看起来像是单点登录场景。

所以。

如果用户已经登录到您信任的应用程序,则您不需要门户网站上的登录表单。

执行此操作的一些标准方法是CASOpen ID,Spring Security 两者都支持。

第三种方法是在用户成功登录远程站点时在用户的浏览器上设置一个cookie,并使用spring过滤器查找该cookie。通常用于此的过滤器是AbstractPreAuthenticatedProcessingFilter(它实际上是子类)。

我还将向您指出 Spring Security 文档的Pre-Authentication 场景部分。

于 2012-04-05T09:30:35.180 回答