Điểm:1

Đăng nhập tên người dùng trong nhật ký truy cập KeyCloak

lá cờ br

Trong KeyCLoak 15.0 (tức là WildFly 23.0), tôi đang cố định cấu hình nhật ký truy cập để bao gồm cả tên người dùng (hoặc bất kỳ ID nào của người dùng) khi người dùng đăng nhập. Trong keycloak/độc lập/cấu hình/độc lập.xml, tôi đã cấu hình 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}""

Nhật ký được in chính xác trong tệp tôi đã định cấu hình. Tuy nhiên, giá trị của %u hoặc %{REMOTE_USER} luôn rỗng (có nghĩa là -).

Cách duy nhất để ghi lại một số ID người dùng mà tôi tìm thấy là ghi lại giá trị cookie của phiên với %{c,KEYCLOAK_SESSION} (Nó chứa vương quốc/ID người dùng/bí mật). Đó không phải là một ý tưởng hay để thực hiện trong quá trình sản xuất.

Bạn có ý tưởng nào về cách đăng nhập tên người dùng hoặc ID người dùng trong nhật ký truy cập không?

Đây có phải là lỗi KeyCLoak không %u hoặc %{REMOTE_USER} trống ngay cả khi có phiên người dùng đang hoạt động trong KeyCloak? Hoặc có thể trong KeyCLoak để định cấu hình giá trị thuộc tính người dùng nào đi vào REMOTE_USER?

cách khác, làm cách nào để đặt userID vào một số tiêu đề để sử dụng một trong các tiêu đề sau?

  • %{i,xxx} cho các tiêu đề đến
  • %{o,xxx} cho các tiêu đề phản hồi gửi đi
  • %{c,xxx} cho một cookie cụ thể
  • %{r,xxx} trong đó xxx là một thuộc tính trong ServletRequest
  • %{s,xxx} trong đó xxx là một thuộc tính trong HttpSession

Trong số những người khác, tôi đã thử những thứ này. Không ai trong số họ được cư trú.

%{s,người dùng} 
%{s,userId} 
%{s,client_id} 
%{s,USER_ID} 
%{s,USER} 
%{s,org.keycloak.adapters.spi.KeycloakAccount} 
%{s,KeycloakAccount} 
%{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,SavedRequest}

%{r,tokenInfo} 
%{r,KeycloakSecurityContext} 
%{r,ElytronHttpFacade} 
%{r,AdapterDeploymentContext} 
%{r,TOKEN_STORE_NOTE}
Điểm:2
lá cờ jp

Tôi gặp vấn đề tương tự (khách hàng của tôi yêu cầu tôi ghi lại id khách hàng) và cuối cùng tìm kiếm giải pháp. Từ việc xem xét mã nguồn và cách nhập nhật ký truy cập, tôi có thể cho bạn biết rằng có một khoảng cách khá lớn giữa nơi tạo nhật ký và nơi công việc thực tế đang được thực hiện.

Nếu bạn đã xem Keycloak thì nó dựa trên Wildfly sử dụng Undertow để lưu trữ chức năng máy chủ http. Trong khi mục nhập nhật ký truy cập được phát ra sau khi yêu cầu được phục vụ, có một số khoảng trống và phần tóm tắt làm phức tạp mọi thứ.

Từ góc độ phần mềm, có trình xử lý tiến hành, sau đó là servlet, sau đó là servlet khôi phục, sau đó là ứng dụng keycloak và các tài nguyên cụ thể. Khi bạn sử dụng bảng điều khiển quản trị hoặc người dùng Keycloak thì ở hầu hết các nơi, đó là ứng dụng khách "mỏng" được trình duyệt web hiển thị. Và trình duyệt này gọi tài nguyên còn lại.

Nếu bạn thường xuyên muốn lấy thông tin liên quan đến người dùng thì thông tin đó sẽ không được tìm thấy trong phiên, vì hầu hết công việc mà Kecloak thực hiện là phát hành mã thông báo thay mặt cho người dùng. Khách hàng chính thức gửi yêu cầu hoạt động thay mặt cho người dùng, điều đó có nghĩa là nó không phải là thông tin rõ ràng có sẵn cho mỗi yêu cầu đến. Ngoài ra, hầu hết các tài nguyên còn lại theo định nghĩa là không trạng thái, điều đó có nghĩa là chúng hoạt động theo cách nào đó với người dùng nhưng không phổ biến phiên nhiều. Chỉ một phần mà bạn có thể tin tưởng vào quyền truy cập thông tin người dùng là khi người dùng thực sự đăng nhập và thực hiện điều gì đó trong bảng điều khiển tài khoản người dùng. Bên cạnh đó, nó có thể thua cuộc vì tài nguyên keycloak phát hành mã thông báo trong hầu hết các trường hợp sẽ xử lý các phiên liên quan đến máy khách hoặc máy khách.

Đến điểm - Tôi đến điểm mà tôi đã đặt nơi thực hiện phân tích định dạng nhật ký truy cập. Nó dựa trên Undertow Thuộc tính trao đổi ý tưởng cho phép mang macro của riêng bạn để ghi nhật ký. Macro này có thể được sử dụng để duyệt qua các cấu trúc bộ nhớ để theo đuổi thông tin cần thiết. Đối với tôi, đó là client_id đang thực hiện công việc. Vì điều đó tôi đã kết thúc với việc thực hiện một FormAttribute. Tôi vẫn cần tìm cách kết nối nó, nhưng từ góc độ thử nghiệm đơn vị, nó đã được "nhấp chuột", hãy xem mã cơ bản như thế nào:

gói org.code_house.wildfly.stuff.undertow.attributes;
// nhớ tạo META-INF/services/io.undertow.attribute.ExchangeAttributeBuilder
// với dòng chứa tên lớp, tức là.
// org.code_house.wildfly.stuff.undertow.attributes.FormAttribute$Builder

/**
 * Hiển thị các tham số biểu mẫu trong các thuộc tính trao đổi có thể được ghi vào nhật ký truy cập.
 * Sử dụng %{F,*} để kết xuất tất cả các tham số hoặc %{F,client_id} để hiển thị được chọn từ trường.
 *
 * @tác giả Åukasz Dywicki @ code-house.org
 **/
lớp công khai FormAttribute thực hiện ExchangeAttribute {

  chuỗi cuối cùng riêng tư paramName;

  công khai FormAttribute(String paramName) {
    this.paramName = paramName;
  }

  @Ghi đè
  chuỗi công khai readAttribution (trao đổi httpServerExchange) {
    FormData formData = exchange.getAttachment(FormDataParser.FORM_DATA);
    if ("*".equals(paramName)) {
      trả về "" + formData;
    }
    trả về formData == null? "" : "" + formData.get(paramName);
  }

  @Ghi đè
  public void writeAttribute(HttpServerExchange exchange, String newValue) ném ReadOnlyAttributeException {
    ném ngoại lệ ReadOnlyAttributeException mới("Biểu mẫu", giá trị mới);
  }

  public static final class Builder triển khai ExchangeAttributeBuilder {
    @Ghi đè
    tên chuỗi công khai () {
      Mẫu Trả Lại";
    }

    @Ghi đè
    bản dựng ExchangeAttribute công khai (mã thông báo Chuỗi cuối cùng) {
      if (token.startsWith("%{F,"") && token.endsWith("}")) {
        chuỗi cuối cùng paramName = token.substring(4, token.length() - 1);
        trả lại FormAttribution mới (paramName);
      }
      trả về giá trị rỗng;
    }

    @Ghi đè
    ưu tiên int công cộng () {
      trả về 0;
    }
  }
}

Điểm chính - bằng cách sử dụng thuộc tính biểu mẫu để ghi giá trị được nhập vào trường "tên người dùng" của biểu mẫu đăng nhập để lấy "ai", sau đó bạn có thể kết hợp điều đó với cookie phiên sẽ được trình duyệt giữ lại. Bằng cách hợp nhất cơ bản của hai con át chủ bài trên, bạn có thể đạt được kết quả cần thiết. Sử dụng kế hoạch chi tiết ở trên, bạn có thể triển khai thứ của riêng mình và theo dõi mã thông báo cũng như những thứ khác sẽ cho phép bạn xây dựng ứng dụng của mình.

Tôi có thể cập nhật câu trả lời khi tôi tìm thấy logic keo để đưa thuộc tính bổ sung vào định dạng nhật ký một cách chính xác. CHỈNH SỬA: Cho đến nay, chỉ có một cách tôi tìm thấy để thêm các thuộc tính bổ sung là sao chép chúng vào $JBOSS_HOME/modules/system/layers/base/org/wildfly/extension/undertow/main/ và cập nhật mô-đun.xml trong thư mục này:

<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>

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.