2017-06-21 1 views
2

JSFアプリケーションで「偽装」機能を作成したいとします。この機能により、管理者はパスワードを知らなくても、低レベルのユーザーで認証されたアプリケーションにアクセスできます。要するにJSFコンテキストで認証されたjavax.security.Principalを置き換える方法は?

私はそれは私がユーザー FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal()で現在のログに記録されたを取得するために使用するものに似たシンプルなsetUserPrincipal、だろうが、私はjavax.faces.context.ExternalContext内部の任意の「setUserPrincipal」方法を見つけることができなかったのに...

私が望むのは、ログインしている現在のユーザーをプログラムで変更することで、管理者は資格情報に通知せずに他のユーザーを偽装することができます。出来ますか?

おかげ

+0

プリンシパルだけを残して、役割を変更してください。それらを元に戻すことができることを確認してください: - | – EJP

+0

私はいつも私が「偽装する」ものを置く認証機構の周りに(小さな)ラッパーを作成します。だから私は決して認証機構に触れる必要はありません。 – Kukeltje

答えて

0

私は強くあなたが本当に選択肢を持っていない場合を除き、認証/承認で遊んに対して助言します。

とにかく、JSFを省いてください、それはあまりにも遅くゲームに来ます。

最も簡単な方法は、フィルターに付属のカスタマイズ要求を提供することである。このような

@WebFilter(filterName = "impersonateFilter", urlPatterns = "/*", asyncSupported = true) 
public class ImpersonateFilter implements Filter 
{ 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException 
    { 
     // do nothing 
    } 

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

    @Override 
    public void destroy() 
    { 
     // do nothing 
    } 

    public static class ImpersonateRequest extends HttpServletRequestWrapper 
    { 
     protected Principal principal; 

     public ImpersonateRequest(HttpServletRequest request) 
     { 
      super(request); 

      HttpSession session = request.getSession(false); 
      if(session != null) 
      { 
       principal = (Principal) session.getAttribute(ImpersonateRequest.class.getName()); 
      } 
     } 

     @Override 
     public Principal getUserPrincipal() 
     { 
      if(principal == null) 
      { 
       principal = super.getUserPrincipal(); 
      } 

      return principal; 
     } 

     public void setUserPrincipal(Principal principal) 
     { 
      this.principal = principal; 
      getSession().setAttribute(ImpersonateRequest.class.getName(), principal); 
     } 

     @Override 
     public String getRemoteUser() 
     { 
      return principal == null ? super.getRemoteUser() : principal.getName(); 
     } 
    } 
} 

何かが十分でなければなりません。

関連する問題