Restricting Access with a custom method¶
How to implement your own method for checking access rights to your endpoint¶
In most cases using the @Api\Access(...) annotation will be sufficient to restrict the access to your endpoint to certain frontend-users or user groups.
In case you need to implement your own logic for checking access rights, you can simply
define a checkAccess()
-method in the class of your endpoint. This will override the
default checkAccess()
-method from \Nng\Nnrestapi\Api\AbstractApi
.
The checkAccess()
method must return TRUE
, if the user is allowed to access the endpoint.
If it returns FALSE
, the script will automatically be aborted and the Api will return
a HTTP 403 Forbidden
header.
Here is an example:
<?php
namespace My\Extension\Api;
use Nng\Nnrestapi\Api\AbstractApi;
/**
* @Api\Endpoint()
*/
class Test extends AbstractApi
{
/**
* Completely senseless, but nice demo:
* Decide randomly, if the user may access your endpoint.
*
* @param array $endpoint information about the endpoint that was supposed to be called
* @return boolean
*/
public function checkAccess( $endpoint = [] )
{
return rand(0, 2) == 1;
}
/**
* This method will only be accessible if the checkAccess-method
* above returned true as value.
*
* @return array
*/
public function getExampleAction()
{
return ['result'=>'welcome!'];
}
}
The above example can be reached with a GET
request to:
https://www.mysite.com/api/test/example
Example: Restricting access to certain IP-adresses¶
In this example, we will use the checkAccess()
method to check, if the user has a certain IP.
The script will only allow access to the methods in this class, if the $remoteAddr
matches
one of the patterns defined in $allowedIpList
:
<?php
namespace My\Extension\Api;
use Nng\Nnrestapi\Api\AbstractApi;
/**
* @Api\Endpoint()
*/
class Test extends AbstractApi
{
/**
* Checks, if the IP of the user matches a given adress or pattern.
*
* @param array $endpoint
* @return boolean
*/
public function checkAccess( $endpoint = [] )
{
$remoteAddr = $_SERVER['REMOTE_ADDR'];
$allowedIpList = '109.251.*, 109.252.17.2';
return \TYPO3\CMS\Core\Utility\GeneralUtility::cmpIP( $remoteAddr, $allowedIpList );
}
//... your endpoint-methods come here
}
Example: Check for IP-adresses AND certain fe_user¶
If you would like to combine the above example with the check for certain authenticated
Frontend-Users like described in @Api\Access(...) you can always call
the parent::checkAccess()
method in your custom checkAccess()
method.
This will process the login in \Nng\Nnrestapi\Api\AbstractApi::checkAccess()
that
handles restrictions made in the annotations.
<?php
namespace My\Extension\Api;
use Nng\Nnrestapi\Api\AbstractApi;
/**
* @Api\Endpoint()
*/
class Test extends AbstractApi
{
/**
* Checks, if the IP of the user matches a given adress or pattern.
*
* @param array $endpoint
* @return boolean
*/
public function checkAccess( $endpoint = [] )
{
$remoteAddr = $_SERVER['REMOTE_ADDR'];
$allowedIpList = '109.251.*, 109.252.17.2';
// First let's check, if the IP is allowed
if (!\TYPO3\CMS\Core\Utility\GeneralUtility::cmpIP( $remoteAddr, $allowedIpList )) {
return false;
}
// if yes, then let the AbstractApi take care of checking the fe_users etc.
return parent::checkAccess( $endpoint );
}
//... your endpoint-methods come here
}