Score:1

การบันทึกชื่อผู้ใช้ในบันทึกการเข้าถึง KeyCloak

ธง br

ใน KeyCLoak 15.0 (นั่นคือ WildFly 23.0) ฉันกำลังพยายามกำหนดค่าบันทึกการเข้าถึงให้รวมชื่อผู้ใช้ (หรือ ID ใดๆ ของผู้ใช้) เมื่อผู้ใช้เข้าสู่ระบบ keycloak/standalone/configuration/standalone.xmlฉันกำหนดค่า XML:/server/profile/subsystem[@xmlns="urn:jboss:domain:undertow:12.0"]/server/host/access-log/@pattern pattern="%h %l %u %t "%r" %s/%S %b %T %I "%{i,User-Agent}""

บันทึกได้รับการพิมพ์อย่างถูกต้องในไฟล์ที่ฉันกำหนดค่า อย่างไรก็ตามมูลค่าของ %ยู หรือ %{REMOTE_USER} ว่างเปล่าเสมอ (นั่นคือ -).

วิธีเดียวในการบันทึก ID ผู้ใช้ที่ฉันพบคือการบันทึกค่าคุกกี้เซสชันด้วย %{c,KEYCLOAK_SESSION} (ประกอบด้วย ขอบเขต/รหัสผู้ใช้/ความลับ). ซึ่งไม่ใช่ความคิดที่ดีในการผลิต

มีแนวคิดเกี่ยวกับวิธีบันทึกชื่อผู้ใช้หรือรหัสผู้ใช้ในบันทึกการเข้าถึงหรือไม่

มันเป็นข้อบกพร่องของ KeyCLoak หรือไม่ %ยู หรือ %{REMOTE_USER} ว่างเปล่าแม้ว่าจะมีเซสชันผู้ใช้ที่ใช้งานอยู่ใน KeyCloak หรือไม่ หรือเป็นไปได้ไหมที่ KeyCLoak จะกำหนดค่าแอตทริบิวต์ของผู้ใช้ที่จะป้อน REMOTE_USER?

อีกทางหนึ่งวิธีใส่รหัสผู้ใช้ในส่วนหัวบางส่วนเพื่อใช้อย่างใดอย่างหนึ่งต่อไปนี้

  • %{i,xxx} สำหรับส่วนหัวที่เข้ามา
  • %{o,xxx} สำหรับส่วนหัวการตอบสนองขาออก
  • %{c,xxx} สำหรับคุกกี้เฉพาะ
  • %{r,xxx} โดยที่ xxx เป็นแอตทริบิวต์ใน ServletRequest
  • %{s,xxx} โดยที่ xxx เป็นแอตทริบิวต์ใน HttpSession

ฉันลองสิ่งเหล่านี้ ไม่มีประชากรเลย

%{s,ผู้ใช้} 
%{s,รหัสผู้ใช้} 
%{s,client_id} 
%{s,USER_ID} 
%{s,USER} 
%{s,org.keycloak.adapters.spi.KeycloakAccount} 
%{s,บัญชีคีย์โคลก} 
%{s,org.keycloak.adapters.tomcat.CatalinaSessionTokenStore.SerializableKeycloakAccount} 
%{s,SerializableKeycloakAccount} 
%{s,org.keycloak.adapters.saml.SamlSession} 
%{s,SamlSession} 
%{s,org.keycloak.adapters.undertow.KeycloakUndertowAccount} 
%{s,KeycloakUndertowAccount} 
%{s,org.keycloak.KeycloakSecurityContext} 
%{s,KeycloakSecurityContext} 
%{s,io.undertow.servlet.util.SavedRequest} 
%{s,คำขอที่บันทึกไว้}

%{r,tokenInfo} 
%{r,KeycloakSecurityContext} 
%{r,ElytronHttpFacade} 
%{r,AdapterDeploymentContext} 
%{r,TOKEN_STORE_NOTE}
Score:2
ธง jp

ฉันพบปัญหาที่คล้ายกัน (ลูกค้าของฉันขอให้ฉันบันทึกรหัสลูกค้า) และจบลงด้วยการมองหาวิธีแก้ไข จากการดูที่ซอร์สโค้ดและวิธีเติมข้อมูลบันทึกการเข้าถึง ฉันสามารถบอกคุณได้ว่ามีช่องว่างค่อนข้างใหญ่ระหว่างที่บันทึกถูกสร้างขึ้นและที่งานจริงกำลังดำเนินการอยู่

หากคุณดูที่ Keycloak จะขึ้นอยู่กับ Wildfly ซึ่งใช้ Undertow เพื่อโฮสต์ฟังก์ชันเซิร์ฟเวอร์ http แม้ว่ารายการบันทึกการเข้าถึงจะถูกปล่อยออกมาเมื่อมีการส่งคำขอ แต่ก็มีช่องว่างและนามธรรมเล็กน้อยซึ่งทำให้สิ่งต่าง ๆ ซับซ้อน

จากมุมมองของซอฟต์แวร์มีตัวจัดการ undertow จากนั้น servlet จากนั้น servlet ที่เหลือจากนั้นจึงใช้แอปพลิเคชัน keycloak และทรัพยากรเฉพาะ เมื่อคุณใช้คอนโซลผู้ใช้หรือผู้ดูแลระบบของ Keycloak ส่วนใหญ่จะเป็นไคลเอนต์ "thin" ซึ่งแสดงโดยเว็บเบราว์เซอร์ และเบราว์เซอร์นี้เรียกทรัพยากรที่เหลือ

หากคุณต้องการรับข้อมูลเกี่ยวกับผู้ใช้บ่อยครั้ง ข้อมูลดังกล่าวจะไม่พบในเซสชัน เนื่องจากงานส่วนใหญ่ที่ดำเนินการโดย Kecloak คือการออกโทเค็นในนามของผู้ใช้ ลูกค้าอย่างเป็นทางการที่ส่งคำขอดำเนินการในนามของผู้ใช้ ซึ่งหมายความว่าจะไม่มีข้อมูลที่ชัดเจนสำหรับแต่ละคำขอที่เข้ามา นอกจากนี้ ทรัพยากรที่เหลือส่วนใหญ่ตามคำนิยามนั้นไม่มีสถานะ ซึ่งหมายความว่าพวกมันดำเนินการกับผู้ใช้อย่างใดอย่างหนึ่ง แต่ไม่มีการเติมเซสชันมากนัก มีเพียงส่วนเดียวที่คุณสามารถไว้วางใจในการเข้าถึงข้อมูลผู้ใช้ได้คือเมื่อผู้ใช้เข้าสู่ระบบจริงและทำบางอย่างภายในคอนโซลบัญชีผู้ใช้ นอกจากนี้ยังอาจสูญเสียการต่อสู้เนื่องจากทรัพยากรของคีย์ปิดบังการออกโทเค็นในกรณีส่วนใหญ่จะจัดการกับไคลเอนต์หรือเซสชันที่เกี่ยวข้องกับไคลเอนต์

ตรงประเด็น - ฉันมาถึงจุดที่ฉันอยู่ซึ่งทำการแยกวิเคราะห์รูปแบบบันทึกการเข้าถึง มันขึ้นอยู่กับ Undertow แอตทริบิวต์การแลกเปลี่ยน แนวคิดที่อนุญาตให้นำแมโครของคุณเองสำหรับบันทึก สามารถใช้มาโครนี้เพื่อสำรวจโครงสร้างหน่วยความจำเพื่อติดตามข้อมูลที่จำเป็น สำหรับฉันมันเป็น client_id ที่กำลังทำงานอยู่ ด้วยเหตุนี้ฉันจึงลงเอยด้วยการใช้ a แบบฟอร์มแอตทริบิวต์. ฉันยังต้องหาวิธีเชื่อมต่อ แต่จากมุมมองของการทดสอบหน่วยนั้น "คลิก" แล้ว ดูว่ารหัสพื้นฐานเป็นอย่างไร:

แพ็คเกจ org.code_house.wildfly.stuff.undertow.attributes;
// อย่าลืมสร้าง META-INF/services/io.undertow.attribute.ExchangeAttributeBuilder
// กับบรรทัดที่มีชื่อคลาสเช่น
// org.code_house.wildfly.stuff.undertow.attributes.FormAttribute$Builder

/**
 * เปิดเผยพารามิเตอร์ของฟอร์มภายในแอตทริบิวต์การแลกเปลี่ยนซึ่งสามารถบันทึกในบันทึกการเข้าถึง
 * ใช้ %{F,*} เพื่อดัมพ์พารามิเตอร์ทั้งหมดหรือ %{F,client_id} เพื่อแสดงผลที่เลือกจากฟิลด์
 *
 * @ผู้เขียน Åukasz Dywicki @ code-house.org
 **/
FormAttribute คลาสสาธารณะใช้ ExchangeAttribute {

  ParamName สตริงสุดท้ายส่วนตัว;

  FormAttribute สาธารณะ (String paramName) {
    this.paramName = ชื่อพารามิเตอร์;
  }

  @แทนที่
  สตริงสาธารณะ readAttribute (การแลกเปลี่ยน HttpServerExchange) {
    FormData formData = exchange.getAttachment (FormDataParser.FORM_DATA);
    ถ้า ("*".equals (paramName)) {
      กลับ "" + formData;
    }
    ส่งคืน formData == null ? "" : "" + formData.get(ชื่อผู้ใช้);
  }

  @แทนที่
  โมฆะสาธารณะ writeAttribute (การแลกเปลี่ยน HttpServerExchange, String newValue) พ่น ReadOnlyAttributeException {
    โยน new ReadOnlyAttributeException("แบบฟอร์ม", newValue);
  }

  ตัวสร้างคลาสสุดท้ายแบบคงที่สาธารณะใช้ ExchangeAttributeBuilder {
    @แทนที่
    ชื่อสตริงสาธารณะ () {
      ส่งคืน "แบบฟอร์ม";
    }

    @แทนที่
    การสร้าง ExchangeAttribute สาธารณะ (โทเค็นสตริงสุดท้าย) {
      ถ้า (token.startsWith("%{F,") && token.endsWith("}")) {
        สตริงสุดท้าย paramName = token.substring(4, token.length() - 1);
        ส่งคืน FormAttribute ใหม่ (paramName);
      }
      ส่งคืน null;
    }

    @แทนที่
    ลำดับความสำคัญสาธารณะ () {
      กลับ 0;
    }
  }
}

ประเด็นหลัก - โดยใช้แอตทริบิวต์ฟอร์มเพื่อบันทึกค่าที่ป้อนในช่อง "ชื่อผู้ใช้" ของแบบฟอร์มการเข้าสู่ระบบเพื่อรับ "ใคร" จากนั้นคุณสามารถรวมเข้ากับคุกกี้เซสชันซึ่งเบราว์เซอร์จะเก็บไว้ โดยการผสมพื้นฐานของเอซสองตัวขึ้นไป คุณจะได้ผลลัพธ์ที่ต้องการ เมื่อใช้พิมพ์เขียวข้างต้น คุณจะสามารถใช้งานของคุณเองและติดตามโทเค็นและสิ่งอื่นๆ ที่จะช่วยให้คุณสร้างแอปพลิเคชันของคุณได้

ฉันอาจอัปเดตคำตอบเมื่อฉันพบตรรกะกาวเพื่อใส่แอตทริบิวต์เพิ่มเติมลงในรูปแบบบันทึกอย่างถูกต้อง แก้ไข: วิธีเดียวที่ฉันพบจนถึงตอนนี้ในการแทรกแอตทริบิวต์พิเศษคือการคัดลอกเข้าไป $JBOSS_HOME/modules/system/layers/base/org/wildfly/extension/undertow/main/ และการปรับปรุง โมดูล.xml ภายในไดเร็กทอรีนี้:

<module name="org.wildfly.extension.undertow" xmlns="urn:jboss:module:1.5">
...
    <resources>
        <resource-root path="wildfly-undertow-20.0.1.Final.jar"/>
        <!-- put here name of jar you made -->
        <resource-root path="undertow-client-request-filter-1.0.0-SNAPSHOT.jar"/>
    </resources>
...
</module>

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา