[JAVA] Implementierungsbeispiel bei gemeinsamer Verwendung der Formularauthentifizierung und der Anforderungsheaderauthentifizierung in Spring Security

Trigger Bei einer bestimmten Entwicklung von Webanwendungen mussten die folgenden beiden gleichzeitig realisiert werden. ① Die Formularauthentifizierung kann durch Eingabe der ID und des Kennworts über den Anmeldebildschirm durchgeführt werden. (2) Die Authentifizierung kann mit dem Wert eines bestimmten Attributs im HTTP-Anforderungsheader durchgeführt werden.

(2) ist eine Anforderung, dass das vorhandene externe Authentifizierungssystem ein Token im HTTP-Anforderungsheader setzt und umleitet, wenn die Authentifizierung erfolgreich ist, damit SSO, das dies verwendet, realisiert wird.

(1) Unabhängige oder (2) Unabhängige Implementierungsbeispiele sind im gesamten Internet zu finden, aber ich konnte kein Muster finden, um sie zusammen zu verwenden (und es war technisch wie es war), daher werde ich vorstellen, wie es realisiert wurde.

Quelle Stellen Sie wie folgt ein. https://github.com/ShandyGaffLover/sample001/blob/master/src/main/resources/spring-security.xml

Erläuterung Passen Sie "PRE_AUTH_FILTER" und "FORM_LOGIN_FILER" an.
    <sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
    <sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />

Passen Sie PRE_AUTH_FILTER an

Verwenden Sie die RequestHeaderAuthenticationFilter-Klasse wie folgt, um "PRE_AUTH_FILTER" anzupassen. Setzen Sie die Eigenschaft exceptionIfHeaderMissing auf false und die Eigenschaft continueFilterChainOnUnsuccessfulAuthentication auf true, um die Formularauthentifizierung zu vereinfachen.

  <bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
    <property name="principalRequestHeader" value="SM_USER"/>
    <property name="authenticationManager" ref="sm_authenticationManager" />
    <property name="exceptionIfHeaderMissing" value="false"/>

    <property name="continueFilterChainOnUnsuccessfulAuthentication" value="true"/>
  </bean>

Hier wird AuthenticationManager (und AuthenticationProvider) wie folgt definiert.

  <sec:authentication-manager id="sm_authenticationManager">
    <sec:authentication-provider ref="preauthAuthProvider" />
  </sec:authentication-manager>

  <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="preAuthenticatedUserDetailsService">
      <bean id="userDetailsServiceWrapper"
          class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
        <property name="userDetailsService" ref="customUserDetailsService"/>
      </bean>
    </property>
  </bean>

Verwenden Sie die PreAuthenticatedAuthenticationProvider-Klasse für AuthenticationProvider. Beachten Sie, dass der UserDetailsService, der der Eigenschaft preAuthenticatedUserDetailsService zugewiesen wurde, von der UserDetailsByNameServiceWrapper-Klasse umschlossen werden muss.

Passen Sie FORM_LOGIN_FILER an Die Anpassung von "FORM_LOGIN_FILER" ist wie folgt.
 <sec:authentication-manager id="form_authenticationManager">
    <sec:authentication-provider  user-service-ref="customUserDetailsService" >
    </sec:authentication-provider>
  </sec:authentication-manager>

  <bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationManager" ref="form_authenticationManager" />
    <property name="authenticationSuccessHandler" ref="formLoginSuccessHandler" />
    <property name="authenticationFailureHandler" ref="formLoginFailureHandler" />
    <property name="filterProcessesUrl" value="/login" />
  </bean>

Da hier ein benutzerdefinierter Filter verwendet wird, muss das Attribut "entry-point-ref" des -Tags wie unten gezeigt festgelegt werden.

  <sec:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">

  ~Unterlassung~

    <sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
    <sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
  </sec:http>

  <bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <constructor-arg value="/loginPage" />
  </bean>

echte Sache Sie können den Vorgang wie folgt überprüfen. [^ 1] https://shandygafflover.herokuapp.com/

① Geben Sie im Anmeldebildschirm "Benutzer" als Benutzername und "Passwort" als Passwort für die Anmeldung ein und Sie werden authentifiziert. (2) Wenn Sie im HTTP-Anforderungsheader [^ 2] den Wert "user" auf das Attribut "SM_USER" setzen, werden Sie authentifiziert. Hier wird der im folgenden Artikel vorgestellte ModHeader verwendet.

Legen Sie die Authentifizierungsinformationen extern im HTTP-Header des Browsers --Qiita fest  https://qiita.com/utwang/items/1eeb25d27e8acea33a8a

[^ 1]: Es tut mir sehr leid, aber zum Zeitpunkt der Veröffentlichung des Artikels wird gesagt, dass https nicht unterstützt wird (obwohl es sich um eine Authentifizierung handelt!). Es tut mir Leid. Ich werde mir Zeit nehmen, mich damit zu befassen.

[^ 2]: Der Attributname "SM_USER" im Anforderungsheader ist nur ein Beispiel. In der tatsächlichen Entwicklung sollten Attributnamen schwer zu erraten und vertraulich behandelt werden.

Ausführungsergebnis Setzen Sie den Wert "user" auf das Attribut "SM_USER" im HTTP-Anforderungsheader. ![requestheader.png](https://qiita-image-store.s3.amazonaws.com/0/322008/7b04e084-5929-255d-8d10-7ee600665ee6.png)

Greifen Sie in diesem Status beispielsweise auf die folgende URL zu. url.png

Dann werden Sie authentifiziert und die Seite wird angezeigt. greeting.png

Wenn das Attribut "SM_USER" im HTTP-Anforderungsheader nicht festgelegt ist, wird der Anmeldebildschirm angezeigt, sodass Sie durch Benutzername und Kennwort authentifiziert werden. login.png greeting.png

Referenz-URL

Spring Security Usage Memo Authentifizierung / Autorisierung --Qiita https://qiita.com/opengl-8080/items/032ed0fa27a239bdc1cc

03-1. So stellen Sie Spring Security 2 ein - Soracane https://sites.google.com/site/soracane/home/springnitsuite/spring-security/spring-securityno-settei-houhou

Technischer Hinweis - Erklärt, wie Sie Ihren eigenen Authentifizierungsprozess für die Frühlingssicherheit erstellen http://javatechnology.net/spring/spring-security-login-filter-original/

Arbeitsnotizen beim Anwenden von Spring Security-Namihira Blog http://namihira.hatenablog.com/entry/20160817/1471396975

AbstractAuthenticationProcessingFilter (Spring Security 4.2.6.RELEASE API) https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html

Spring Security Java - Multiple Authentication Manager - 2 bean found error - Stack Overflow https://stackoverflow.com/questions/32105846/spring-security-java-multiple-authentication-manager-2-bean-found-error

Recommended Posts

Implementierungsbeispiel bei gemeinsamer Verwendung der Formularauthentifizierung und der Anforderungsheaderauthentifizierung in Spring Security
Fehler bei der Implementierung bei der Implementierung der Spring-Validierung
Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security
Informationen zur Spring Security-Authentifizierung