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>