Security Feature Troubleshooting Guide¶
Doc Version: 1.0.2
Last Updated: 2026-05-21
Git Commit: 61384b4a
Author:
Overview¶
This document provides diagnosis and solutions for common JAiRouter security feature issues, including authentication failures, sanitization problems, performance issues, and more.
Quick Diagnosis¶
1. Check Security Feature Status¶
# Check system health
curl http://localhost:8080/actuator/health
# Check security configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/api/monitoring/health
2. View Logs¶
# View application logs
tail -f logs/jairouter.log
# View security audit logs
tail -f logs/security-audit.log
# View error logs
grep ERROR logs/jairouter.log
3. Check Monitoring Metrics¶
# View Prometheus metrics
curl http://localhost:8080/actuator/prometheus | grep security
# View authentication metrics
curl http://localhost:8080/actuator/prometheus | grep authentication
# View sanitization metrics
curl http://localhost:8080/actuator/prometheus | grep sanitization
Authentication Issues¶
Issue 1: API Key Authentication Failure¶
Symptoms¶
- Client receives
401 Unauthorizederror - Logs show
Invalid API KeyorAPI Key not found
Possible Causes¶
- API Key is incorrect or does not exist
- API Key has expired
- API Key has been disabled
- Request header name is incorrect
- API Key format is wrong
Diagnosis Steps¶
# 1. Check API Key configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/api-keys
# 2. Verify request header
curl -v -H "X-API-Key: your-api-key" \
http://localhost:8080/v1/models
# 3. Check API Key status
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/api-keys/your-key-id/status
Solutions¶
Check API Key value
Check expiration time
Enable API Key
Issue 2: JWT Authentication Failure¶
Symptoms¶
- Client receives
401 Unauthorizederror - Logs show
Invalid JWT tokenorJWT signature verification failed
Possible Causes¶
- JWT token format is incorrect
- Signature verification failed
- Token has expired
- Token is in the blacklist
- Secret key configuration is wrong
Diagnosis Steps¶
# 1. Parse JWT token
echo "your-jwt-token" | cut -d'.' -f2 | base64 -d | jq
# 2. Check token status
curl -H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"token": "your-jwt-token"}' \
http://localhost:8080/admin/security/jwt/validate
# 3. Check blacklist
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/jwt/blacklist
Solutions¶
Check JWT configuration
Refresh token
Clear blacklist
Issue 3: Insufficient Permissions¶
Symptoms¶
- Client receives
403 Forbiddenerror - Logs show
Insufficient permissions
Diagnosis Steps¶
# Check user permissions
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/permissions/your-user-id
# Check endpoint permission requirements
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/endpoints
Solutions¶
# Update user permissions
curl -X PUT -H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"permissions": ["read", "write", "admin"]}' \
http://localhost:8080/admin/security/api-keys/your-key-id/permissions
Data Sanitization Issues¶
Issue 4: Sanitization Not Working¶
Symptoms¶
- Sensitive data is not being sanitized
- Logs show sanitization rules not matched
Possible Causes¶
- Sanitization feature is not enabled
- Regular expression does not match
- Rule priority issue
Diagnosis Steps¶
# 1. Check sanitization configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/sanitization/config
# 2. Test sanitization rules
curl -X POST -H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"text": "My phone number is 13812345678", "rules": ["phone"]}' \
http://localhost:8080/admin/security/sanitization/test
Solutions¶
Enable sanitization feature
Fix regular expression
Issue 5: False Positive Sanitization¶
Symptoms¶
- Normal data is incorrectly sanitized
- Business functionality is affected
Diagnosis Steps¶
# Test sanitization result for specific text
curl -X POST -H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"text": "your-test-text"}' \
http://localhost:8080/admin/security/sanitization/test
Solutions¶
Make regular expression more precise
Adjust rule priority
Add exception rules
Performance Issues¶
Issue 6: Slow Authentication Response¶
Symptoms¶
- Authentication takes too long
- System response is slow
Diagnosis Steps¶
# Check authentication performance metrics
curl http://localhost:8080/actuator/prometheus | grep authentication_duration
# Check cache hit rate
curl http://localhost:8080/actuator/prometheus | grep cache_hit_rate
# Check thread pool status
curl http://localhost:8080/actuator/prometheus | grep thread_pool
Solutions¶
Enable caching
Optimize thread pool
Reduce API Key count
Issue 7: Sanitization Performance Issues¶
Symptoms¶
- Sanitization operation takes too long
- Memory usage is too high
Diagnosis Steps¶
🔑 Admin credentials are required**: the /actuator/** calls below go through the normal authentication chain — only
/actuator/health(including theliveness/readinesssub-paths),/actuator/infoand/actuator/prometheusare anonymous (for k8s probes and Prometheus scraping); everything else needs the ADMIN role. Without credentials you get401 AUTH_MISSING. (Before the fix even a valid ADMIN JWT got 401: the auth chain was excluded whilehasRole("ADMIN")was still required, so the two cancelled out — see issue #340.)Fetch a JWT and call the endpoint (verified locally):
# Check sanitization performance metrics
curl http://localhost:8080/actuator/prometheus | grep sanitization_duration
# Check memory usage
curl http://localhost:8080/actuator/metrics/jvm.memory.used
# Check regex cache
curl http://localhost:8080/actuator/prometheus | grep regex_cache
Solutions¶
Enable parallel processing
Optimize regular expressions
Enable streaming processing
Configuration Issues¶
Issue 8: Configuration Not Taking Effect¶
Symptoms¶
- Features don't change after modifying configuration
- System uses default configuration
Diagnosis Steps¶
# Check current configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/api/monitoring/config
# Check configuration file
cat src/main/resources/application.yml | grep -A 20 security
# Check environment variables
env | grep -i security
Solutions¶
Restart application
Check configuration priority
Validate YAML format
Issue 9: Environment Variables Not Working¶
Symptoms¶
- Environment variable values are not read
- Default values are used instead of environment variable values
Solutions¶
Check environment variable format
Check configuration reference
Reload environment variables
Monitoring and Alerting Issues¶
Issue 10: Missing Monitoring Metrics¶
Symptoms¶
- Prometheus metrics not showing
- Monitoring dashboard has no data
Solutions¶
Enable monitoring feature
Check Actuator configuration
Verify metrics endpoint
Issue 11: Alerts Not Triggering¶
Symptoms¶
- Threshold reached but no alert received
- Alert configuration not working
Solutions¶
Confirm alerts are enabled (on by default; when set to
falseneither alert bean is created)Confirm the criteria can hold — the four checks are driven differently:
- authentication-failure spikes and suspicious IPs are event driven (checked on the auth-failure path);
- sanitization growth (60-minute window) and JWT failures (10-minute window) are checked on a schedule, interval =
window-check-interval-ms(default 5 minutes).
Counting happens in the store, so it is not limited by how many rows are fetched; if the audit table holds no events of the relevant type (e.g. sanitization events not stored as DATA_SANITIZATION), the criterion stays at 0.
- Confirm the outlet — alerts only reach metrics and logs; there is no in-repo email/webhook delivery:
- metric
jairouter.security.violations(tagsviolationType/severity), scrapeGET /actuator/prometheus; - log line
安全告警触发: type=..., severity=...(WARN level).
Repeated hits of the same alert type are suppressed by cooldown-minutes (default 15).
- Multi-replica deployments: the window-aggregate checks are guarded by a distributed lock (
ScheduledTaskLock, keysecurity.alerts.window-checks); replicas that do not hold the lock stay silent — that is expected.
Debugging Tools and Tips¶
1. Enable Verbose Logging¶
logging:
level:
org.unreal.modelrouter.auth: DEBUG
org.springframework.security: DEBUG
org.springframework.web: DEBUG
2. Use Debug Endpoints¶
# Security status check
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/api/monitoring/health
# Configuration check
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/config/validate
# Performance analysis
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/performance/analyze
3. Log Analysis Script¶
#!/bin/bash
# security-log-analyzer.sh
LOG_FILE="logs/jairouter.log"
AUDIT_FILE="logs/security-audit.log"
echo "=== Authentication Failure Statistics ==="
grep "authentication failed" $LOG_FILE | wc -l
echo "=== Recent Authentication Errors ==="
grep "authentication failed" $LOG_FILE | tail -10
echo "=== Sanitization Operation Statistics ==="
grep "sanitization applied" $AUDIT_FILE | wc -l
echo "=== Performance Issue Check ==="
grep "timeout\|slow\|performance" $LOG_FILE | tail -10
4. Health Check Script¶
#!/bin/bash
# security-health-check.sh
BASE_URL="http://localhost:8080"
ADMIN_TOKEN="your-admin-token"
echo "=== System Health Check ==="
curl -s "$BASE_URL/actuator/health" | jq '.status'
echo "=== Security Feature Status ==="
curl -s -H "Authorization: Bearer $ADMIN_TOKEN" \
"$BASE_URL/admin/security/status" | jq
echo "=== Authentication Performance Metrics ==="
curl -s "$BASE_URL/actuator/prometheus" | \
grep "jairouter_security_authentication_duration_seconds"
echo "=== Sanitization Performance Metrics ==="
curl -s "$BASE_URL/actuator/prometheus" | \
grep "jairouter_security_sanitization_duration_seconds"
Common Commands Reference¶
Configuration Management¶
# Reload configuration
curl -X POST -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/config/reload
# Validate configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/config/validate
# Backup configuration
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/config/backup > config-backup.json
Cache Management¶
# Clear authentication cache
curl -X DELETE -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/cache/authentication
# Clear sanitization cache
curl -X DELETE -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/cache/sanitization
# View cache statistics
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/security/cache/stats
Log Management¶
# Set log level
curl -X POST -H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"level": "DEBUG"}' \
http://localhost:8080/actuator/loggers/org.unreal.modelrouter.auth
# Download logs
curl -H "Authorization: Bearer admin-token" \
http://localhost:8080/admin/logs/security-audit.log > audit.log
Contact Support¶
If the above solutions cannot resolve your issue, please contact technical support:
- GitHub Issues: https://github.com/Lincoln-cn/JAiRouter/issues
- Email Support: support@jairouter.com
- Documentation Center: https://jairouter.com
When submitting an issue, please include the following information: 1. Detailed description of the problem 2. Error logs 3. Configuration file (after sanitization) 4. System environment information 5. Steps to reproduce