Page visible for authenticated user, not custom role
When declaring items in hook_menu(), you can specify a custom access callback property. This should be a function that returns TRUE if the user has access to the page.

In this function you can have a look at the global $user object (ie. the currently logged-in user) and determine whether to grant access or not:

/**
 * Implementation of hook_menu()
 */
function hook_menu() {
  $items['user/%/custom-page'] = array(
    'title' =&gt; 'Custom Page',
    'type' =&gt; MENU_CALLBACK,
    'page callback' =&gt; 'your_page_callback',
    'access callback' =&gt; 'custom_page_access',
    'access arguments' =&gt; array(1),
  );

  return $items;
}

/**
 * Access callback for /user/%/custom-page

 * @param  {[type]} $account [description]
 * @return {[type]}          [description]
 */
function custom_page_access($account) {
  // how do you want to handle role restrictions? if looking at the user
  // whose custom-page is being loaded, use $account, otherwise the global
  // $user object:

  global $user;

  // check that role id 3 IS set, and role id 5 is NOT
  if (isset($user-&gt;roles[3]) &amp;&amp; !isset($user-&gt;roles[5])) {
    return TRUE;
  }

  return FALSE;
}


Don't forget to clear the site's cache (to rebuild the menu registry) after making these changes.