Skip to content

Commit f74fb27

Browse files
committed
Fix on get multi audience
implement FIND_BY_SET native query Change-Id: I264ddacc4c04f8e28a142517209b935a6f6796b4
1 parent faef18f commit f74fb27

File tree

3 files changed

+72
-14
lines changed

3 files changed

+72
-14
lines changed

app/Repositories/DoctrineResourceServerRepository.php

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* limitations under the License.
1313
**/
1414

15+
use Doctrine\ORM\Query\ResultSetMappingBuilder;
1516
use Illuminate\Support\Facades\Log;
1617
use Models\OAuth2\ResourceServer;
1718
use OAuth2\Repositories\IResourceServerRepository;
@@ -93,18 +94,47 @@ public function getByFriendlyName(string $name):?ResourceServer
9394
*/
9495
public function getByAudienceAndIpAndActive(array $audience, string $ip):?ResourceServer
9596
{
96-
Log::debug(sprintf("DoctrineResourceServerRepository::getByAudienceAndIpAndActive audience %s ip %s", json_encode($audience), $ip));
97-
return $this->getEntityManager()
98-
->createQueryBuilder()
99-
->select("r")
100-
->from($this->getBaseEntity(), "r")
101-
->where("r.ips like :ip ")
102-
->andWhere("r.host in (:host)")
103-
->andWhere("r.active = 1")
104-
->setParameter("ip", '%'.trim($ip).'%')
105-
->setParameter("host", $audience)
106-
->setMaxResults(1)
107-
->getQuery()
108-
->getOneOrNullResult();
97+
Log::debug
98+
(
99+
sprintf
100+
(
101+
"DoctrineResourceServerRepository::getByAudienceAndIpAndActive audience %s ip %s",
102+
json_encode($audience),
103+
$ip
104+
)
105+
);
106+
107+
$query = <<<SQL
108+
SELECT r.* FROM oauth2_resource_server r
109+
WHERE FIND_IN_SET('{$ip}', r.ips) AND r.active = 1
110+
SQL;
111+
112+
$hosts_query = "";
113+
114+
foreach ($audience as $index => $audience_item) {
115+
if ($index > 0) {
116+
$hosts_query .= " OR ";
117+
}
118+
$hosts_query.= sprintf(" FIND_IN_SET('%s',r.host) ", $audience_item);
119+
}
120+
121+
if(!empty($hosts_query))
122+
$hosts_query = " AND (". $hosts_query .")";
123+
124+
Log::debug(sprintf("DoctrineResourceServerRepository::getByAudienceAndIpAndActive hosts_query %s", $hosts_query));
125+
126+
$query = $query . $hosts_query. " LIMIT 1;";
127+
128+
Log::debug(sprintf("DoctrineResourceServerRepository::getByAudienceAndIpAndActive query %s", $query));
129+
130+
$rsm = new ResultSetMappingBuilder($this->getEntityManager());
131+
$rsm->addRootEntityFromClassMetadata($this->getBaseEntity(), 'r');
132+
133+
// build rsm here
134+
$native_query = $this->getEntityManager()->createNativeQuery($query, $rsm);
135+
136+
$res = $native_query->getResult();
137+
138+
return count($res) > 0 ? $res[0] : null;
109139
}
110140
}

app/Services/OAuth2/TokenService.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -864,14 +864,24 @@ public function checkAccessTokenAudience(AccessToken $access_token, $current_ip)
864864
$current_audience = array($current_audience);
865865
}
866866

867-
$resource_server = $this->resource_server_repository->getByIp($current_ip);
867+
$resource_server = $this->resource_server_repository->getByAudienceAndIpAndActive($current_audience, $current_ip);
868868

869869
// check audience
870870
if(is_null($resource_server)){
871871
Log::warning(sprintf("TokenService::checkAccessTokenAudience not found resource server for ip %s", $current_ip));
872872
return false;
873873
}
874874

875+
Log::debug
876+
(
877+
sprintf
878+
(
879+
"TokenService::checkAccessTokenAudience found resource server %s (%s)",
880+
$resource_server->getId(),
881+
$resource_server->getHost()
882+
)
883+
);
884+
875885
$hosts = explode(',', $resource_server->getHost());
876886

877887
Log::debug

tests/DoctrineRepositoriesTests.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
**/
1414
use LaravelDoctrine\ORM\Facades\EntityManager;
1515
use Illuminate\Support\Facades\Redis;
16+
use Models\OAuth2\ResourceServer;
1617
use Models\OAuth2\ServerPrivateKey;
1718
use Models\UserExceptionTrail;
1819
/**
@@ -65,4 +66,21 @@ public function testUserExceptionTrailRepository(){
6566
EntityManager::remove($ex);
6667
EntityManager::flush();
6768
}
69+
70+
public function testResourceServerRepository(){
71+
$repository = EntityManager::getRepository(ResourceServer::class);
72+
73+
$rs = new ResourceServer();
74+
$rs->setFriendlyName("test".rand(1,1000));
75+
$rs->setActive(true);
76+
$rs->setIps("127.0.0.1,200.0.0.0");
77+
$rs->setHost("https://www.openstack.org,https://test.com");
78+
79+
EntityManager::persist($rs);
80+
EntityManager::flush();
81+
82+
$res = $repository->getByAudienceAndIpAndActive(['https://www.openstack.org', 'https://test.com'], '127.0.0.1');
83+
84+
$this->assertTrue(!is_null($res));
85+
}
6886
}

0 commit comments

Comments
 (0)