Auth Locked
> **Skill Purpose:** Authentication and authorization security patterns with access control
SKILL.md
Full skill instructions
Auth Locked
Skill Purpose: Authentication and authorization security patterns with access control
Core Skill Pattern
Objective: Establish comprehensive authentication and authorization patterns with role-based access control, security policies, and cross-system integration.
Universal Pattern:
- Define authentication requirements and security policies
- Create authorization patterns and role-based access control
- Set up session management and token security
- Establish cross-department access verification
- Create security monitoring and audit procedures
Key Decisions (Project-Specific):
- Authentication methods and security requirements
- Role-based access control complexity
- Session management and token lifecycle
- Cross-system integration depth
- Security monitoring and audit requirements
Project-Specific Implementation Notes
Customize per project:
- Authentication methods based on user requirements
- Access control complexity based on data sensitivity
- Session security based on compliance requirements
- Cross-checks based on system integration needs
- Monitoring depth based on security requirements
Example Implementation (Authentication Security Pattern)
Note: This is an example pattern for authentication and authorization. Adapt security methods and access control based on your specific project requirements and compliance needs.
Prerequisites (Example)
- Authentication service configured
- User roles and permissions defined
- Security requirements established
- Cross-system integration points identified
Example: Authentication Security Implementation
Framework-Specific Example: This demonstrates authentication patterns. Adapt for your auth service and security requirements.
1. Authentication Configuration
// Authentication configuration
interface AuthConfig {
providers: AuthProvider[];
sessionDuration: number;
tokenRefreshThreshold: number;
mfaRequired: boolean;
passwordPolicy: PasswordPolicy;
}
interface AuthProvider {
name: string;
type: 'email' | 'oauth' | 'sso';
config: Record<string, any>;
}
interface PasswordPolicy {
minLength: number;
requireUppercase: boolean;
requireLowercase: boolean;
requireNumbers: boolean;
requireSymbols: boolean;
preventReuse: number;
}
// Example configuration
const authConfig: AuthConfig = {
providers: [
{ name: 'email', type: 'email', config: {} },
{ name: 'google', type: 'oauth', config: { clientId: process.env.GOOGLE_CLIENT_ID } }
],
sessionDuration: 24 * 60 * 60 * 1000, // 24 hours
tokenRefreshThreshold: 5 * 60 * 1000, // 5 minutes
mfaRequired: false,
passwordPolicy: {
minLength: 8,
requireUppercase: true,
requireLowercase: true,
requireNumbers: true,
requireSymbols: false,
preventReuse: 5
}
};
2. Role-Based Access Control
// Role and permission definitions
interface Role {
id: string;
name: string;
permissions: Permission[];
inherits?: string[];
}
interface Permission {
resource: string;
actions: ('create' | 'read' | 'update' | 'delete')[];
conditions?: AccessCondition[];
}
interface AccessCondition {
field: string;
operator: 'eq' | 'ne' | 'in' | 'nin';
value: any;
}
// Example roles
const roles: Role[] = [
{
id: 'admin',
name: 'Administrator',
permissions: [
{ resource: '*', actions: ['create', 'read', 'update', 'delete'] }
]
},
{
id: 'user',
name: 'User',
permissions: [
{ resource: 'profile', actions: ['read', 'update'] },
{ resource: 'content', actions: ['read'] }
]
},
{
id: 'moderator',
name: 'Moderator',
permissions: [
{ resource: 'profile', actions: ['read', 'update'] },
{ resource: 'content', actions: ['read', 'update'] },
{ resource: 'comments', actions: ['create', 'read', 'update', 'delete'] }
]
}
];
// Permission checking
function hasPermission(
userRole: Role,
resource: string,
action: string,
context?: Record<string, any>
): boolean {
// Check direct permissions
const permission = userRole.permissions.find(p =>
p.resource === resource || p.resource === '*'
);
if (!permission) return false;
if (!permission.actions.includes(action as any)) return false;
// Check conditions
if (permission.conditions && context) {
for (const condition of permission.conditions) {
const contextValue = context[condition.field];
if (!evaluateCondition(contextValue, condition)) {
return false;
}
}
}
return true;
}
function evaluateCondition(value: any, condition: AccessCondition): boolean {
switch (condition.operator) {
case 'eq': return value === condition.value;
case 'ne': return value !== condition.value;
case 'in': return Array.isArray(condition.value) && condition.value.includes(value);
case 'nin': return Array.isArray(condition.value) && !condition.value.includes(value);
default: return false;
}
}
3. Session Management
// Session management
interface Session {
id: string;
userId: string;
token: string;
refreshToken: string;
expiresAt: Date;
createdAt: Date;
lastActivity: Date;
ipAddress: string;
userAgent: string;
}
class SessionManager {
private sessions = new Map<string, Session>();
createSession(userId: string, token: string, refreshToken: string): Session {
const session: Session = {
id: generateId(),
userId,
token,
refreshToken,
expiresAt: new Date(Date.now() + authConfig.sessionDuration),
createdAt: new Date(),
lastActivity: new Date(),
ipAddress: '',
userAgent: ''
};
this.sessions.set(session.id, session);
return session;
}
validateSession(sessionId: string): Session | null {
const session = this.sessions.get(sessionId);
if (!session || session.expiresAt < new Date()) {
this.sessions.delete(sessionId);
return null;
}
session.lastActivity = new Date();
return session;
}
refreshSession(refreshToken: string): Session | null {
const session = Array.from(this.sessions.values())
.find(s => s.refreshToken === refreshToken);
if (!session) return null;
// Generate new tokens
const newToken = generateToken();
const newRefreshToken = generateRefreshToken();
session.token = newToken;
session.refreshToken = newRefreshToken;
session.expiresAt = new Date(Date.now() + authConfig.sessionDuration);
return session;
}
revokeSession(sessionId: string): void {
this.sessions.delete(sessionId);
}
revokeAllUserSessions(userId: string): void {
Array.from(this.sessions.entries())
.forEach(([id, session]) => {
if (session.userId === userId) {
this.sessions.delete(id);
}
});
}
}
4. Cross-Department Access Verification
// Cross-department access checks
interface CrossDepartmentCheck {
department: string;
resource: string;
requiredPermissions: string[];
checkFunction: (user: User, context: any) => Promise<boolean>;
}
class AccessController {
private crossChecks: CrossDepartmentCheck[] = [];
registerCrossCheck(check: CrossDepartmentCheck): void {
this.crossChecks.push(check);
}
async verifyCrossDepartmentAccess(
user: User,
department: string,
resource: string,
context: any
): Promise<boolean> {
const checks = this.crossChecks.filter(
check => check.department === department && check.resource === resource
);
for (const check of checks) {
const hasAccess = await check.checkFunction(user, context);
if (!hasAccess) {
return false;
}
}
return true;
}
}
// Example cross-department checks
const accessController = new AccessController();
// UI routes access check
accessController.registerCrossCheck({
department: 'ui',
resource: 'routes',
requiredPermissions: ['read'],
checkFunction: async (user, context) => {
// Check if user can access UI routes
const routePermissions = await getUserRoutePermissions(user.id);
return routePermissions.some(rp => rp.route === context.route && rp.canAccess);
}
});
// API endpoints access check
accessController.registerCrossCheck({
department: 'api',
resource: 'endpoints',
requiredPermissions: ['execute'],
checkFunction: async (user, context) => {
// Check if user can access API endpoints
const endpointPermissions = await getUserEndpointPermissions(user.id);
return endpointPermissions.some(ep => ep.endpoint === context.endpoint && ep.canExecute);
}
});
5. Security Monitoring
// Security monitoring and audit
interface SecurityEvent {
id: string;
type: 'login' | 'logout' | 'access_denied' | 'permission_change' | 'suspicious_activity';
userId?: string;
ipAddress: string;
userAgent: string;
timestamp: Date;
details: Record<string, any>;
}
class SecurityMonitor {
private events: SecurityEvent[] = [];
private suspiciousPatterns = new Map<string, number>();
logEvent(event: Omit<SecurityEvent, 'id' | 'timestamp'>): void {
const securityEvent: SecurityEvent = {
...event,
id: generateId(),
timestamp: new Date()
};
this.events.push(securityEvent);
this.analyzeForSuspiciousActivity(securityEvent);
}
private analyzeForSuspiciousActivity(event: SecurityEvent): void {
// Check for failed login attempts
if (event.type === 'access_denied') {
const key = `${event.ipAddress}:${event.type}`;
const count = (this.suspiciousPatterns.get(key) || 0) + 1;
this.suspiciousPatterns.set(key, count);
if (count > 5) { // Threshold for suspicious activity
this.handleSuspiciousActivity(event);
}
}
}
private handleSuspiciousActivity(event: SecurityEvent): void {
// Log suspicious activity
console.warn('Suspicious activity detected:', event);
// Could trigger additional security measures:
// - Lock account temporarily
// - Require additional authentication
// - Notify security team
// - Block IP address
}
getSecurityReport(timeRange: { start: Date; end: Date }): SecurityReport {
const eventsInRange = this.events.filter(
event => event.timestamp >= timeRange.start && event.timestamp <= timeRange.end
);
return {
totalEvents: eventsInRange.length,
eventsByType: this.groupEventsByType(eventsInRange),
suspiciousActivities: eventsInRange.filter(e => e.type === 'suspicious_activity'),
topIPAddresses: this.getTopIPAddresses(eventsInRange)
};
}
private groupEventsByType(events: SecurityEvent[]): Record<string, number> {
return events.reduce((acc, event) => {
acc[event.type] = (acc[event.type] || 0) + 1;
return acc;
}, {} as Record<string, number>);
}
private getTopIPAddresses(events: SecurityEvent[]): Array<{ ip: string; count: number }> {
const ipCounts = events.reduce((acc, event) => {
acc[event.ipAddress] = (acc[event.ipAddress] || 0) + 1;
return acc;
}, {} as Record<string, number>);
return Object.entries(ipCounts)
.map(([ip, count]) => ({ ip, count }))
.sort((a, b) => b.count - a.count)
.slice(0, 10);
}
}
interface SecurityReport {
totalEvents: number;
eventsByType: Record<string, number>;
suspiciousActivities: SecurityEvent[];
topIPAddresses: Array<{ ip: string; count: number }>;
}
6. Middleware Integration
// Authentication middleware for Next.js
import { NextRequest, NextResponse } from 'next/server';
export async function authMiddleware(request: NextRequest) {
const token = request.headers.get('authorization')?.replace('Bearer ', '');
if (!token) {
return NextResponse.json({ error: 'No token provided' }, { status: 401 });
}
try {
const user = await verifyToken(token);
const session = sessionManager.validateSession(user.sessionId);
if (!session) {
return NextResponse.json({ error: 'Invalid session' }, { status: 401 });
}
// Add user to request context
request.headers.set('x-user-id', user.id);
request.headers.set('x-user-role', user.role);
return NextResponse.next();
} catch (error) {
return NextResponse.json({ error: 'Invalid token' }, { status: 401 });
}
}
// Authorization middleware
export function authorizationMiddleware(requiredPermissions: string[]) {
return async (request: NextRequest) => {
const userId = request.headers.get('x-user-id');
const userRole = request.headers.get('x-user-role');
if (!userId || !userRole) {
return NextResponse.json({ error: 'Authentication required' }, { status: 401 });
}
const role = roles.find(r => r.id === userRole);
if (!role) {
return NextResponse.json({ error: 'Invalid role' }, { status: 403 });
}
// Check permissions
for (const permission of requiredPermissions) {
const [resource, action] = permission.split(':');
if (!hasPermission(role, resource, action)) {
return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
}
}
return NextResponse.next();
};
}
Integration Patterns
UI Department Integration
- Route protection and access control
- Component-level authorization
- User interface permission checks
API Department Integration
- Endpoint protection and authorization
- Request-level access control
- API rate limiting and security
Data Department Integration
- Row Level Security (RLS) policies
- Database access control
- Data encryption and privacy
Stop Conditions
STOP operations and escalate if:
- Authentication service compromised
- Unauthorized access patterns detected
- Security breach suspected
- Cross-department access conflicts
- Session hijacking detected
PAUSE operations if:
- Security audit in progress
- Authentication system maintenance
- Security policy updates
- Compliance review in progress
Security Best Practices
Authentication Security:
- Multi-factor authentication
- Strong password policies
- Session timeout management
- Token rotation and refresh
Authorization Security:
- Principle of least privilege
- Role-based access control
- Regular permission audits
- Cross-department access verification
Monitoring Security:
- Real-time threat detection
- Anomaly detection algorithms
- Security event logging
- Automated incident response
