14
14
use Doctrine \DBAL \Connection ;
15
15
use Doctrine \DBAL \Driver \Result as DriverResult ;
16
16
use Doctrine \DBAL \Result ;
17
+ use Doctrine \DBAL \Schema \Schema ;
17
18
use Doctrine \DBAL \Types \Types ;
18
19
use Symfony \Component \Security \Core \Authentication \RememberMe \PersistentToken ;
19
20
use Symfony \Component \Security \Core \Authentication \RememberMe \PersistentTokenInterface ;
40
41
*/
41
42
class DoctrineTokenProvider implements TokenProviderInterface
42
43
{
43
- private $ conn ;
44
+ private const TABLE = ' rememberme_token ' ;
44
45
45
- public function __construct (Connection $ conn )
46
+ private $ connection ;
47
+
48
+ public function __construct (Connection $ connection )
46
49
{
47
- $ this ->conn = $ conn ;
50
+ $ this ->connection = $ connection ;
48
51
}
49
52
50
53
/**
@@ -53,11 +56,10 @@ public function __construct(Connection $conn)
53
56
public function loadTokenBySeries (string $ series )
54
57
{
55
58
// the alias for lastUsed works around case insensitivity in PostgreSQL
56
- $ sql = 'SELECT class, username, value, lastUsed AS last_used '
57
- .' FROM rememberme_token WHERE series=:series ' ;
59
+ $ sql = 'SELECT class, username, value, lastUsed AS last_used FROM ' .self ::TABLE .' WHERE series=:series ' ;
58
60
$ paramValues = ['series ' => $ series ];
59
61
$ paramTypes = ['series ' => \PDO ::PARAM_STR ];
60
- $ stmt = $ this ->conn ->executeQuery ($ sql , $ paramValues , $ paramTypes );
62
+ $ stmt = $ this ->connection ->executeQuery ($ sql , $ paramValues , $ paramTypes );
61
63
$ row = $ stmt instanceof Result || $ stmt instanceof DriverResult ? $ stmt ->fetchAssociative () : $ stmt ->fetch (\PDO ::FETCH_ASSOC );
62
64
63
65
if ($ row ) {
@@ -72,13 +74,13 @@ public function loadTokenBySeries(string $series)
72
74
*/
73
75
public function deleteTokenBySeries (string $ series )
74
76
{
75
- $ sql = 'DELETE FROM rememberme_token WHERE series=:series ' ;
77
+ $ sql = 'DELETE FROM ' . self :: TABLE . ' WHERE series=:series ' ;
76
78
$ paramValues = ['series ' => $ series ];
77
79
$ paramTypes = ['series ' => \PDO ::PARAM_STR ];
78
- if (method_exists ($ this ->conn , 'executeStatement ' )) {
79
- $ this ->conn ->executeStatement ($ sql , $ paramValues , $ paramTypes );
80
+ if (method_exists ($ this ->connection , 'executeStatement ' )) {
81
+ $ this ->connection ->executeStatement ($ sql , $ paramValues , $ paramTypes );
80
82
} else {
81
- $ this ->conn ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
83
+ $ this ->connection ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
82
84
}
83
85
}
84
86
@@ -87,8 +89,7 @@ public function deleteTokenBySeries(string $series)
87
89
*/
88
90
public function updateToken (string $ series , string $ tokenValue , \DateTime $ lastUsed )
89
91
{
90
- $ sql = 'UPDATE rememberme_token SET value=:value, lastUsed=:lastUsed '
91
- .' WHERE series=:series ' ;
92
+ $ sql = 'UPDATE ' .self ::TABLE .' SET value=:value, lastUsed=:lastUsed WHERE series=:series ' ;
92
93
$ paramValues = [
93
94
'value ' => $ tokenValue ,
94
95
'lastUsed ' => $ lastUsed ,
@@ -99,10 +100,10 @@ public function updateToken(string $series, string $tokenValue, \DateTime $lastU
99
100
'lastUsed ' => Types::DATETIME_MUTABLE ,
100
101
'series ' => \PDO ::PARAM_STR ,
101
102
];
102
- if (method_exists ($ this ->conn , 'executeStatement ' )) {
103
- $ updated = $ this ->conn ->executeStatement ($ sql , $ paramValues , $ paramTypes );
103
+ if (method_exists ($ this ->connection , 'executeStatement ' )) {
104
+ $ updated = $ this ->connection ->executeStatement ($ sql , $ paramValues , $ paramTypes );
104
105
} else {
105
- $ updated = $ this ->conn ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
106
+ $ updated = $ this ->connection ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
106
107
}
107
108
if ($ updated < 1 ) {
108
109
throw new TokenNotFoundException ('No token found. ' );
@@ -114,9 +115,7 @@ public function updateToken(string $series, string $tokenValue, \DateTime $lastU
114
115
*/
115
116
public function createNewToken (PersistentTokenInterface $ token )
116
117
{
117
- $ sql = 'INSERT INTO rememberme_token '
118
- .' (class, username, series, value, lastUsed) '
119
- .' VALUES (:class, :username, :series, :value, :lastUsed) ' ;
118
+ $ sql = 'INSERT INTO ' .self ::TABLE .' (class, username, series, value, lastUsed) VALUES (:class, :username, :series, :value, :lastUsed) ' ;
120
119
$ paramValues = [
121
120
'class ' => $ token ->getClass (),
122
121
'username ' => $ token ->getUsername (),
@@ -131,10 +130,38 @@ public function createNewToken(PersistentTokenInterface $token)
131
130
'value ' => \PDO ::PARAM_STR ,
132
131
'lastUsed ' => Types::DATETIME_MUTABLE ,
133
132
];
134
- if (method_exists ($ this ->conn , 'executeStatement ' )) {
135
- $ this ->conn ->executeStatement ($ sql , $ paramValues , $ paramTypes );
133
+ if (method_exists ($ this ->connection , 'executeStatement ' )) {
134
+ $ this ->connection ->executeStatement ($ sql , $ paramValues , $ paramTypes );
136
135
} else {
137
- $ this ->conn ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
136
+ $ this ->connection ->executeUpdate ($ sql , $ paramValues , $ paramTypes );
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Adds the Table to the Schema if remember me uses this Connection.
142
+ */
143
+ public function configureSchema (Schema $ schema , Connection $ forConnection ): void
144
+ {
145
+ // only update the schema for this connection
146
+ if ($ forConnection !== $ this ->connection ) {
147
+ return ;
138
148
}
149
+
150
+ if ($ schema ->hasTable (self ::TABLE )) {
151
+ return ;
152
+ }
153
+
154
+ $ this ->addTableToSchema ($ schema );
155
+ }
156
+
157
+ private function addTableToSchema (Schema $ schema ): void
158
+ {
159
+ $ table = $ schema ->createTable (self ::TABLE );
160
+ $ table ->addColumn ('series ' , Types::STRING , ['length ' => 88 ]);
161
+ $ table ->addColumn ('value ' , Types::STRING , ['length ' => 88 ]);
162
+ $ table ->addColumn ('lastUsed ' , Types::DATETIME_MUTABLE );
163
+ $ table ->addColumn ('class ' , Types::STRING , ['length ' => 100 ]);
164
+ $ table ->addColumn ('username ' , Types::STRING , ['length ' => 200 ]);
165
+ $ table ->setPrimaryKey (['series ' ]);
139
166
}
140
167
}
0 commit comments