1
0
forked from baron/baron-sso

접속이력 브라우저 컬럼 추가

This commit is contained in:
2026-04-07 13:38:13 +09:00
parent 7b2004e05c
commit c95105f018
7 changed files with 72 additions and 20 deletions

View File

@@ -509,6 +509,7 @@ saved_success = "Saved successfully."
greeting = "Hello, {{name}}." greeting = "Hello, {{name}}."
[msg.userfront.audit] [msg.userfront.audit]
browser = "Browser: {{value}}"
date = "Date: {{value}}" date = "Date: {{value}}"
device = "Device: {{value}}" device = "Device: {{value}}"
end = "No more items to show." end = "No more items to show."
@@ -2058,6 +2059,7 @@ dev_console = "Dev Console"
action = "Action" action = "Action"
app = "App" app = "App"
auth_method = "Auth Method" auth_method = "Auth Method"
browser = "Browser"
date = "Date" date = "Date"
device = "Device" device = "Device"
ip = "IP" ip = "IP"
@@ -2286,4 +2288,4 @@ title = "Manage My Activity"
toggle_label = "Show active sessions only" toggle_label = "Show active sessions only"
[msg.userfront.audit.filter] [msg.userfront.audit.filter]
description = "Toggle to view only active sessions." description = "Toggle to view only active sessions."

View File

@@ -171,6 +171,7 @@ missing_jwks_uri = "JWKS URI를 입력해야 합니다."
private_key_jwt_requires_public_key = "서명 키 기반 인증을 사용하려면 JWKS URI가 필요합니다." private_key_jwt_requires_public_key = "서명 키 기반 인증을 사용하려면 JWKS URI가 필요합니다."
[msg.userfront.audit] [msg.userfront.audit]
browser = "브라우저: {{value}}"
date = "접속일자: {{value}}" date = "접속일자: {{value}}"
device = "접속환경: {{value}}" device = "접속환경: {{value}}"
end = "더 이상 항목이 없습니다." end = "더 이상 항목이 없습니다."
@@ -2452,6 +2453,7 @@ dev_console = "Dev Console"
action = "관리" action = "관리"
app = "애플리케이션" app = "애플리케이션"
auth_method = "인증수단" auth_method = "인증수단"
browser = "브라우저"
date = "접속일자" date = "접속일자"
device = "접속환경" device = "접속환경"
ip = "IP" ip = "IP"
@@ -2679,4 +2681,4 @@ title = "내 활동 관리"
toggle_label = "활성 세션만 보기" toggle_label = "활성 세션만 보기"
[msg.userfront.audit.filter] [msg.userfront.audit.filter]
description = "활성화된 세션만 보려면 토글을 켜주세요." description = "활성화된 세션만 보려면 토글을 켜주세요."

View File

@@ -44,6 +44,7 @@ missing = "No active session was found."
greeting = "Hello, {name}." greeting = "Hello, {name}."
[msg.userfront.audit] [msg.userfront.audit]
browser = "Browser: {value}"
date = "Date: {value}" date = "Date: {value}"
device = "Device: {value}" device = "Device: {value}"
end = "No more items to show." end = "No more items to show."
@@ -444,6 +445,7 @@ toggle_label = "Active only"
action = "Action" action = "Action"
app = "App" app = "App"
auth_method = "Auth Method" auth_method = "Auth Method"
browser = "Browser"
date = "Date" date = "Date"
device = "Device" device = "Device"
ip = "IP" ip = "IP"
@@ -668,4 +670,4 @@ action = "Go to sign-in"
[msg.userfront.audit.filter] [msg.userfront.audit.filter]
description = "Toggle to view only active sessions." description = "Toggle to view only active sessions."

View File

@@ -41,6 +41,7 @@ verify_code_failed = "인증 실패: {error}"
missing = "활성 세션이 없습니다." missing = "활성 세션이 없습니다."
[msg.userfront.audit] [msg.userfront.audit]
browser = "브라우저: {value}"
date = "접속일자: {value}" date = "접속일자: {value}"
device = "접속환경: {value}" device = "접속환경: {value}"
end = "더 이상 항목이 없습니다." end = "더 이상 항목이 없습니다."
@@ -647,6 +648,7 @@ toggle_label = "활성 세션만"
action = "관리" action = "관리"
app = "애플리케이션" app = "애플리케이션"
auth_method = "인증수단" auth_method = "인증수단"
browser = "브라우저"
date = "접속일자" date = "접속일자"
device = "접속환경" device = "접속환경"
ip = "IP" ip = "IP"
@@ -870,4 +872,4 @@ action = "로그인하기"
[msg.userfront.audit.filter] [msg.userfront.audit.filter]
description = "활성화된 세션만 보려면 토글을 켜주세요." description = "활성화된 세션만 보려면 토글을 켜주세요."

View File

@@ -223,6 +223,7 @@ title = ""
greeting = "" greeting = ""
[msg.userfront.audit] [msg.userfront.audit]
browser = ""
date = "" date = ""
device = "" device = ""
end = "" end = ""
@@ -622,6 +623,7 @@ toggle_label = ""
action = "" action = ""
app = "" app = ""
auth_method = "" auth_method = ""
browser = ""
date = "" date = ""
device = "" device = ""
ip = "" ip = ""
@@ -845,4 +847,4 @@ action = ""
[msg.userfront.audit.filter] [msg.userfront.audit.filter]
description = "" description = ""

View File

@@ -40,6 +40,8 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
static const double _historySessionMinWidth = 92; static const double _historySessionMinWidth = 92;
static const double _historyOtherColumnsBaselineWidth = 780; static const double _historyOtherColumnsBaselineWidth = 780;
static const int _historySessionMinVisibleChars = 8; static const int _historySessionMinVisibleChars = 8;
static const double _historyStatusColumnWidth = 92;
static const double _historyActionColumnWidth = 108;
final ScrollController _pageScrollController = ScrollController(); final ScrollController _pageScrollController = ScrollController();
final ScrollController _rpScrollController = ScrollController(); final ScrollController _rpScrollController = ScrollController();
@@ -1678,18 +1680,23 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
} }
Widget _buildHistoryStatusBadge(_HistorySessionStatus status) { Widget _buildHistoryStatusBadge(_HistorySessionStatus status) {
return Container( return SizedBox(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), width: _historyStatusColumnWidth,
decoration: BoxDecoration( child: Center(
color: _historySessionStatusColor(status), child: Container(
borderRadius: BorderRadius.circular(999), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
), decoration: BoxDecoration(
child: Text( color: _historySessionStatusColor(status),
_historySessionStatusLabel(status), borderRadius: BorderRadius.circular(999),
style: const TextStyle( ),
fontSize: 11, child: Text(
color: Colors.white, _historySessionStatusLabel(status),
fontWeight: FontWeight.w600, style: const TextStyle(
fontSize: 11,
color: Colors.white,
fontWeight: FontWeight.w600,
),
),
), ),
), ),
); );
@@ -1703,7 +1710,7 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
final canRevoke = final canRevoke =
!isCurrent && _revokingSessionId == null && session.isActive; !isCurrent && _revokingSessionId == null && session.isActive;
return SizedBox( return SizedBox(
width: 108, width: _historyActionColumnWidth,
child: OutlinedButton( child: OutlinedButton(
onPressed: canRevoke ? () => _onRevokeSession(session) : null, onPressed: canRevoke ? () => _onRevokeSession(session) : null,
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
@@ -1797,6 +1804,9 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
DataColumn( DataColumn(
label: Text(tr('ui.userfront.audit.table.device')), label: Text(tr('ui.userfront.audit.table.device')),
), ),
DataColumn(
label: Text(tr('ui.userfront.audit.table.browser')),
),
DataColumn( DataColumn(
label: Text(tr('ui.userfront.audit.table.auth_method')), label: Text(tr('ui.userfront.audit.table.auth_method')),
), ),
@@ -1804,10 +1814,20 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
label: Text(tr('ui.userfront.audit.table.result')), label: Text(tr('ui.userfront.audit.table.result')),
), ),
DataColumn( DataColumn(
label: Text(tr('ui.userfront.audit.table.status')), label: SizedBox(
width: _historyStatusColumnWidth,
child: Center(
child: Text(tr('ui.userfront.audit.table.status')),
),
),
), ),
DataColumn( DataColumn(
label: Text(tr('ui.userfront.audit.table.action')), label: SizedBox(
width: _historyActionColumnWidth,
child: Center(
child: Text(tr('ui.userfront.audit.table.action')),
),
),
), ),
], ],
rows: items.map((log) { rows: items.map((log) {
@@ -1828,6 +1848,7 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
final deviceLabel = _deviceLabelFromUserAgent( final deviceLabel = _deviceLabelFromUserAgent(
log.userAgent, log.userAgent,
); );
final browserLabel = _sessionBrowserLabel(log.userAgent);
return DataRow( return DataRow(
cells: [ cells: [
DataCell( DataCell(
@@ -1853,6 +1874,13 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
), ),
), ),
DataCell(_selectableText(deviceLabel)), DataCell(_selectableText(deviceLabel)),
DataCell(
_selectableText(
browserLabel.isEmpty
? tr('ui.common.hyphen', fallback: '-')
: browserLabel,
),
),
DataCell(_buildAuthMethodCell(log, authMethod)), DataCell(_buildAuthMethodCell(log, authMethod)),
DataCell( DataCell(
_selectableText( _selectableText(
@@ -2005,6 +2033,16 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
}, },
), ),
), ),
_selectableText(
tr(
'msg.userfront.audit.browser',
params: {
'value': _sessionBrowserLabel(log.userAgent).isEmpty
? tr('ui.common.hyphen', fallback: '-')
: _sessionBrowserLabel(log.userAgent),
},
),
),
_buildAuthMethodLine( _buildAuthMethodLine(
log, log,
log.authMethod.isNotEmpty log.authMethod.isNotEmpty

View File

@@ -413,6 +413,7 @@ const Map<String, String> koStrings = {
"msg.dev.sidebar.notice": "개발자 전용 콘솔입니다.", "msg.dev.sidebar.notice": "개발자 전용 콘솔입니다.",
"msg.dev.sidebar.notice_detail": "연동 앱 등록 및 관리를 수행할 수 있습니다.", "msg.dev.sidebar.notice_detail": "연동 앱 등록 및 관리를 수행할 수 있습니다.",
"msg.info.saved_success": "저장이 완료되었습니다.", "msg.info.saved_success": "저장이 완료되었습니다.",
"msg.userfront.audit.browser": "브라우저: {{value}}",
"msg.userfront.audit.date": "접속일자: {{value}}", "msg.userfront.audit.date": "접속일자: {{value}}",
"msg.userfront.audit.device": "접속환경: {{value}}", "msg.userfront.audit.device": "접속환경: {{value}}",
"msg.userfront.audit.end": "더 이상 항목이 없습니다.", "msg.userfront.audit.end": "더 이상 항목이 없습니다.",
@@ -1697,6 +1698,7 @@ const Map<String, String> koStrings = {
"ui.userfront.audit.table.action": "관리", "ui.userfront.audit.table.action": "관리",
"ui.userfront.audit.table.app": "애플리케이션", "ui.userfront.audit.table.app": "애플리케이션",
"ui.userfront.audit.table.auth_method": "인증수단", "ui.userfront.audit.table.auth_method": "인증수단",
"ui.userfront.audit.table.browser": "브라우저",
"ui.userfront.audit.table.date": "접속일자", "ui.userfront.audit.table.date": "접속일자",
"ui.userfront.audit.table.device": "접속환경", "ui.userfront.audit.table.device": "접속환경",
"ui.userfront.audit.table.ip": "IP", "ui.userfront.audit.table.ip": "IP",
@@ -2316,6 +2318,7 @@ const Map<String, String> enStrings = {
"msg.dev.sidebar.notice": "Developer Console", "msg.dev.sidebar.notice": "Developer Console",
"msg.dev.sidebar.notice_detail": "Register and manage client applications.", "msg.dev.sidebar.notice_detail": "Register and manage client applications.",
"msg.info.saved_success": "Saved successfully.", "msg.info.saved_success": "Saved successfully.",
"msg.userfront.audit.browser": "Browser: {{value}}",
"msg.userfront.audit.date": "Date: {{value}}", "msg.userfront.audit.date": "Date: {{value}}",
"msg.userfront.audit.device": "Device: {{value}}", "msg.userfront.audit.device": "Device: {{value}}",
"msg.userfront.audit.end": "No more items to show.", "msg.userfront.audit.end": "No more items to show.",
@@ -3705,6 +3708,7 @@ const Map<String, String> enStrings = {
"ui.userfront.audit.table.action": "Action", "ui.userfront.audit.table.action": "Action",
"ui.userfront.audit.table.app": "App", "ui.userfront.audit.table.app": "App",
"ui.userfront.audit.table.auth_method": "Auth Method", "ui.userfront.audit.table.auth_method": "Auth Method",
"ui.userfront.audit.table.browser": "Browser",
"ui.userfront.audit.table.date": "Date", "ui.userfront.audit.table.date": "Date",
"ui.userfront.audit.table.device": "Device", "ui.userfront.audit.table.device": "Device",
"ui.userfront.audit.table.ip": "IP", "ui.userfront.audit.table.ip": "IP",