]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/Auth/Saml2Controller.php
Merge branch 'v21.05.x'
[bookstack] / app / Http / Controllers / Auth / Saml2Controller.php
1 <?php
2
3 namespace BookStack\Http\Controllers\Auth;
4
5 use BookStack\Auth\Access\Saml2Service;
6 use BookStack\Http\Controllers\Controller;
7
8 class Saml2Controller extends Controller
9 {
10     protected $samlService;
11
12     /**
13      * Saml2Controller constructor.
14      */
15     public function __construct(Saml2Service $samlService)
16     {
17         $this->samlService = $samlService;
18         $this->middleware('guard:saml2');
19     }
20
21     /**
22      * Start the login flow via SAML2.
23      */
24     public function login()
25     {
26         $loginDetails = $this->samlService->login();
27         session()->flash('saml2_request_id', $loginDetails['id']);
28
29         return redirect($loginDetails['url']);
30     }
31
32     /**
33      * Start the logout flow via SAML2.
34      */
35     public function logout()
36     {
37         $logoutDetails = $this->samlService->logout();
38
39         if ($logoutDetails['id']) {
40             session()->flash('saml2_logout_request_id', $logoutDetails['id']);
41         }
42
43         return redirect($logoutDetails['url']);
44     }
45
46     /*
47      * Get the metadata for this SAML2 service provider.
48      */
49     public function metadata()
50     {
51         $metaData = $this->samlService->metadata();
52
53         return response()->make($metaData, 200, [
54             'Content-Type' => 'text/xml',
55         ]);
56     }
57
58     /**
59      * Single logout service.
60      * Handle logout requests and responses.
61      */
62     public function sls()
63     {
64         $requestId = session()->pull('saml2_logout_request_id', null);
65         $redirect = $this->samlService->processSlsResponse($requestId) ?? '/';
66
67         return redirect($redirect);
68     }
69
70     /**
71      * Assertion Consumer Service.
72      * Processes the SAML response from the IDP.
73      */
74     public function acs()
75     {
76         $requestId = session()->pull('saml2_request_id', null);
77
78         $user = $this->samlService->processAcsResponse($requestId);
79         if ($user === null) {
80             $this->showErrorNotification(trans('errors.saml_fail_authed', ['system' => config('saml2.name')]));
81
82             return redirect('/login');
83         }
84
85         return redirect()->intended();
86     }
87 }