@@ -94,6 +94,22 @@ has user => (
94
94
default => sub {
95
95
my $self = shift ;
96
96
return undef unless $self -> has_user_id;
97
+
98
+ # Check if we have cached user data first
99
+ my $session_data = Wing-> cache-> get($self -> key);
100
+ if (defined $session_data && ref $session_data eq ' HASH' &&
101
+ exists $session_data -> {user_data } && defined $session_data -> {user_data }) {
102
+ # Recreate user object from cached data
103
+ eval {
104
+ my $user = Wing::DB::Result::User-> user_from_json($self -> db, $session_data -> {user_data });
105
+ if ($user && !$user -> permanently_deactivated) {
106
+ $user -> current_session($self );
107
+ return $user ;
108
+ }
109
+ };
110
+ }
111
+
112
+ # Fall back to database lookup
97
113
my $user = $self -> db-> resultset(' User' )-> find($self -> user_id);
98
114
if (defined $user && ! $user -> permanently_deactivated) {
99
115
$user -> current_session($self );
@@ -132,6 +148,34 @@ sub check_permissions {
132
148
133
149
sub extend {
134
150
my $self = shift ;
151
+
152
+ # Check if user data has changed
153
+ my $user_changed_key = ' user-changed-' . $self -> user_id;
154
+ if (Wing-> cache-> get($user_changed_key )) {
155
+ # User data has changed, need to refresh
156
+ my $user = $self -> db-> resultset(' User' )-> find($self -> user_id);
157
+
158
+ if (!defined $user || $user -> permanently_deactivated) {
159
+ # User no longer exists or is deactivated
160
+ $self -> end;
161
+ }
162
+
163
+ # Check if password has changed
164
+ elsif ($self -> password_hash ne $user -> password) {
165
+ Wing-> log -> debug(" SESSION: Password changed for user id:" . $self -> user_id . " , ending session" );
166
+ $self -> end;
167
+ }
168
+
169
+ # Password hasn't changed, update the cached user data
170
+ else {
171
+ $user -> current_session($self );
172
+ $self -> user($user );
173
+ $self -> clear_user; # Clear the cached user attribute so it will reload
174
+ }
175
+ # Remove the user-changed marker
176
+ Wing-> cache-> remove($user_changed_key );
177
+ }
178
+
135
179
if ($self -> password_hash ne $self -> user-> password) {
136
180
Wing-> log -> debug(" SESSION: Password hashes do not match, ending session for user id:" . $self -> user-> id);
137
181
Wing-> log -> debug(" SESSION: Password hash sample: " .substr ($self -> password_hash,0,5));
@@ -150,6 +194,7 @@ sub extend {
150
194
api_key_id => $self -> api_key_id,
151
195
ip_address => $self -> ip_address,
152
196
session_id => $self -> id,
197
+ user_data => $self -> user-> user_to_json,
153
198
},
154
199
60 * 60 * 24 * 7,
155
200
);
0 commit comments