Deployed 526eea84 to 6.0 with MkDocs 1.4.0 and mike 1.1.2
[GitHub/WoltLab/woltlab.github.io.git] / 6.0 / migration / wsc53 / session / index.html
CommitLineData
9aa5da67
WG
1
2<!doctype html>
3<html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9
10
11 <link rel="canonical" href="https://docs.woltlab.com/6.0/migration/wsc53/session/">
12
13 <link rel="icon" href="../../../assets/default.favicon.ico">
d502f611 14 <meta name="generator" content="mkdocs-1.4.0, mkdocs-material-8.5.4">
9aa5da67
WG
15
16
17
18 <title>Session Handling and Authentication - WoltLab Suite Documentation</title>
19
20
21
a277f2e9 22 <link rel="stylesheet" href="../../../assets/stylesheets/main.80dcb947.min.css">
9aa5da67
WG
23
24
25 <link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
26
27
28
29 <meta name="theme-color" content="#009485">
30
31
32
7f9945cf 33
9aa5da67
WG
34
35
36
37
38
39
40 <link rel="stylesheet" href="../../../stylesheets/extra.css">
41
a06fd3b1 42 <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
9aa5da67
WG
43
44
45
46
47
7f9945cf 48
9aa5da67
WG
49 </head>
50
51
52
53
54
55
56
57 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
58
59
60
61 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
62 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
63 <label class="md-overlay" for="__drawer"></label>
64 <div data-md-component="skip">
65
66
67 <a href="#migrating-from-woltlab-suite-53-session-handling-and-authentication" class="md-skip">
68 Skip to content
69 </a>
70
71 </div>
72 <div data-md-component="announce">
73
74 <aside class="md-banner">
75 <div class="md-banner__inner md-grid md-typeset">
76
a06fd3b1 77
9aa5da67
WG
78 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
79
80 </div>
a06fd3b1 81
9aa5da67
WG
82 </aside>
83
84 </div>
85
86 <div data-md-component="outdated" hidden>
a06fd3b1 87
9aa5da67
WG
88 </div>
89
90
91
92
93<header class="md-header" data-md-component="header">
94 <nav class="md-header__inner md-grid" aria-label="Header">
95 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
96
97 <img src="../../../assets/logo.png" alt="logo">
98
99 </a>
100 <label class="md-header__button md-icon" for="__drawer">
101 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
102 </label>
103 <div class="md-header__title" data-md-component="header-title">
104 <div class="md-header__ellipsis">
105 <div class="md-header__topic">
106 <span class="md-ellipsis">
107 WoltLab Suite Documentation
108 </span>
109 </div>
110 <div class="md-header__topic" data-md-component="header-topic">
111 <span class="md-ellipsis">
112
113 Session Handling and Authentication
114
115 </span>
116 </div>
117 </div>
118 </div>
119
120
121
122 <label class="md-header__button md-icon" for="__search">
123 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
124 </label>
125 <div class="md-search" data-md-component="search" role="dialog">
126 <label class="md-search__overlay" for="__search"></label>
127 <div class="md-search__inner" role="search">
128 <form class="md-search__form" name="search">
129 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
130 <label class="md-search__icon md-icon" for="__search">
131 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
132 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
133 </label>
134 <nav class="md-search__options" aria-label="Search">
135
7f9945cf 136 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
9aa5da67
WG
137 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
138 </button>
139 </nav>
140
141 </form>
142 <div class="md-search__output">
143 <div class="md-search__scrollwrap" data-md-scrollfix>
144 <div class="md-search-result" data-md-component="search-result">
145 <div class="md-search-result__meta">
146 Initializing search
147 </div>
148 <ol class="md-search-result__list"></ol>
149 </div>
150 </div>
151 </div>
152 </div>
153</div>
154
155
156 <div class="md-header__source">
157 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
158 <div class="md-source__icon md-icon">
159
7f9945cf 160 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
9aa5da67
WG
161 </div>
162 <div class="md-source__repository">
163 GitHub
164 </div>
165</a>
166 </div>
167
168 </nav>
169
170</header>
171
172 <div class="md-container" data-md-component="container">
173
174
175
176
177
178
179 <main class="md-main" data-md-component="main">
180 <div class="md-main__inner md-grid">
181
182
183
184 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
185 <div class="md-sidebar__scrollwrap">
186 <div class="md-sidebar__inner">
187
188
189
190<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
191 <label class="md-nav__title" for="__drawer">
192 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
193
194 <img src="../../../assets/logo.png" alt="logo">
195
196 </a>
197 WoltLab Suite Documentation
198 </label>
199
200 <div class="md-nav__source">
201 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
7f9945cf 204 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
9aa5da67
WG
205 </div>
206 <div class="md-source__repository">
207 GitHub
208 </div>
209</a>
210 </div>
211
212 <ul class="md-nav__list" data-md-scrollfix>
213
214
215
216
217
218
219
220
221 <li class="md-nav__item">
222 <a href="../../../getting-started/" class="md-nav__link">
223 Getting Started
224 </a>
225 </li>
226
227
228
229
230
231
232
233
234
235
236
237 <li class="md-nav__item md-nav__item--nested">
238
239
240 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
241
242
243
244
245 <label class="md-nav__link" for="__nav_2">
246 PHP API
247 <span class="md-nav__icon md-icon"></span>
248 </label>
249
250 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
251 <label class="md-nav__title" for="__nav_2">
252 <span class="md-nav__icon md-icon"></span>
253 PHP API
254 </label>
255 <ul class="md-nav__list" data-md-scrollfix>
256
257
258
259
260
261
262 <li class="md-nav__item">
263 <a href="../../../php/pages/" class="md-nav__link">
264 Pages
265 </a>
266 </li>
267
268
269
270
271
272
273
274
275
276 <li class="md-nav__item">
277 <a href="../../../php/database-objects/" class="md-nav__link">
278 Database Objects
279 </a>
280 </li>
281
282
283
284
285
286
287
288
289
290 <li class="md-nav__item">
291 <a href="../../../php/database-access/" class="md-nav__link">
292 Database Access
293 </a>
294 </li>
295
296
297
298
299
300
301
302
303
304 <li class="md-nav__item">
305 <a href="../../../php/exceptions/" class="md-nav__link">
306 Exceptions
307 </a>
308 </li>
309
310
311
312
313
314
315
316
317
318
319 <li class="md-nav__item md-nav__item--nested">
320
321
322 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" >
323
324
325
326
327 <label class="md-nav__link" for="__nav_2_5">
328 API
329 <span class="md-nav__icon md-icon"></span>
330 </label>
331
332 <nav class="md-nav" aria-label="API" data-md-level="2">
333 <label class="md-nav__title" for="__nav_2_5">
334 <span class="md-nav__icon md-icon"></span>
335 API
336 </label>
337 <ul class="md-nav__list" data-md-scrollfix>
338
339
340
341
342
343
344
345 <li class="md-nav__item md-nav__item--nested">
346
347
348 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_1" type="checkbox" id="__nav_2_5_1" >
349
350
351
352
353 <label class="md-nav__link" for="__nav_2_5_1">
354 Caches
355 <span class="md-nav__icon md-icon"></span>
356 </label>
357
358 <nav class="md-nav" aria-label="Caches" data-md-level="3">
359 <label class="md-nav__title" for="__nav_2_5_1">
360 <span class="md-nav__icon md-icon"></span>
361 Caches
362 </label>
363 <ul class="md-nav__list" data-md-scrollfix>
364
365
366
367
368
369
370 <li class="md-nav__item">
371 <a href="../../../php/api/caches/" class="md-nav__link">
372 Overview
373 </a>
374 </li>
375
376
377
378
379
380
381
382
383
384 <li class="md-nav__item">
385 <a href="../../../php/api/caches_persistent-caches/" class="md-nav__link">
386 Persistent Caches
387 </a>
388 </li>
389
390
391
392
393
394
395
396
397
398 <li class="md-nav__item">
399 <a href="../../../php/api/caches_runtime-caches/" class="md-nav__link">
400 Runtime Caches
401 </a>
402 </li>
403
404
405
406
407 </ul>
408 </nav>
409 </li>
410
411
412
413
414
415
416
417
418
419 <li class="md-nav__item">
420 <a href="../../../php/api/comments/" class="md-nav__link">
421 Comments
422 </a>
423 </li>
424
425
426
427
428
429
430
431
432
433 <li class="md-nav__item">
434 <a href="../../../php/api/cronjobs/" class="md-nav__link">
435 Cronjobs
436 </a>
437 </li>
438
439
440
441
442
443
444
445
446
447 <li class="md-nav__item">
448 <a href="../../../php/api/events/" class="md-nav__link">
449 Events
450 </a>
451 </li>
452
453
454
455
456
457
458
459
460
461
462 <li class="md-nav__item md-nav__item--nested">
463
464
465 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
466
467
468
469
470 <label class="md-nav__link" for="__nav_2_5_5">
471 Form Builder
472 <span class="md-nav__icon md-icon"></span>
473 </label>
474
475 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
476 <label class="md-nav__title" for="__nav_2_5_5">
477 <span class="md-nav__icon md-icon"></span>
478 Form Builder
479 </label>
480 <ul class="md-nav__list" data-md-scrollfix>
481
482
483
484
485
486
487 <li class="md-nav__item">
488 <a href="../../../php/api/form_builder/overview/" class="md-nav__link">
489 Overview
490 </a>
491 </li>
492
493
494
495
496
497
498
499
500
501 <li class="md-nav__item">
502 <a href="../../../php/api/form_builder/structure/" class="md-nav__link">
503 Structure
504 </a>
505 </li>
506
507
508
509
510
511
512
513
514
515 <li class="md-nav__item">
516 <a href="../../../php/api/form_builder/form_fields/" class="md-nav__link">
517 Fields
518 </a>
519 </li>
520
521
522
523
524
525
526
527
528
529 <li class="md-nav__item">
530 <a href="../../../php/api/form_builder/validation_data/" class="md-nav__link">
531 Validation and Data
532 </a>
533 </li>
534
535
536
537
538
539
540
541
542
543 <li class="md-nav__item">
544 <a href="../../../php/api/form_builder/dependencies/" class="md-nav__link">
545 Dependencies
546 </a>
547 </li>
548
549
550
551
552 </ul>
553 </nav>
554 </li>
555
556
557
558
559
560
561
562
563
564 <li class="md-nav__item">
565 <a href="../../../php/api/package_installation_plugins/" class="md-nav__link">
566 Package Installation Plugins
567 </a>
568 </li>
569
570
571
572
573
574
575
576
577
578 <li class="md-nav__item">
579 <a href="../../../php/api/user_activity_points/" class="md-nav__link">
580 User Activity Points
581 </a>
582 </li>
583
584
585
586
587
588
589
590
591
592 <li class="md-nav__item">
593 <a href="../../../php/api/user_notifications/" class="md-nav__link">
594 User Notifications
595 </a>
596 </li>
597
598
599
600
601
602
603
604
605
606 <li class="md-nav__item">
607 <a href="../../../php/api/sitemaps/" class="md-nav__link">
608 Sitemaps
609 </a>
610 </li>
611
612
613
614
615 </ul>
616 </nav>
617 </li>
618
619
620
621
622
623
624
625
626
627 <li class="md-nav__item">
628 <a href="../../../php/code-style/" class="md-nav__link">
629 Code Style
630 </a>
631 </li>
632
633
634
635
636
637
638
639
640
641 <li class="md-nav__item">
642 <a href="../../../php/apps/" class="md-nav__link">
643 Apps
644 </a>
645 </li>
646
647
648
649
650
651
652
653
654
655 <li class="md-nav__item">
656 <a href="../../../php/gdpr/" class="md-nav__link">
657 GDPR
658 </a>
659 </li>
660
661
662
663
664 </ul>
665 </nav>
666 </li>
667
668
669
670
671
672
673
674
675
676
677
678 <li class="md-nav__item md-nav__item--nested">
679
680
681 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
682
683
684
685
686 <label class="md-nav__link" for="__nav_3">
687 Languages, Templates & CSS
688 <span class="md-nav__icon md-icon"></span>
689 </label>
690
691 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
692 <label class="md-nav__title" for="__nav_3">
693 <span class="md-nav__icon md-icon"></span>
694 Languages, Templates & CSS
695 </label>
696 <ul class="md-nav__list" data-md-scrollfix>
697
698
699
700
701
702
703 <li class="md-nav__item">
704 <a href="../../../view/languages/" class="md-nav__link">
705 Languages
706 </a>
707 </li>
708
709
710
711
712
713
714
715
716
717 <li class="md-nav__item">
718 <a href="../../../view/templates/" class="md-nav__link">
719 Templates
720 </a>
721 </li>
722
723
724
725
726
727
728
729
730
731 <li class="md-nav__item">
732 <a href="../../../view/template-plugins/" class="md-nav__link">
733 Template Plugins
734 </a>
735 </li>
736
737
738
739
740
741
742
743
744
745 <li class="md-nav__item">
746 <a href="../../../view/css/" class="md-nav__link">
747 CSS
748 </a>
749 </li>
750
751
752
753
754 </ul>
755 </nav>
756 </li>
757
758
759
760
761
762
763
764
765
766
767
768 <li class="md-nav__item md-nav__item--nested">
769
770
771 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
772
773
774
775
776 <label class="md-nav__link" for="__nav_4">
777 TypeScript and JavaScript API
778 <span class="md-nav__icon md-icon"></span>
779 </label>
780
781 <nav class="md-nav" aria-label="TypeScript and JavaScript API" data-md-level="1">
782 <label class="md-nav__title" for="__nav_4">
783 <span class="md-nav__icon md-icon"></span>
784 TypeScript and JavaScript API
785 </label>
786 <ul class="md-nav__list" data-md-scrollfix>
787
788
789
790
791
792
793 <li class="md-nav__item">
794 <a href="../../../javascript/general-usage/" class="md-nav__link">
795 General Usage
796 </a>
797 </li>
798
799
800
801
802
803
804
805
806
807 <li class="md-nav__item">
808 <a href="../../../javascript/typescript/" class="md-nav__link">
809 TypeScript
810 </a>
811 </li>
812
813
814
815
816
817
818
819
820
821
822 <li class="md-nav__item md-nav__item--nested">
823
824
825 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
826
827
828
829
830 <label class="md-nav__link" for="__nav_4_3">
9f399714
WG
831 Components
832 <span class="md-nav__icon md-icon"></span>
833 </label>
834
835 <nav class="md-nav" aria-label="Components" data-md-level="2">
836 <label class="md-nav__title" for="__nav_4_3">
837 <span class="md-nav__icon md-icon"></span>
838 Components
839 </label>
840 <ul class="md-nav__list" data-md-scrollfix>
841
842
843
844
845
846
847 <li class="md-nav__item">
848 <a href="../../../javascript/components_confirmation/" class="md-nav__link">
849 Confirmation
850 </a>
851 </li>
852
853
854
855
856
857
858
859
860
861 <li class="md-nav__item">
862 <a href="../../../javascript/components_dialog/" class="md-nav__link">
863 Dialog
864 </a>
865 </li>
866
867
868
869
870 </ul>
871 </nav>
872 </li>
873
874
875
876
877
878
879
880
881
882
883 <li class="md-nav__item md-nav__item--nested">
884
885
886 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
887
888
889
890
891 <label class="md-nav__link" for="__nav_4_4">
9aa5da67
WG
892 New API
893 <span class="md-nav__icon md-icon"></span>
894 </label>
895
896 <nav class="md-nav" aria-label="New API" data-md-level="2">
9f399714 897 <label class="md-nav__title" for="__nav_4_4">
9aa5da67
WG
898 <span class="md-nav__icon md-icon"></span>
899 New API
900 </label>
901 <ul class="md-nav__list" data-md-scrollfix>
902
903
904
905
906
907
908 <li class="md-nav__item">
909 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
910 Writing a module
911 </a>
912 </li>
913
914
915
916
917
918
919
920
921
922 <li class="md-nav__item">
923 <a href="../../../javascript/new-api_data-structures/" class="md-nav__link">
924 Data Structures
925 </a>
926 </li>
927
928
929
930
931
932
933
934
935
936 <li class="md-nav__item">
937 <a href="../../../javascript/new-api_core/" class="md-nav__link">
938 Core Functions
939 </a>
940 </li>
941
942
943
944
945
946
947
948
949
950 <li class="md-nav__item">
951 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
952 DOM
953 </a>
954 </li>
955
956
957
958
959
960
961
962
963
964 <li class="md-nav__item">
965 <a href="../../../javascript/new-api_events/" class="md-nav__link">
966 Event Handling
967 </a>
968 </li>
969
970
971
972
973
974
975
976
977
978 <li class="md-nav__item">
979 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
980 Ajax
981 </a>
982 </li>
983
984
985
986
987
988
989
990
991
992 <li class="md-nav__item">
993 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
994 Dialogs
995 </a>
996 </li>
997
998
999
1000
1001
1002
1003
1004
1005
1006 <li class="md-nav__item">
1007 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
1008 Browser and Screen Sizes
1009 </a>
1010 </li>
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 <li class="md-nav__item">
1021 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
1022 User Interface
1023 </a>
1024 </li>
1025
1026
1027
1028
1029 </ul>
1030 </nav>
1031 </li>
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041 <li class="md-nav__item">
1042 <a href="../../../javascript/legacy-api/" class="md-nav__link">
1043 Legacy API
1044 </a>
1045 </li>
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 <li class="md-nav__item">
1056 <a href="../../../javascript/helper-functions/" class="md-nav__link">
1057 Helper Functions
1058 </a>
1059 </li>
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069 <li class="md-nav__item">
1070 <a href="../../../javascript/code-snippets/" class="md-nav__link">
1071 Code Snippets
1072 </a>
1073 </li>
1074
1075
1076
1077
1078 </ul>
1079 </nav>
1080 </li>
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092 <li class="md-nav__item md-nav__item--nested">
1093
1094
1095 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
1096
1097
1098
1099
1100 <label class="md-nav__link" for="__nav_5">
1101 Package Components
1102 <span class="md-nav__icon md-icon"></span>
1103 </label>
1104
1105 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
1106 <label class="md-nav__title" for="__nav_5">
1107 <span class="md-nav__icon md-icon"></span>
1108 Package Components
1109 </label>
1110 <ul class="md-nav__list" data-md-scrollfix>
1111
1112
1113
1114
1115
1116
1117 <li class="md-nav__item">
1118 <a href="../../../package/package-xml/" class="md-nav__link">
1119 package.xml
1120 </a>
1121 </li>
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132 <li class="md-nav__item md-nav__item--nested">
1133
1134
1135 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
1136
1137
1138
1139
1140 <label class="md-nav__link" for="__nav_5_2">
1141 PIPs
1142 <span class="md-nav__icon md-icon"></span>
1143 </label>
1144
1145 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
1146 <label class="md-nav__title" for="__nav_5_2">
1147 <span class="md-nav__icon md-icon"></span>
1148 PIPs
1149 </label>
1150 <ul class="md-nav__list" data-md-scrollfix>
1151
1152
1153
1154
1155
1156
1157 <li class="md-nav__item">
1158 <a href="../../../package/pip/" class="md-nav__link">
1159 Overview
1160 </a>
1161 </li>
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 <li class="md-nav__item">
1172 <a href="../../../package/pip/acl-option/" class="md-nav__link">
1173 aclOption
1174 </a>
1175 </li>
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185 <li class="md-nav__item">
1186 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
1187 acpMenu
1188 </a>
1189 </li>
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199 <li class="md-nav__item">
1200 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
1201 acpSearchProvider
1202 </a>
1203 </li>
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213 <li class="md-nav__item">
1214 <a href="../../../package/pip/acp-template/" class="md-nav__link">
1215 acpTemplate
1216 </a>
1217 </li>
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 <li class="md-nav__item">
1228 <a href="../../../package/pip/acp-template-delete/" class="md-nav__link">
1229 acpTemplateDelete
1230 </a>
1231 </li>
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 <li class="md-nav__item">
1242 <a href="../../../package/pip/bbcode/" class="md-nav__link">
1243 bbcode
1244 </a>
1245 </li>
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255 <li class="md-nav__item">
1256 <a href="../../../package/pip/box/" class="md-nav__link">
1257 box
1258 </a>
1259 </li>
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269 <li class="md-nav__item">
1270 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
1271 clipboardAction
1272 </a>
1273 </li>
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283 <li class="md-nav__item">
1284 <a href="../../../package/pip/core-object/" class="md-nav__link">
1285 coreObject
1286 </a>
1287 </li>
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297 <li class="md-nav__item">
1298 <a href="../../../package/pip/cronjob/" class="md-nav__link">
1299 cronjob
1300 </a>
1301 </li>
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 <li class="md-nav__item">
1312 <a href="../../../package/pip/database/" class="md-nav__link">
1313 database
1314 </a>
1315 </li>
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325 <li class="md-nav__item">
1326 <a href="../../../package/pip/event-listener/" class="md-nav__link">
1327 eventListener
1328 </a>
1329 </li>
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339 <li class="md-nav__item">
1340 <a href="../../../package/pip/file/" class="md-nav__link">
1341 file
1342 </a>
1343 </li>
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353 <li class="md-nav__item">
1354 <a href="../../../package/pip/file-delete/" class="md-nav__link">
1355 fileDelete
1356 </a>
1357 </li>
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367 <li class="md-nav__item">
1368 <a href="../../../package/pip/language/" class="md-nav__link">
1369 language
1370 </a>
1371 </li>
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381 <li class="md-nav__item">
1382 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1383 mediaProvider
1384 </a>
1385 </li>
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395 <li class="md-nav__item">
1396 <a href="../../../package/pip/menu/" class="md-nav__link">
1397 menu
1398 </a>
1399 </li>
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409 <li class="md-nav__item">
1410 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1411 menuItem
1412 </a>
1413 </li>
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423 <li class="md-nav__item">
1424 <a href="../../../package/pip/object-type/" class="md-nav__link">
1425 objectType
1426 </a>
1427 </li>
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437 <li class="md-nav__item">
1438 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1439 objectTypeDefinition
1440 </a>
1441 </li>
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451 <li class="md-nav__item">
1452 <a href="../../../package/pip/option/" class="md-nav__link">
1453 option
1454 </a>
1455 </li>
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465 <li class="md-nav__item">
1466 <a href="../../../package/pip/page/" class="md-nav__link">
1467 page
1468 </a>
1469 </li>
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479 <li class="md-nav__item">
1480 <a href="../../../package/pip/pip/" class="md-nav__link">
1481 pip
1482 </a>
1483 </li>
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493 <li class="md-nav__item">
1494 <a href="../../../package/pip/script/" class="md-nav__link">
1495 script
1496 </a>
1497 </li>
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507 <li class="md-nav__item">
1508 <a href="../../../package/pip/smiley/" class="md-nav__link">
1509 smiley
1510 </a>
1511 </li>
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521 <li class="md-nav__item">
1522 <a href="../../../package/pip/sql/" class="md-nav__link">
1523 sql
1524 </a>
1525 </li>
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535 <li class="md-nav__item">
1536 <a href="../../../package/pip/style/" class="md-nav__link">
1537 style
1538 </a>
1539 </li>
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549 <li class="md-nav__item">
1550 <a href="../../../package/pip/template/" class="md-nav__link">
1551 template
1552 </a>
1553 </li>
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563 <li class="md-nav__item">
1564 <a href="../../../package/pip/template-delete/" class="md-nav__link">
1565 templateDelete
1566 </a>
1567 </li>
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577 <li class="md-nav__item">
1578 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1579 templateListener
1580 </a>
1581 </li>
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591 <li class="md-nav__item">
1592 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1593 userGroupOption
1594 </a>
1595 </li>
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605 <li class="md-nav__item">
1606 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1607 userMenu
1608 </a>
1609 </li>
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619 <li class="md-nav__item">
1620 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1621 userNotificationEvent
1622 </a>
1623 </li>
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633 <li class="md-nav__item">
1634 <a href="../../../package/pip/user-option/" class="md-nav__link">
1635 userOption
1636 </a>
1637 </li>
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647 <li class="md-nav__item">
1648 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1649 userProfileMenu
1650 </a>
1651 </li>
1652
1653
1654
1655
1656 </ul>
1657 </nav>
1658 </li>
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668 <li class="md-nav__item">
1669 <a href="../../../package/database-php-api/" class="md-nav__link">
1670 Database PHP API
1671 </a>
1672 </li>
1673
1674
1675
1676
1677 </ul>
1678 </nav>
1679 </li>
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
1694
1695
1696 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" checked>
1697
1698
1699
1700
1701 <label class="md-nav__link" for="__nav_6">
1702 Migration
1703 <span class="md-nav__icon md-icon"></span>
1704 </label>
1705
1706 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1707 <label class="md-nav__title" for="__nav_6">
1708 <span class="md-nav__icon md-icon"></span>
1709 Migration
1710 </label>
1711 <ul class="md-nav__list" data-md-scrollfix>
1712
1713
1714
1715
1716
1717
1718
1719 <li class="md-nav__item md-nav__item--nested">
1720
1721
1722 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1723
1724
1725
1726
1727 <label class="md-nav__link" for="__nav_6_1">
1728 From WoltLab Suite 5.5
1729 <span class="md-nav__icon md-icon"></span>
1730 </label>
1731
1732 <nav class="md-nav" aria-label="From WoltLab Suite 5.5" data-md-level="2">
1733 <label class="md-nav__title" for="__nav_6_1">
1734 <span class="md-nav__icon md-icon"></span>
1735 From WoltLab Suite 5.5
1736 </label>
1737 <ul class="md-nav__list" data-md-scrollfix>
1738
1739
1740
1741
1742
1743
1744 <li class="md-nav__item">
1745 <a href="../../wsc55/php/" class="md-nav__link">
1746 PHP API
1747 </a>
1748 </li>
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758 <li class="md-nav__item">
1759 <a href="../../wsc55/javascript/" class="md-nav__link">
1760 TypeScript and JavaScript
1761 </a>
1762 </li>
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772 <li class="md-nav__item">
1773 <a href="../../wsc55/templates/" class="md-nav__link">
1774 Templates
1775 </a>
1776 </li>
1777
1778
1779
1780
1781
1782
1783
1784
1785
024038ef
WG
1786 <li class="md-nav__item">
1787 <a href="../../wsc55/icons/" class="md-nav__link">
1788 Icons
1789 </a>
1790 </li>
1791
1792
1793
1794
1795
1796
1797
1798
1799
9aa5da67
WG
1800 <li class="md-nav__item">
1801 <a href="../../wsc55/libraries/" class="md-nav__link">
1802 Third Party Libraries
1803 </a>
1804 </li>
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814 <li class="md-nav__item">
1815 <a href="../../wsc55/deprecations_removals/" class="md-nav__link">
1816 Deprecations and Removals
1817 </a>
1818 </li>
1819
1820
1821
1822
1823 </ul>
1824 </nav>
1825 </li>
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836 <li class="md-nav__item md-nav__item--nested">
1837
1838
1839 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1840
1841
1842
1843
1844 <label class="md-nav__link" for="__nav_6_2">
1845 From WoltLab Suite 5.4
1846 <span class="md-nav__icon md-icon"></span>
1847 </label>
1848
1849 <nav class="md-nav" aria-label="From WoltLab Suite 5.4" data-md-level="2">
1850 <label class="md-nav__title" for="__nav_6_2">
1851 <span class="md-nav__icon md-icon"></span>
1852 From WoltLab Suite 5.4
1853 </label>
1854 <ul class="md-nav__list" data-md-scrollfix>
1855
1856
1857
1858
1859
1860
1861 <li class="md-nav__item">
1862 <a href="../../wsc54/php/" class="md-nav__link">
1863 PHP API
1864 </a>
1865 </li>
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875 <li class="md-nav__item">
1876 <a href="../../wsc54/javascript/" class="md-nav__link">
1877 TypeScript and JavaScript
1878 </a>
1879 </li>
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889 <li class="md-nav__item">
1890 <a href="../../wsc54/templates/" class="md-nav__link">
1891 Templates
1892 </a>
1893 </li>
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903 <li class="md-nav__item">
1904 <a href="../../wsc54/libraries/" class="md-nav__link">
1905 Third Party Libraries
1906 </a>
1907 </li>
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917 <li class="md-nav__item">
1918 <a href="../../wsc54/deprecations_removals/" class="md-nav__link">
1919 Deprecations and Removals
1920 </a>
1921 </li>
1922
1923
1924
1925
1926 </ul>
1927 </nav>
1928 </li>
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
1942
1943
1944 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" checked>
1945
1946
1947
1948
1949 <label class="md-nav__link" for="__nav_6_3">
1950 From WoltLab Suite 5.3
1951 <span class="md-nav__icon md-icon"></span>
1952 </label>
1953
1954 <nav class="md-nav" aria-label="From WoltLab Suite 5.3" data-md-level="2">
1955 <label class="md-nav__title" for="__nav_6_3">
1956 <span class="md-nav__icon md-icon"></span>
1957 From WoltLab Suite 5.3
1958 </label>
1959 <ul class="md-nav__list" data-md-scrollfix>
1960
1961
1962
1963
1964
1965
1966 <li class="md-nav__item">
1967 <a href="../php/" class="md-nav__link">
1968 PHP API
1969 </a>
1970 </li>
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982 <li class="md-nav__item md-nav__item--active">
1983
1984 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
1985
1986
1987
1988
1989
1990 <label class="md-nav__link md-nav__link--active" for="__toc">
1991 Session Handling and Authentication
1992 <span class="md-nav__icon md-icon"></span>
1993 </label>
1994
1995 <a href="./" class="md-nav__link md-nav__link--active">
1996 Session Handling and Authentication
1997 </a>
1998
1999
2000
2001<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2002
2003
2004
2005
2006
2007
2008 <label class="md-nav__title" for="__toc">
2009 <span class="md-nav__icon md-icon"></span>
2010 Table of contents
2011 </label>
2012 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2013
2014 <li class="md-nav__item">
2015 <a href="#summary-and-concepts" class="md-nav__link">
2016 Summary and Concepts
2017 </a>
2018
2019 <nav class="md-nav" aria-label="Summary and Concepts">
2020 <ul class="md-nav__list">
2021
2022 <li class="md-nav__item">
2023 <a href="#legacy-persistent-login" class="md-nav__link">
2024 Legacy Persistent Login
2025 </a>
2026
2027</li>
2028
2029 <li class="md-nav__item">
2030 <a href="#multiple-sessions" class="md-nav__link">
2031 Multiple Sessions
2032 </a>
2033
2034</li>
2035
2036 <li class="md-nav__item">
2037 <a href="#merged-acp-and-frontend-sessions" class="md-nav__link">
2038 Merged ACP and Frontend Sessions
2039 </a>
2040
2041</li>
2042
2043 <li class="md-nav__item">
2044 <a href="#improved-authentication-and-reauthentication" class="md-nav__link">
2045 Improved Authentication and Reauthentication
2046 </a>
2047
2048</li>
2049
2050 </ul>
2051 </nav>
2052
2053</li>
2054
2055 <li class="md-nav__item">
2056 <a href="#additions-and-changes" class="md-nav__link">
2057 Additions and Changes
2058 </a>
2059
2060 <nav class="md-nav" aria-label="Additions and Changes">
2061 <ul class="md-nav__list">
2062
2063 <li class="md-nav__item">
2064 <a href="#password-hashing" class="md-nav__link">
2065 Password Hashing
2066 </a>
2067
2068</li>
2069
2070 <li class="md-nav__item">
2071 <a href="#session-storage" class="md-nav__link">
2072 Session Storage
2073 </a>
2074
2075</li>
2076
2077 <li class="md-nav__item">
2078 <a href="#reauthentication" class="md-nav__link">
2079 Reauthentication
2080 </a>
2081
2082</li>
2083
2084 <li class="md-nav__item">
2085 <a href="#multi-factor-authentication" class="md-nav__link">
2086 Multi-factor Authentication
2087 </a>
2088
2089 <nav class="md-nav" aria-label="Multi-factor Authentication">
2090 <ul class="md-nav__list">
2091
2092 <li class="md-nav__item">
2093 <a href="#adding-multi-factor-methods" class="md-nav__link">
2094 Adding Multi-factor Methods
2095 </a>
2096
2097</li>
2098
2099 <li class="md-nav__item">
2100 <a href="#enforcing-multi-factor-authentication" class="md-nav__link">
2101 Enforcing Multi-factor Authentication
2102 </a>
2103
2104</li>
2105
2106 </ul>
2107 </nav>
2108
2109</li>
2110
2111 </ul>
2112 </nav>
2113
2114</li>
2115
2116 <li class="md-nav__item">
2117 <a href="#deprecations-and-removals" class="md-nav__link">
2118 Deprecations and Removals
2119 </a>
2120
2121 <nav class="md-nav" aria-label="Deprecations and Removals">
2122 <ul class="md-nav__list">
2123
2124 <li class="md-nav__item">
2125 <a href="#sessionhandler" class="md-nav__link">
2126 SessionHandler
2127 </a>
2128
2129</li>
2130
2131 <li class="md-nav__item">
2132 <a href="#acp-sessions" class="md-nav__link">
2133 ACP Sessions
2134 </a>
2135
2136</li>
2137
2138 <li class="md-nav__item">
2139 <a href="#cookies" class="md-nav__link">
2140 Cookies
2141 </a>
2142
2143</li>
2144
2145 <li class="md-nav__item">
2146 <a href="#virtual-sessions" class="md-nav__link">
2147 Virtual Sessions
2148 </a>
2149
2150</li>
2151
2152 <li class="md-nav__item">
2153 <a href="#security-token-constants" class="md-nav__link">
2154 Security Token Constants
2155 </a>
2156
2157</li>
2158
2159 <li class="md-nav__item">
2160 <a href="#passwordutil-and-double-bcrypt-hashes" class="md-nav__link">
2161 PasswordUtil and Double BCrypt Hashes
2162 </a>
2163
2164</li>
2165
2166 </ul>
2167 </nav>
2168
2169</li>
2170
2171 </ul>
2172
2173</nav>
2174
2175 </li>
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185 <li class="md-nav__item">
2186 <a href="../javascript/" class="md-nav__link">
2187 TypeScript and JavaScript
2188 </a>
2189 </li>
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199 <li class="md-nav__item">
2200 <a href="../templates/" class="md-nav__link">
2201 Templates
2202 </a>
2203 </li>
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213 <li class="md-nav__item">
2214 <a href="../libraries/" class="md-nav__link">
2215 Third Party Libraries
2216 </a>
2217 </li>
2218
2219
2220
2221
2222 </ul>
2223 </nav>
2224 </li>
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235 <li class="md-nav__item md-nav__item--nested">
2236
2237
2238 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
2239
2240
2241
2242
2243 <label class="md-nav__link" for="__nav_6_4">
2244 From WoltLab Suite 5.2
2245 <span class="md-nav__icon md-icon"></span>
2246 </label>
2247
2248 <nav class="md-nav" aria-label="From WoltLab Suite 5.2" data-md-level="2">
2249 <label class="md-nav__title" for="__nav_6_4">
2250 <span class="md-nav__icon md-icon"></span>
2251 From WoltLab Suite 5.2
2252 </label>
2253 <ul class="md-nav__list" data-md-scrollfix>
2254
2255
2256
2257
2258
2259
2260 <li class="md-nav__item">
2261 <a href="../../wsc52/php/" class="md-nav__link">
2262 PHP API
2263 </a>
2264 </li>
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274 <li class="md-nav__item">
2275 <a href="../../wsc52/templates/" class="md-nav__link">
2276 Templates and Languages
2277 </a>
2278 </li>
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288 <li class="md-nav__item">
2289 <a href="../../wsc52/libraries/" class="md-nav__link">
2290 Third Party Libraries
2291 </a>
2292 </li>
2293
2294
2295
2296
2297 </ul>
2298 </nav>
2299 </li>
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310 <li class="md-nav__item md-nav__item--nested">
2311
2312
2313 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
2314
2315
2316
2317
2318 <label class="md-nav__link" for="__nav_6_5">
2319 From WoltLab Suite 3.1
2320 <span class="md-nav__icon md-icon"></span>
2321 </label>
2322
2323 <nav class="md-nav" aria-label="From WoltLab Suite 3.1" data-md-level="2">
2324 <label class="md-nav__title" for="__nav_6_5">
2325 <span class="md-nav__icon md-icon"></span>
2326 From WoltLab Suite 3.1
2327 </label>
2328 <ul class="md-nav__list" data-md-scrollfix>
2329
2330
2331
2332
2333
2334
2335 <li class="md-nav__item">
2336 <a href="../../wsc31/php/" class="md-nav__link">
2337 PHP API
2338 </a>
2339 </li>
2340
2341
2342
2343
2344 </ul>
2345 </nav>
2346 </li>
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357 <li class="md-nav__item md-nav__item--nested">
2358
2359
2360 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_6" type="checkbox" id="__nav_6_6" >
2361
2362
2363
2364
2365 <label class="md-nav__link" for="__nav_6_6">
2366 From WoltLab Suite 3.0
2367 <span class="md-nav__icon md-icon"></span>
2368 </label>
2369
2370 <nav class="md-nav" aria-label="From WoltLab Suite 3.0" data-md-level="2">
2371 <label class="md-nav__title" for="__nav_6_6">
2372 <span class="md-nav__icon md-icon"></span>
2373 From WoltLab Suite 3.0
2374 </label>
2375 <ul class="md-nav__list" data-md-scrollfix>
2376
2377
2378
2379
2380
2381
2382 <li class="md-nav__item">
2383 <a href="../../wsc30/php/" class="md-nav__link">
2384 PHP API
2385 </a>
2386 </li>
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396 <li class="md-nav__item">
2397 <a href="../../wsc30/javascript/" class="md-nav__link">
2398 JavaScript API
2399 </a>
2400 </li>
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410 <li class="md-nav__item">
2411 <a href="../../wsc30/templates/" class="md-nav__link">
2412 Templates
2413 </a>
2414 </li>
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424 <li class="md-nav__item">
2425 <a href="../../wsc30/css/" class="md-nav__link">
2426 CSS
2427 </a>
2428 </li>
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438 <li class="md-nav__item">
2439 <a href="../../wsc30/package/" class="md-nav__link">
2440 Package Components
2441 </a>
2442 </li>
2443
2444
2445
2446
2447 </ul>
2448 </nav>
2449 </li>
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460 <li class="md-nav__item md-nav__item--nested">
2461
2462
2463 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_7" type="checkbox" id="__nav_6_7" >
2464
2465
2466
2467
2468 <label class="md-nav__link" for="__nav_6_7">
2469 From WCF 2.1
2470 <span class="md-nav__icon md-icon"></span>
2471 </label>
2472
2473 <nav class="md-nav" aria-label="From WCF 2.1" data-md-level="2">
2474 <label class="md-nav__title" for="__nav_6_7">
2475 <span class="md-nav__icon md-icon"></span>
2476 From WCF 2.1
2477 </label>
2478 <ul class="md-nav__list" data-md-scrollfix>
2479
2480
2481
2482
2483
2484
2485 <li class="md-nav__item">
2486 <a href="../../wcf21/php/" class="md-nav__link">
2487 PHP API
2488 </a>
2489 </li>
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499 <li class="md-nav__item">
2500 <a href="../../wcf21/templates/" class="md-nav__link">
2501 Templates
2502 </a>
2503 </li>
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513 <li class="md-nav__item">
2514 <a href="../../wcf21/css/" class="md-nav__link">
2515 CSS
2516 </a>
2517 </li>
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527 <li class="md-nav__item">
2528 <a href="../../wcf21/package/" class="md-nav__link">
2529 Package Components
2530 </a>
2531 </li>
2532
2533
2534
2535
2536 </ul>
2537 </nav>
2538 </li>
2539
2540
2541
2542
2543 </ul>
2544 </nav>
2545 </li>
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557 <li class="md-nav__item md-nav__item--nested">
2558
2559
2560 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
2561
2562
2563
2564
2565 <label class="md-nav__link" for="__nav_7">
2566 Tutorials
2567 <span class="md-nav__icon md-icon"></span>
2568 </label>
2569
2570 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
2571 <label class="md-nav__title" for="__nav_7">
2572 <span class="md-nav__icon md-icon"></span>
2573 Tutorials
2574 </label>
2575 <ul class="md-nav__list" data-md-scrollfix>
2576
2577
2578
2579
2580
2581
2582
2583 <li class="md-nav__item md-nav__item--nested">
2584
2585
2586 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
2587
2588
2589
2590
2591 <label class="md-nav__link" for="__nav_7_1">
2592 Tutorial Series
2593 <span class="md-nav__icon md-icon"></span>
2594 </label>
2595
2596 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
2597 <label class="md-nav__title" for="__nav_7_1">
2598 <span class="md-nav__icon md-icon"></span>
2599 Tutorial Series
2600 </label>
2601 <ul class="md-nav__list" data-md-scrollfix>
2602
2603
2604
2605
2606
2607
2608 <li class="md-nav__item">
2609 <a href="../../../tutorial/series/overview/" class="md-nav__link">
2610 Overview
2611 </a>
2612 </li>
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622 <li class="md-nav__item">
2623 <a href="../../../tutorial/series/part_1/" class="md-nav__link">
2624 Part 1
2625 </a>
2626 </li>
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636 <li class="md-nav__item">
2637 <a href="../../../tutorial/series/part_2/" class="md-nav__link">
2638 Part 2
2639 </a>
2640 </li>
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650 <li class="md-nav__item">
2651 <a href="../../../tutorial/series/part_3/" class="md-nav__link">
2652 Part 3
2653 </a>
2654 </li>
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664 <li class="md-nav__item">
2665 <a href="../../../tutorial/series/part_4/" class="md-nav__link">
2666 Part 4
2667 </a>
2668 </li>
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678 <li class="md-nav__item">
2679 <a href="../../../tutorial/series/part_5/" class="md-nav__link">
2680 Part 5
2681 </a>
2682 </li>
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692 <li class="md-nav__item">
2693 <a href="../../../tutorial/series/part_6/" class="md-nav__link">
2694 Part 6
2695 </a>
2696 </li>
2697
2698
2699
2700
2701 </ul>
2702 </nav>
2703 </li>
2704
2705
2706
2707
2708 </ul>
2709 </nav>
2710 </li>
2711
2712
2713
2714 </ul>
2715</nav>
2716 </div>
2717 </div>
2718 </div>
2719
2720
2721
2722 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2723 <div class="md-sidebar__scrollwrap">
2724 <div class="md-sidebar__inner">
2725
2726
2727<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2728
2729
2730
2731
2732
2733
2734 <label class="md-nav__title" for="__toc">
2735 <span class="md-nav__icon md-icon"></span>
2736 Table of contents
2737 </label>
2738 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2739
2740 <li class="md-nav__item">
2741 <a href="#summary-and-concepts" class="md-nav__link">
2742 Summary and Concepts
2743 </a>
2744
2745 <nav class="md-nav" aria-label="Summary and Concepts">
2746 <ul class="md-nav__list">
2747
2748 <li class="md-nav__item">
2749 <a href="#legacy-persistent-login" class="md-nav__link">
2750 Legacy Persistent Login
2751 </a>
2752
2753</li>
2754
2755 <li class="md-nav__item">
2756 <a href="#multiple-sessions" class="md-nav__link">
2757 Multiple Sessions
2758 </a>
2759
2760</li>
2761
2762 <li class="md-nav__item">
2763 <a href="#merged-acp-and-frontend-sessions" class="md-nav__link">
2764 Merged ACP and Frontend Sessions
2765 </a>
2766
2767</li>
2768
2769 <li class="md-nav__item">
2770 <a href="#improved-authentication-and-reauthentication" class="md-nav__link">
2771 Improved Authentication and Reauthentication
2772 </a>
2773
2774</li>
2775
2776 </ul>
2777 </nav>
2778
2779</li>
2780
2781 <li class="md-nav__item">
2782 <a href="#additions-and-changes" class="md-nav__link">
2783 Additions and Changes
2784 </a>
2785
2786 <nav class="md-nav" aria-label="Additions and Changes">
2787 <ul class="md-nav__list">
2788
2789 <li class="md-nav__item">
2790 <a href="#password-hashing" class="md-nav__link">
2791 Password Hashing
2792 </a>
2793
2794</li>
2795
2796 <li class="md-nav__item">
2797 <a href="#session-storage" class="md-nav__link">
2798 Session Storage
2799 </a>
2800
2801</li>
2802
2803 <li class="md-nav__item">
2804 <a href="#reauthentication" class="md-nav__link">
2805 Reauthentication
2806 </a>
2807
2808</li>
2809
2810 <li class="md-nav__item">
2811 <a href="#multi-factor-authentication" class="md-nav__link">
2812 Multi-factor Authentication
2813 </a>
2814
2815 <nav class="md-nav" aria-label="Multi-factor Authentication">
2816 <ul class="md-nav__list">
2817
2818 <li class="md-nav__item">
2819 <a href="#adding-multi-factor-methods" class="md-nav__link">
2820 Adding Multi-factor Methods
2821 </a>
2822
2823</li>
2824
2825 <li class="md-nav__item">
2826 <a href="#enforcing-multi-factor-authentication" class="md-nav__link">
2827 Enforcing Multi-factor Authentication
2828 </a>
2829
2830</li>
2831
2832 </ul>
2833 </nav>
2834
2835</li>
2836
2837 </ul>
2838 </nav>
2839
2840</li>
2841
2842 <li class="md-nav__item">
2843 <a href="#deprecations-and-removals" class="md-nav__link">
2844 Deprecations and Removals
2845 </a>
2846
2847 <nav class="md-nav" aria-label="Deprecations and Removals">
2848 <ul class="md-nav__list">
2849
2850 <li class="md-nav__item">
2851 <a href="#sessionhandler" class="md-nav__link">
2852 SessionHandler
2853 </a>
2854
2855</li>
2856
2857 <li class="md-nav__item">
2858 <a href="#acp-sessions" class="md-nav__link">
2859 ACP Sessions
2860 </a>
2861
2862</li>
2863
2864 <li class="md-nav__item">
2865 <a href="#cookies" class="md-nav__link">
2866 Cookies
2867 </a>
2868
2869</li>
2870
2871 <li class="md-nav__item">
2872 <a href="#virtual-sessions" class="md-nav__link">
2873 Virtual Sessions
2874 </a>
2875
2876</li>
2877
2878 <li class="md-nav__item">
2879 <a href="#security-token-constants" class="md-nav__link">
2880 Security Token Constants
2881 </a>
2882
2883</li>
2884
2885 <li class="md-nav__item">
2886 <a href="#passwordutil-and-double-bcrypt-hashes" class="md-nav__link">
2887 PasswordUtil and Double BCrypt Hashes
2888 </a>
2889
2890</li>
2891
2892 </ul>
2893 </nav>
2894
2895</li>
2896
2897 </ul>
2898
2899</nav>
2900 </div>
2901 </div>
2902 </div>
2903
2904
7f9945cf
WG
2905
2906 <div class="md-content" data-md-component="content">
2907 <article class="md-content__inner md-typeset">
9aa5da67 2908
7f9945cf
WG
2909
2910
9aa5da67 2911 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/6.0/docs/migration/wsc53/session.md" title="Edit this page" class="md-content__button md-icon">
7f9945cf 2912
9aa5da67
WG
2913 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
2914 </a>
2915
2916
9aa5da67
WG
2917<h1 id="migrating-from-woltlab-suite-53-session-handling-and-authentication">Migrating from WoltLab Suite 5.3 - Session Handling and Authentication<a class="headerlink" href="#migrating-from-woltlab-suite-53-session-handling-and-authentication" title="Permanent link">#</a></h1>
2918<p>WoltLab Suite 5.4 includes a completely refactored session handling.
2919As long as you only interact with sessions via <code>WCF::getSession()</code>, especially when you perform read-only accesses, you should not notice any breaking changes.</p>
2920<p>You might appreciate some of the new session methods if you process security sensitive data.</p>
2921<h2 id="summary-and-concepts">Summary and Concepts<a class="headerlink" href="#summary-and-concepts" title="Permanent link">#</a></h2>
2922<p>Most of the changes revolve around the removal of the legacy persistent login functionality and the assumption that every user has a single session only.
2923Both aspects are related to each other.</p>
2924<h3 id="legacy-persistent-login">Legacy Persistent Login<a class="headerlink" href="#legacy-persistent-login" title="Permanent link">#</a></h3>
2925<p>The legacy persistent login was rather an automated login.
2926Upon bootstrapping a session, it was checked whether the user had a cookie pair storing the user’s <code>userID</code> and (a single BCrypt hash of) the user’s password.
2927If such a cookie pair exists and the BCrypt hash within the cookie matches the user’s password hash when hashed again, the session would immediately <code>changeUser()</code> to the respective user.</p>
2928<p>This legacy persistent login was completely removed.
2929Instead, any sessions that belong to an authenticated user will automatically be long-lived.
2930These long-lived sessions expire no sooner than 14 days after the last activity, ensuring that the user continously stays logged in, provided that they visit the page at least once per fortnight.</p>
2931<h3 id="multiple-sessions">Multiple Sessions<a class="headerlink" href="#multiple-sessions" title="Permanent link">#</a></h3>
2932<p>To allow for a proper separation of these long-lived user sessions, WoltLab Suite now allows for multiple sessions per user.
2933These sessions are completely unrelated to each other.
2934Specifically, they do not share session variables and they expire independently.</p>
2935<p>As the existing <code>wcf1_session</code> table is also used for the online lists and location tracking, it will be maintained on a best effort basis.
2936It no longer stores any private session data.</p>
2937<p>The actual sessions storing security sensitive information are in an unrelated location.
2938They must only be accessed via the PHP API exposed by the <code>SessionHandler</code>.</p>
2939<h3 id="merged-acp-and-frontend-sessions">Merged ACP and Frontend Sessions<a class="headerlink" href="#merged-acp-and-frontend-sessions" title="Permanent link">#</a></h3>
2940<p>WoltLab Suite 5.4 shares a single session across both the frontend, as well as the ACP.
2941When a user logs in to the frontend, they will also be logged into the ACP and vice versa.</p>
2942<p>Actual access to the ACP is controlled via the new <a href="#reauthentication">reauthentication mechanism</a>.</p>
2943<p>The session variable store is scoped:
2944Session variables set within the frontend are not available within the ACP and vice versa.</p>
2945<h3 id="improved-authentication-and-reauthentication">Improved Authentication and Reauthentication<a class="headerlink" href="#improved-authentication-and-reauthentication" title="Permanent link">#</a></h3>
2946<p>WoltLab Suite 5.4 ships with multi-factor authentication support and a generic re-authentication implementation that can be used to verify the account owner’s presence.</p>
2947<h2 id="additions-and-changes">Additions and Changes<a class="headerlink" href="#additions-and-changes" title="Permanent link">#</a></h2>
2948<h3 id="password-hashing">Password Hashing<a class="headerlink" href="#password-hashing" title="Permanent link">#</a></h3>
2949<p>WoltLab Suite 5.4 includes a new object-oriented password hashing framework that is modeled after PHP’s <code>password_*</code> API.
2950Check <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/authentication/password/PasswordAlgorithmManager.class.php"><code>PasswordAlgorithmManager</code></a> and <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/authentication/password/IPasswordAlgorithm.class.php"><code>IPasswordAlgorithm</code></a> for details.</p>
2951<p>The new default password hash is a standard BCrypt hash.
2952All newly generated hashes in <code>wcf1_user.password</code> will now include a type prefix, instead of just passwords imported from other systems.</p>
2953<h3 id="session-storage">Session Storage<a class="headerlink" href="#session-storage" title="Permanent link">#</a></h3>
2954<p>The <code>wcf1_session</code> table will no longer be used for session storage.
2955Instead, it is maintained for compatibility with existing online lists.</p>
2956<p>The actual session storage is considered an implementation detail and you <em>must not</em> directly interact with the session tables.
2957Future versions might support alternative session backends, such as Redis.</p>
2958<div class="admonition warning">
2959<p class="admonition-title">Do not interact directly with the session database tables but only via the <code>SessionHandler</code> class!</p>
2960</div>
2961<h3 id="reauthentication">Reauthentication<a class="headerlink" href="#reauthentication" title="Permanent link">#</a></h3>
2962<p>For security sensitive processing, you might want to ensure that the account owner is actually present instead of a third party accessing a session that was accidentally left logged in.</p>
2963<p>WoltLab Suite 5.4 ships with a generic reauthentication framework.
2964To request reauthentication within your controller you need to:</p>
2965<ol>
2966<li>Use the <code>wcf\system\user\authentication\TReauthenticationCheck</code> trait.</li>
2967<li>Call:
2968 <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
2969<span class="normal">2</span>
2970<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">requestReauthentication</span><span class="p">(</span><span class="nx">LinkHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getControllerLink</span><span class="p">(</span><span class="k">static</span><span class="o">::</span><span class="na">class</span><span class="p">,</span> <span class="p">[</span>
2971 <span class="cm">/* additional parameters */</span>
2972<span class="p">]));</span>
2973</code></pre></div></td></tr></table></div></li>
2974</ol>
2975<p><code>requestReauthentication()</code> will check if the user has recently authenticated themselves.
2976If they did, the request proceeds as usual.
2977Otherwise, they will be asked to reauthenticate themselves.
2978After the successful authentication, they will be redirected to the URL that was passed as the first parameter (the current controller within the example).</p>
2979<p>Details can be found in <a href="https://github.com/WoltLab/WCF/pull/3775">WoltLab/WCF#3775</a>.</p>
2980<h3 id="multi-factor-authentication">Multi-factor Authentication<a class="headerlink" href="#multi-factor-authentication" title="Permanent link">#</a></h3>
2981<p>To implement multi-factor authentication securely, WoltLab Suite 5.4 implements the concept of a “pending user change”.
2982The user will not be logged in (i.e. <code>WCF::getUser()-&gt;userID</code> returns <code>null</code>) until they authenticate themselves with their second factor.</p>
2983<p>Requesting multi-factor authentication is done on an opt-in basis for compatibility reasons.
2984If you perform authentication yourself and do not trust the authentication source to perform multi-factor authentication itself, you will need to adjust your logic to request multi-factor authentication from WoltLab Suite:</p>
2985<p>Previously:</p>
2986<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">changeUser</span><span class="p">(</span><span class="nv">$targetUser</span><span class="p">);</span>
2987</code></pre></div></td></tr></table></div>
2988<p>Now:</p>
2989<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
2990<span class="normal"> 2</span>
2991<span class="normal"> 3</span>
2992<span class="normal"> 4</span>
2993<span class="normal"> 5</span>
2994<span class="normal"> 6</span>
2995<span class="normal"> 7</span>
2996<span class="normal"> 8</span>
2997<span class="normal"> 9</span>
2998<span class="normal">10</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nv">$isPending</span> <span class="o">=</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">changeUserAfterMultifactorAuthentication</span><span class="p">(</span><span class="nv">$targetUser</span><span class="p">);</span>
2999<span class="k">if</span> <span class="p">(</span><span class="nv">$isPending</span><span class="p">)</span> <span class="p">{</span>
3000 <span class="c1">// Redirect to the authentication form. The user will not be logged in.</span>
3001 <span class="c1">// Note: Do not use `getControllerLink` to support both the frontend as well as the ACP.</span>
3002 <span class="nx">HeaderUtil</span><span class="o">::</span><span class="na">redirect</span><span class="p">(</span><span class="nx">LinkHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="p">(</span><span class="s1">&#39;MultifactorAuthentication&#39;</span><span class="p">,</span> <span class="p">[</span>
3003 <span class="s1">&#39;url&#39;</span> <span class="o">=&gt;</span> <span class="cm">/* Return To */</span><span class="p">,</span>
3004 <span class="p">]));</span>
3005 <span class="k">exit</span><span class="p">;</span>
3006<span class="p">}</span>
3007<span class="c1">// Proceed as usual. The user will be logged in.</span>
3008</code></pre></div></td></tr></table></div>
3009<h4 id="adding-multi-factor-methods">Adding Multi-factor Methods<a class="headerlink" href="#adding-multi-factor-methods" title="Permanent link">#</a></h4>
3010<p>Adding your own multi-factor method requires the implementation of a single object type:</p>
3011<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">objectType.xml</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
3012<span class="normal">2</span>
3013<span class="normal">3</span>
3014<span class="normal">4</span>
3015<span class="normal">5</span>
3016<span class="normal">6</span>
3017<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nt">&lt;type&gt;</span>
3018 <span class="nt">&lt;name&gt;</span>com.example.multifactor.foobar<span class="nt">&lt;/name&gt;</span>
3019 <span class="nt">&lt;definitionname&gt;</span>com.woltlab.wcf.multifactor<span class="nt">&lt;/definitionname&gt;</span>
3020 <span class="nt">&lt;icon&gt;</span><span class="cm">&lt;!-- Font Awesome 4 Icon Name goes here. --&gt;</span><span class="nt">&lt;/icon&gt;</span>
3021 <span class="nt">&lt;priority&gt;</span><span class="cm">&lt;!-- Determines the sort order, higher priority will be preferred for authentication. --&gt;</span><span class="nt">&lt;/priority&gt;</span>
3022 <span class="nt">&lt;classname&gt;</span>wcf\system\user\multifactor\FoobarMultifactorMethod<span class="nt">&lt;/classname&gt;</span>
3023<span class="nt">&lt;/type&gt;</span>
3024</code></pre></div></td></tr></table></div>
3025<p>The given classname must implement the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/multifactor/IMultifactorMethod.class.php"><code>IMultifactorMethod</code></a> interface.</p>
3026<p>As a self-contained example, you can find the initial implementation of the email multi-factor method in <a href="https://github.com/WoltLab/WCF/pull/3729">WoltLab/WCF#3729</a>.
3027Please check <a href="https://github.com/WoltLab/WCF/commits/master/wcfsetup/install/files/lib/system/user/multifactor/EmailMultifactorMethod.class.php">the version history</a> of the PHP class to make sure you do not miss important changes that were added later.</p>
3028<div class="admonition warning">
3029<p class="admonition-title">Multi-factor authentication is security sensitive. Make sure to carefully read the remarks in <code>IMultifactorMethod</code> for possible issues. Also make sure to carefully test your implementation against all sorts of incorrect input and consider attack vectors such as race conditions. It is strongly recommended to generously check the current state by leveraging assertions and exceptions.</p>
3030</div>
3031<h4 id="enforcing-multi-factor-authentication">Enforcing Multi-factor Authentication<a class="headerlink" href="#enforcing-multi-factor-authentication" title="Permanent link">#</a></h4>
3032<p>To enforce Multi-factor Authentication within your controller you need to:</p>
3033<ol>
3034<li>Use the <code>wcf\system\user\multifactor\TMultifactorRequirementEnforcer</code> trait.</li>
3035<li>Call: <code>$this-&gt;enforceMultifactorAuthentication();</code></li>
3036</ol>
3037<p><code>enforceMultifactorAuthentication()</code> will check if the user is in a group that requires multi-factor authentication, but does not yet have multi-factor authentication enabled.
3038If they did, the request proceeds as usual.
3039Otherwise, a <code>NamedUserException</code> is thrown.</p>
3040<h2 id="deprecations-and-removals">Deprecations and Removals<a class="headerlink" href="#deprecations-and-removals" title="Permanent link">#</a></h2>
3041<h3 id="sessionhandler">SessionHandler<a class="headerlink" href="#sessionhandler" title="Permanent link">#</a></h3>
3042<p>Most of the changes with regard to the new session handling happened in <code>SessionHandler</code>.
3043Most notably, <code>SessionHandler</code> now is marked <code>final</code> to ensure proper encapsulation of data.</p>
3044<p>A number of methods in <code>SessionHandler</code> are now deprecated and result in a noop.
3045This change mostly affects methods that have been used to bootstrap the session, such as <code>setHasValidCookie()</code>.</p>
3046<p>Additionally, accessing the following keys on the session is deprecated.
3047They directly map to an existing method in another class and any uses can easily be updated:
3048- <code>ipAddress</code>
3049- <code>userAgent</code>
3050- <code>requestURI</code>
3051- <code>requestMethod</code>
3052- <code>lastActivityTime</code></p>
3053<p>Refer to <a href="https://github.com/WoltLab/WCF/blob/439de4963c947c3569a0c584f795245f693155b0/wcfsetup/install/files/lib/system/session/SessionHandler.class.php#L168-L178">the implementation</a> for details.</p>
3054<h3 id="acp-sessions">ACP Sessions<a class="headerlink" href="#acp-sessions" title="Permanent link">#</a></h3>
3055<p>The database tables related to ACP sessions have been removed.
3056The PHP classes have been preserved due to being used within the class hierarchy of the legacy sessions.</p>
3057<h3 id="cookies">Cookies<a class="headerlink" href="#cookies" title="Permanent link">#</a></h3>
3058<p>The <code>_userID</code>, <code>_password</code>, <code>_cookieHash</code> and <code>_cookieHash_acp</code> cookies will no longer be created nor consumed.</p>
3059<h3 id="virtual-sessions">Virtual Sessions<a class="headerlink" href="#virtual-sessions" title="Permanent link">#</a></h3>
3060<p>The virtual session logic existed to support multiple devices per single session in <code>wcf1_session</code>.
3061Virtual sessions are no longer required with the refactored session handling.</p>
3062<p>Anything related to virtual sessions has been completely removed as they are considered an implementation detail.
3063This removal includes PHP classes and database tables.</p>
3064<h3 id="security-token-constants">Security Token Constants<a class="headerlink" href="#security-token-constants" title="Permanent link">#</a></h3>
3065<p>The security token constants are deprecated.
3066Instead, the methods of <code>SessionHandler</code> should be used (e.g. <code>-&gt;getSecurityToken()</code>).
3067Within templates, you should migrate to the <code>{csrfToken}</code> tag in place of <code>{@SECURITY_TOKEN_INPUT_TAG}</code>.
3068The <code>{csrfToken}</code> tag is a drop-in replacement and was backported to WoltLab Suite 5.2+, allowing you to maintain compatibility across a broad range of versions.</p>
3069<h3 id="passwordutil-and-double-bcrypt-hashes">PasswordUtil and Double BCrypt Hashes<a class="headerlink" href="#passwordutil-and-double-bcrypt-hashes" title="Permanent link">#</a></h3>
3070<p>Most of the methods in PasswordUtil are deprecated in favor of the new password hashing framework.</p>
3071
3072 <hr>
3073<div class="md-source-file">
3074 <small>
3075
3076 Last update:
3077 2022-05-13
3078
3079 </small>
3080</div>
3081
a06fd3b1
WG
3082
3083
3084
7f9945cf
WG
3085
3086
3087 </article>
3088 </div>
3089
3090
9aa5da67
WG
3091 </div>
3092
3093 </main>
3094
3095 <footer class="md-footer">
3096
3097
3098 <nav class="md-footer__inner md-grid" aria-label="Footer" >
3099
3100
3101 <a href="../php/" class="md-footer__link md-footer__link--prev" aria-label="Previous: PHP API" rel="prev">
3102 <div class="md-footer__button md-icon">
3103 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
3104 </div>
3105 <div class="md-footer__title">
3106 <div class="md-ellipsis">
3107 <span class="md-footer__direction">
3108 Previous
3109 </span>
3110 PHP API
3111 </div>
3112 </div>
3113 </a>
3114
3115
3116
3117 <a href="../javascript/" class="md-footer__link md-footer__link--next" aria-label="Next: TypeScript and JavaScript" rel="next">
3118 <div class="md-footer__title">
3119 <div class="md-ellipsis">
3120 <span class="md-footer__direction">
3121 Next
3122 </span>
3123 TypeScript and JavaScript
3124 </div>
3125 </div>
3126 <div class="md-footer__button md-icon">
3127 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
3128 </div>
3129 </a>
3130
3131 </nav>
3132
3133 <div class="md-footer-meta md-typeset">
3134 <div class="md-footer-meta__inner md-grid">
3135 <div class="md-copyright">
3136
3137 <div class="md-copyright__highlight">
3138 Copyright © 2020 WoltLab GmbH
3139 </div>
3140
3141
3142 Made with
3143 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3144 Material for MkDocs
3145 </a>
3146
3147</div>
3148
3149 <div class="md-copyright">
3150 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
3151 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
3152</div>
3153
3154 </div>
3155 </div>
3156</footer>
3157
3158 </div>
3159 <div class="md-dialog" data-md-component="dialog">
3160 <div class="md-dialog__inner md-typeset"></div>
3161 </div>
a06fd3b1 3162
a277f2e9 3163 <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.tracking"], "search": "../../../assets/javascripts/workers/search.5bf1dace.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "version": {"provider": "mike"}}</script>
9aa5da67
WG
3164
3165
a277f2e9 3166 <script src="../../../assets/javascripts/bundle.078830c0.min.js"></script>
9aa5da67
WG
3167
3168
3169 </body>
3170</html>