Skip to content

Commit 794275f

Browse files
authored
Merge pull request #268 from kenjis/fix-username-validation-rules
fix: username validation rules
2 parents 52bacb2 + f116e10 commit 794275f

File tree

10 files changed

+77
-18
lines changed

10 files changed

+77
-18
lines changed

docs/authentication.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ $credentials = [
141141
'password' => $this->request->getPost('password')
142142
];
143143

144-
$validCreds? = auth()->check($credentials);
144+
$validCreds = auth()->check($credentials);
145145

146146
if (! $validCreds->isOK()) {
147147
return redirect()->back()->with('error', $loginAttempt->reason());

docs/customization.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,22 +95,34 @@ Shield has the following rules for registration:
9595

9696
```php
9797
[
98-
'username' => 'required|alpha_numeric_space|min_length[3]|is_unique[users.username]',
99-
'email' => 'required|valid_email|is_unique[auth_identities.secret]',
98+
'username' => [
99+
'required',
100+
'max_length[30]',
101+
'min_length[3]',
102+
'regex_match[/\A[a-zA-Z0-9\.]+\z/]',
103+
'is_unique[users.username]',
104+
],
105+
'email' => 'required|max_length[254]|valid_email|is_unique[auth_identities.secret]',
100106
'password' => 'required|strong_password',
101107
'password_confirm' => 'required|matches[password]',
102108
];
103109
```
104110

105-
If you need a different set of rules for registration, you can specify them in your `Validation` configuration (**app\Config\Validation.php**) like:
111+
If you need a different set of rules for registration, you can specify them in your `Validation` configuration (**app/Config/Validation.php**) like:
106112

107113
```php
108114
//--------------------------------------------------------------------
109115
// Rules
110116
//--------------------------------------------------------------------
111117
public $registration = [
112-
'username' => 'required|alpha_numeric_space|min_length[3]|is_unique[users.username]',
113-
'email' => 'required|valid_email|is_unique[auth_identities.secret]',
118+
'username' => [
119+
'required',
120+
'max_length[30]',
121+
'min_length[3]',
122+
'regex_match[/\A[a-zA-Z0-9\.]+\z/]',
123+
'is_unique[users.username]',
124+
],
125+
'email' => 'required|max_length[254]|valid_email|is_unique[auth_identities.secret]',
114126
'password' => 'required|strong_password',
115127
'password_confirm' => 'required|matches[password]',
116128
];

src/Config/AuthSession.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace CodeIgniter\Shield\Config;
4+
5+
use CodeIgniter\Config\BaseConfig;
6+
7+
/**
8+
* Config for Session Authenticator
9+
*/
10+
class AuthSession extends BaseConfig
11+
{
12+
/**
13+
* The validation rules for username
14+
*
15+
* @var string[]
16+
*/
17+
public array $usernameValidationRules = [
18+
'required',
19+
'max_length[30]',
20+
'min_length[3]',
21+
'regex_match[/\A[a-zA-Z0-9\.]+\z/]',
22+
];
23+
24+
/**
25+
* The validation rules for email
26+
*
27+
* @var string[]
28+
*/
29+
public array $emailValidationRules = [
30+
'required',
31+
'max_length[254]',
32+
'valid_email',
33+
];
34+
}

src/Config/Registrar.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ public static function Validation(): array
3232
'ruleSets' => [
3333
PasswordRules::class,
3434
],
35-
'users' => [
36-
'email' => 'required|valid_email|unique_email[{id}]',
37-
'username' => 'required|string|is_unique[users.username,id,{id}]',
38-
],
3935
];
4036
}
4137

src/Controllers/LoginController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public function loginAction(): RedirectResponse
6464
protected function getValidationRules(): array
6565
{
6666
return setting('Validation.login') ?? [
67-
//'username' => 'required|max_length[30]|alpha_numeric_space|min_length[3]',
68-
'email' => 'required|max_length[254]|valid_email',
67+
//'username' => config('AuthSession')->usernameValidationRules,
68+
'email' => config('AuthSession')->emailValidationRules,
6969
'password' => 'required',
7070
];
7171
}

src/Controllers/MagicLinkController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ private function recordLoginAttempt(
186186
/**
187187
* Returns the rules that should be used for validation.
188188
*
189-
* @return array<string, string>
189+
* @return array<string, array<string, string>>
190190
*/
191191
protected function getValidationRules(): array
192192
{
193193
return [
194-
'email' => 'required|max_length[254]|valid_email',
194+
'email' => config('AuthSession')->emailValidationRules,
195195
];
196196
}
197197
}

src/Controllers/RegisterController.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,18 @@ protected function getUserEntity(): User
130130
*/
131131
protected function getValidationRules(): array
132132
{
133+
$registrationUsernameRules = array_merge(
134+
config('AuthSession')->usernameValidationRules,
135+
['is_unique[users.username]']
136+
);
137+
$registrationEmailRules = array_merge(
138+
config('AuthSession')->emailValidationRules,
139+
['is_unique[auth_identities.secret]']
140+
);
141+
133142
return setting('Validation.registration') ?? [
134-
'username' => 'required|alpha_numeric_space|min_length[3]|is_unique[users.username]',
135-
'email' => 'required|valid_email|is_unique[auth_identities.secret]',
143+
'username' => $registrationUsernameRules,
144+
'email' => $registrationEmailRules,
136145
'password' => 'required|strong_password',
137146
'password_confirm' => 'required|matches[password]',
138147
];

src/Models/UserModel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public function addToDefaultGroup(User $user): void
118118
public function fake(Generator &$faker): User
119119
{
120120
return new User([
121-
'username' => str_replace('.', ' ', $faker->userName),
121+
'username' => $faker->userName,
122122
'active' => true,
123123
]);
124124
}

tests/Controllers/LoginTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ public function testLoginActionUsernameSuccess(): void
120120
// Change the validation rules
121121
$config = new class () extends Validation {
122122
public $login = [
123-
'username' => 'required|max_length[30]|alpha_numeric_space|min_length[3]',
124123
'password' => 'required',
125124
];
126125
};
126+
$config->login['username'] = config('AuthSession')->usernameValidationRules;
127127
Factories::injectMock('config', 'Validation', $config);
128128

129129
$this->user->createEmailIdentity([
@@ -139,6 +139,8 @@ public function testLoginActionUsernameSuccess(): void
139139
$result->assertSessionHas('user', ['id' => 1]);
140140
$result->assertStatus(302);
141141
$result->assertRedirect();
142+
$result->assertSessionMissing('error');
143+
$result->assertSessionMissing('errors');
142144
$this->assertSame(site_url(), $result->getRedirectUrl());
143145

144146
// Login should have been recorded successfully
@@ -191,6 +193,8 @@ public function testLoginRedirectsToActionIfDefined(): void
191193
// Should have been redirected to the action's page.
192194
$result->assertStatus(302);
193195
$result->assertRedirect();
196+
$result->assertSessionMissing('error');
197+
$result->assertSessionMissing('errors');
194198
$this->assertSame(site_url('auth/a/show'), $result->getRedirectUrl());
195199
}
196200
}

tests/Controllers/RegisterTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public function testRegisterActionSuccess(): void
5353

5454
$result->assertStatus(302);
5555
$result->assertRedirect();
56+
$result->assertSessionMissing('error');
57+
$result->assertSessionMissing('errors');
5658

5759
$this->assertSame(site_url(), $result->getRedirectUrl());
5860

@@ -96,6 +98,7 @@ public function testRegisterRedirectsIfNotAllowed(): void
9698

9799
$result->assertStatus(302);
98100
$result->assertRedirect();
101+
$result->assertSessionHas('error');
99102
}
100103

101104
public function testRegisterActionRedirectsIfNotAllowed(): void
@@ -108,6 +111,7 @@ public function testRegisterActionRedirectsIfNotAllowed(): void
108111

109112
$result->assertStatus(302);
110113
$result->assertRedirect();
114+
$result->assertSessionHas('error');
111115
}
112116

113117
public function testRegisterActionInvalidData(): void

0 commit comments

Comments
 (0)