10
10
namespace Nette \Bridges \SecurityDI ;
11
11
12
12
use Nette ;
13
+ use Nette \Schema \Expect ;
13
14
14
15
15
16
/**
16
17
* Security extension for Nette DI.
17
18
*/
18
19
class SecurityExtension extends Nette \DI \CompilerExtension
19
20
{
20
- public $ defaults = [
21
- 'debugger ' => null ,
22
- 'users ' => [], // of [user => password] or [user => ['password' => password, 'roles' => [role]]]
23
- 'roles ' => [], // of [role => parent(s)]
24
- 'resources ' => [], // of [resource => parent]
25
- ];
26
-
27
21
/** @var bool */
28
22
private $ debugMode ;
29
23
30
24
31
25
public function __construct (bool $ debugMode = false )
32
26
{
33
- $ this ->defaults ['debugger ' ] = interface_exists (\Tracy \IBarPanel::class);
34
27
$ this ->debugMode = $ debugMode ;
35
28
}
36
29
37
30
31
+ public function getConfigSchema (): Nette \Schema \Schema
32
+ {
33
+ return Expect::structure ([
34
+ 'debugger ' => Expect::bool (interface_exists (\Tracy \IBarPanel::class)),
35
+ 'users ' => Expect::arrayOf (
36
+ Expect::enum (
37
+ Expect::string (), // user => password
38
+ Expect::structure ([ // user => password + roles
39
+ 'password ' => Expect::string (),
40
+ 'roles ' => Expect::enum (Expect::string (), Expect::listOf ('string ' )),
41
+ ])->castTo ('array ' )
42
+ )
43
+ ),
44
+ 'roles ' => Expect::arrayOf ('string ' ), // role => parent(s)
45
+ 'resources ' => Expect::arrayOf ('string ' ), // resource => parent
46
+ ]);
47
+ }
48
+
49
+
38
50
public function loadConfiguration ()
39
51
{
40
- $ config = $ this ->validateConfig ( $ this -> defaults ) ;
52
+ $ config = $ this ->config ;
41
53
$ builder = $ this ->getContainerBuilder ();
42
54
43
55
$ builder ->addDefinition ($ this ->prefix ('passwords ' ))
@@ -50,15 +62,15 @@ public function loadConfiguration()
50
62
$ user = $ builder ->addDefinition ($ this ->prefix ('user ' ))
51
63
->setFactory (Nette \Security \User::class);
52
64
53
- if ($ this ->debugMode && $ config[ ' debugger ' ] ) {
65
+ if ($ this ->debugMode && $ config-> debugger ) {
54
66
$ user ->addSetup ('@Tracy\Bar::addPanel ' , [
55
67
new Nette \DI \Definitions \Statement (Nette \Bridges \SecurityTracy \UserPanel::class),
56
68
]);
57
69
}
58
70
59
- if ($ config[ ' users ' ] ) {
71
+ if ($ config-> users ) {
60
72
$ usersList = $ usersRoles = [];
61
- foreach ($ config[ ' users ' ] as $ username => $ data ) {
73
+ foreach ($ config-> users as $ username => $ data ) {
62
74
$ data = is_array ($ data ) ? $ data : ['password ' => $ data ];
63
75
$ this ->validateConfig (['password ' => null , 'roles ' => null ], $ data , $ this ->prefix ("security.users. $ username " ));
64
76
$ usersList [$ username ] = $ data ['password ' ];
@@ -74,15 +86,15 @@ public function loadConfiguration()
74
86
}
75
87
}
76
88
77
- if ($ config[ ' roles ' ] || $ config[ ' resources ' ] ) {
89
+ if ($ config-> roles || $ config-> resources ) {
78
90
$ authorizator = $ builder ->addDefinition ($ this ->prefix ('authorizator ' ))
79
91
->setType (Nette \Security \IAuthorizator::class)
80
92
->setFactory (Nette \Security \Permission::class);
81
93
82
- foreach ($ config[ ' roles ' ] as $ role => $ parents ) {
94
+ foreach ($ config-> roles as $ role => $ parents ) {
83
95
$ authorizator ->addSetup ('addRole ' , [$ role , $ parents ]);
84
96
}
85
- foreach ($ config[ ' resources ' ] as $ resource => $ parents ) {
97
+ foreach ($ config-> resources as $ resource => $ parents ) {
86
98
$ authorizator ->addSetup ('addResource ' , [$ resource , $ parents ]);
87
99
}
88
100
0 commit comments