]> BookStack Code Mirror - bookstack/blob - app/Providers/LdapUserProvider.php
Got LDAP auth working to a functional state
[bookstack] / app / Providers / LdapUserProvider.php
1 <?php
2
3 namespace BookStack\Providers;
4
5
6 use BookStack\Role;
7 use BookStack\Services\LdapService;
8 use BookStack\User;
9 use Illuminate\Contracts\Auth\Authenticatable;
10 use Illuminate\Contracts\Auth\UserProvider;
11
12 class LdapUserProvider implements UserProvider
13 {
14
15     /**
16      * The user model.
17      *
18      * @var string
19      */
20     protected $model;
21
22     /**
23      * @var LdapService
24      */
25     protected $ldapService;
26
27
28     /**
29      * LdapUserProvider constructor.
30      * @param             $model
31      * @param LdapService $ldapService
32      */
33     public function __construct($model, LdapService $ldapService)
34     {
35         $this->model = $model;
36         $this->ldapService = $ldapService;
37     }
38
39     /**
40      * Create a new instance of the model.
41      *
42      * @return \Illuminate\Database\Eloquent\Model
43      */
44     public function createModel()
45     {
46         $class = '\\' . ltrim($this->model, '\\');
47         return new $class;
48     }
49
50
51     /**
52      * Retrieve a user by their unique identifier.
53      *
54      * @param  mixed $identifier
55      * @return \Illuminate\Contracts\Auth\Authenticatable|null
56      */
57     public function retrieveById($identifier)
58     {
59         return $this->createModel()->newQuery()->find($identifier);
60     }
61
62     /**
63      * Retrieve a user by their unique identifier and "remember me" token.
64      *
65      * @param  mixed  $identifier
66      * @param  string $token
67      * @return \Illuminate\Contracts\Auth\Authenticatable|null
68      */
69     public function retrieveByToken($identifier, $token)
70     {
71         $model = $this->createModel();
72
73         return $model->newQuery()
74             ->where($model->getAuthIdentifierName(), $identifier)
75             ->where($model->getRememberTokenName(), $token)
76             ->first();
77     }
78
79
80     /**
81      * Update the "remember me" token for the given user in storage.
82      *
83      * @param  \Illuminate\Contracts\Auth\Authenticatable $user
84      * @param  string                                     $token
85      * @return void
86      */
87     public function updateRememberToken(Authenticatable $user, $token)
88     {
89         $user->setRememberToken($token);
90
91         $user->save();
92     }
93
94     /**
95      * Retrieve a user by the given credentials.
96      *
97      * @param  array $credentials
98      * @return \Illuminate\Contracts\Auth\Authenticatable|null
99      */
100     public function retrieveByCredentials(array $credentials)
101     {
102         // Get user via LDAP
103         $userDetails = $this->ldapService->getUserDetails($credentials['username']);
104         if ($userDetails === null) return null;
105
106         // Search current user base by looking up a uid
107         $model = $this->createModel();
108         $currentUser = $model->newQuery()
109             ->where('external_auth_id', $userDetails['uid'])
110             ->first();
111
112         if ($currentUser !== null) return $currentUser;
113
114         $model->name = $userDetails['name'];
115         $model->external_auth_id = $userDetails['uid'];
116         return $model;
117     }
118
119     /**
120      * Validate a user against the given credentials.
121      *
122      * @param  \Illuminate\Contracts\Auth\Authenticatable $user
123      * @param  array                                      $credentials
124      * @return bool
125      */
126     public function validateCredentials(Authenticatable $user, array $credentials)
127     {
128         return $this->ldapService->validateUserCredentials($user, $credentials['username'], $credentials['password']);
129     }
130 }