code: public function checkPermission()
  	{
  		if ($this->User->isAdmin)
  		{
  			return;
  		}
  
  		// Check current action
  		switch (Contao\Input::get('act'))
  		{
  			case 'create':
  			case 'select':
  			case 'show':
  				// Allow
  				break;
  
  			case 'delete':
  				if (Contao\Input::get('id') == $this->User->id)
  				{
  					throw new Contao\CoreBundle\Exception\AccessDeniedException('Attempt to delete own account ID ' . Contao\Input::get('id') . '.');
  				}
  				// no break;
  
  			case 'edit':
  			case 'copy':
  			case 'toggle':
  			default:
  				$objUser = $this->Database->prepare("SELECT `admin` FROM tl_user WHERE id=?")
  										  ->limit(1)
  										  ->execute(Contao\Input::get('id'));
  
  				if ($objUser->admin && Contao\Input::get('act') != '')
  				{
  					throw new Contao\CoreBundle\Exception\AccessDeniedException('Not enough permissions to ' . Contao\Input::get('act') . ' administrator account ID ' . Contao\Input::get('id') . '.');
  				}
  				break;
  
  			case 'editAll':
  			case 'deleteAll':
  			case 'overrideAll':
  				/** @var Symfony\Component\HttpFoundation\Session\SessionInterface $objSession */
  				$objSession = Contao\System::getContainer()->get('session');
  
  				$session = $objSession->all();
  				$objUser = $this->Database->execute("SELECT id FROM tl_user WHERE `admin`=1");
  				$session['CURRENT']['IDS'] = array_diff($session['CURRENT']['IDS'], $objUser->fetchEach('id'));
  				$objSession->replace($session);
  				break;
  		}
  	}
docs: Check permissions to edit table tl_user
  
  @throws Contao\CoreBundle\Exception\AccessDeniedException