⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 samlauthfilter.java

📁 1. 如何生成自签名的KeyStore以及导出供SP使用的公钥 C:>keytool -v -genkey -alias idp -keystore idp.jks -keyalg RSA -
💻 JAVA
字号:
package samlsso.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.security.auth.login.LoginException;
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 javax.servlet.http.HttpServletResponse;

import weblogic.servlet.security.ServletAuthentication;

/**
 *
 * @author maxq
 * @version 0.9
 */
public final class SAMLAuthFilter implements Filter {

  /**
   * 
   */
  private String redirectURL;
  
  /**
   * 
   */
  private static String token_type= "SAML.Assertion";
  
  /**
   * 
   */
  private String realm= "myrealm";
  
  /**
   * 
   */
  public SAMLAuthFilter() {
    super();
  }

  /*
   *  (non-Javadoc)
   * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
   */
  public void init( FilterConfig config) throws ServletException {
    redirectURL= config.getInitParameter( "redirectURL");
    String _token_type= config.getInitParameter( "token-type");
    if ( _token_type!= null && _token_type.length()!= 0) {
      token_type= config.getInitParameter( "token-type");
    }
    String _realm= config.getInitParameter( "realm-name");
    if ( _realm!= null && _realm.length()!= 0) {
     realm= _realm;
    }
  }

  /*
   *  (non-Javadoc)
   * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
   */
  public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request= (HttpServletRequest)req;
    HttpServletResponse response= (HttpServletResponse)res;
    
    if ( request.getRemoteUser()!= null) {
      chain.doFilter( req, res);
      return;
    }

    String token= request.getParameter( token_type);
    if ( token== null) {
      String requrl= request.getRequestURL().toString();
      String url= redirectURL.indexOf('?')!= -1 ?
          redirectURL+ "&ssotarget=" + requrl: redirectURL+ "?ssotarget=" + requrl;
      response.sendRedirect( response.encodeRedirectURL( url));
    }else {
      try {
        HttpServletRequest wrappedRequest= wrapRequest( request, token);
        int result= ServletAuthentication.assertIdentity( wrappedRequest, response, realm);
        chain.doFilter( request, response);
      }catch ( LoginException ex) {
        throw new ServletException( ex);
      }
    }

  }

  /*
   *  (non-Javadoc)
   * @see javax.servlet.Filter#destroy()
   */
  public void destroy() {
  }

  /**
   * 
   * @return
   */
  private HttpServletRequest wrapRequest( HttpServletRequest request, String token) {
    final String mytoken= token;
    return new HttpServletRequestWrapper( request) {
      /*
       *  (non-Javadoc)
       * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
       */
      public String getHeader( String name) {
        return ( name.equalsIgnoreCase( token_type))? mytoken : super.getHeader( name);
      }
      /*
       *  (non-Javadoc)
       * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
       */
      public Enumeration getHeaderNames() {
        if ( mytoken!= null)
          return new MyEnumeration( super.getHeaderNames());
        else 
          return super.getHeaderNames();
      }
    };
  }
  
  /**
   * 
   * @author maxq
   * @version 0.9
   */
  private static class MyEnumeration implements Enumeration {
    
    /**
     * 
     */
    Enumeration enu;
    
    /**
     * 
     */
    boolean nomore;
    
    /**
     * 
     * @param enu
     */
    public MyEnumeration( Enumeration enu) {
      this.enu= enu;
      this.nomore= false;
    }
    
    /*
     *  (non-Javadoc)
     * @see java.util.Enumeration#hasMoreElements()
     */
    public boolean hasMoreElements() {
      boolean hasMore= enu.hasMoreElements();
      return ( hasMore== false && nomore== false)? 
          nomore= true: hasMore;
    }
    
    /*
     *  (non-Javadoc)
     * @see java.util.Enumeration#nextElement()
     */
    public Object nextElement() {
      if ( nomore) return token_type;
      return enu.nextElement();
    }

  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -