1010namespace Nette \Bridges \SecurityDI ;
1111
1212use Nette ;
13+ use Nette \Schema \Expect ;
1314
1415
1516/**
1617 * Security extension for Nette DI.
1718 */
1819class SecurityExtension extends Nette \DI \CompilerExtension
1920{
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-
2721 /** @var bool */
2822 private $ debugMode ;
2923
3024
3125 public function __construct (bool $ debugMode = false )
3226 {
33- $ this ->defaults ['debugger ' ] = interface_exists (\Tracy \IBarPanel::class);
3427 $ this ->debugMode = $ debugMode ;
3528 }
3629
3730
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+
3850 public function loadConfiguration ()
3951 {
40- $ config = $ this ->validateConfig ( $ this -> defaults ) ;
52+ $ config = $ this ->config ;
4153 $ builder = $ this ->getContainerBuilder ();
4254
4355 $ builder ->addDefinition ($ this ->prefix ('passwords ' ))
@@ -50,15 +62,15 @@ public function loadConfiguration()
5062 $ user = $ builder ->addDefinition ($ this ->prefix ('user ' ))
5163 ->setFactory (Nette \Security \User::class);
5264
53- if ($ this ->debugMode && $ config[ ' debugger ' ] ) {
65+ if ($ this ->debugMode && $ config-> debugger ) {
5466 $ user ->addSetup ('@Tracy\Bar::addPanel ' , [
5567 new Nette \DI \Definitions \Statement (Nette \Bridges \SecurityTracy \UserPanel::class),
5668 ]);
5769 }
5870
59- if ($ config[ ' users ' ] ) {
71+ if ($ config-> users ) {
6072 $ usersList = $ usersRoles = [];
61- foreach ($ config[ ' users ' ] as $ username => $ data ) {
73+ foreach ($ config-> users as $ username => $ data ) {
6274 $ data = is_array ($ data ) ? $ data : ['password ' => $ data ];
6375 $ this ->validateConfig (['password ' => null , 'roles ' => null ], $ data , $ this ->prefix ("security.users. $ username " ));
6476 $ usersList [$ username ] = $ data ['password ' ];
@@ -74,15 +86,15 @@ public function loadConfiguration()
7486 }
7587 }
7688
77- if ($ config[ ' roles ' ] || $ config[ ' resources ' ] ) {
89+ if ($ config-> roles || $ config-> resources ) {
7890 $ authorizator = $ builder ->addDefinition ($ this ->prefix ('authorizator ' ))
7991 ->setType (Nette \Security \IAuthorizator::class)
8092 ->setFactory (Nette \Security \Permission::class);
8193
82- foreach ($ config[ ' roles ' ] as $ role => $ parents ) {
94+ foreach ($ config-> roles as $ role => $ parents ) {
8395 $ authorizator ->addSetup ('addRole ' , [$ role , $ parents ]);
8496 }
85- foreach ($ config[ ' resources ' ] as $ resource => $ parents ) {
97+ foreach ($ config-> resources as $ resource => $ parents ) {
8698 $ authorizator ->addSetup ('addResource ' , [$ resource , $ parents ]);
8799 }
88100
0 commit comments