Как изменить псевдоним URL-адреса для безопасности/логина в SilverStripe на пользователя/логин

Я работаю над новым веб-сайтом, созданным в SilverStripe. В настоящее время у меня масса проблем с попыткой заставить систему позволить мне изменить псевдоним URL (или создать второй) для функции входа (и, в конечном итоге, выхода) контроллера безопасности.

Я попытался поиграть с файлом route.yml и попытался создать пути в своем собственном UserController и загрузить их непосредственно из контроллера безопасности с помощью «return Security:: login()». Но это дает мне ошибки об использовании статических функций.

К сожалению, у меня нет большого опыта работы с объектно-ориентированными программами, и это первая CMS, которую я использовал, которая на самом деле использует целую кучу настоящей объектной ориентации. Текущая версия SilverStripe, которую мы используем, — 3.0 (но через несколько дней мы обновим ее до 3.1.1).

Кто-нибудь знает много о маршрутизации в SilverStripe?


person Patrick    schedule 08.11.2013    source источник


Ответы (2)


как вы правильно сказали, у SilverStripe есть маршруты, и их можно определить в файле конфигурации yaml.

если вы посмотрите на существующий routes.yml в фреймворке, вы увидите, как определяется маршрут безопасности по умолчанию: https://github.com/silverstripe/silverstripe-framework/blob/fd6a1619cb7696d0f7e3ab344bc5ac7d9f6cfe77/_config/routes.yml#L17

если вы просто хотите заменить Secuirty на Secuirty/login, это так же просто, как создать свой собственный routes.ymlin mysite/_config/ со следующим содержимым:

---
Name: myroutesorsomeotherrandomname
Before: '*'
After:
  - '#rootroutes'
  - '#coreroutes'
  - '#modelascontrollerroutes'
  - '#adminroutes'
---
Director:
  rules:
    'foobar//$Action/$ID/$OtherID': 'Security'

ПРИМЕЧАНИЕ: убедитесь, что вы запустили ?flush=1, чтобы убедиться, что файл yml загружен (они кэшируются)
также убедитесь, что вы используете пробелы в файле yml, если вы используете вкладки, которые вы будет плохо


однако, если вы хотите также заменить /login и /logout, это больше не нужно для маршрутизации.
вход в систему и выход из системы — это действия (функции php, которые перечислены в Security::$allowed_actions и, таким образом, доступны как URL-адрес) в разделе «Безопасность».
но это все еще довольно просто, просто создайте подкласс Security и создайте нужные действия:

<?php

class MySuperSecurity extends Security {
    private static $allowed_actions = array(
        'showMeTheLoginForm',
        'alternative_login_action_with_dashes',
        'doTheLogout',
    );

    function showMeTheLoginForm() {
        // can be visited via http://website.com/foobar/showMeTheLoginForm
        return $this->login();
    }

    function alternative_login_action_with_dashes() {
        // can be visited via http://website.com/foobar/alternative-login-action-with-dashes
        return $this->login();
    }

    function doTheLogout($redirect = true) {
        // can be visited via http://website.com/foobar/doTheLogout
        return $this->logout($redirect);
    }
}

и укажите путь к вашему новому классу вместо Security внутри routes.yml:

    'foobar//$Action/$ID/$OtherID': 'MySuperSecurity'

ПРИМЕЧАНИЕ: еще раз убедитесь, что вы выполнили ?flush=1, и private static $allowed_actions, и файл конфигурации yml кэшируются silverstripe.
ПРИМЕЧАНИЕ: оба решения предложенный в этом посте, создаст дополнительный маршрут для входа и не заменит существующий, поэтому старый Security/login по-прежнему будет доступен

person Zauberfisch    schedule 09.11.2013
comment
Хорошо, я думаю, что это создает несколько других проблем. Во-первых, что, если я хочу, чтобы только пользователь/логин и пользователь/выход из системы отображались в безопасности. Но затем я хочу, чтобы пользователь/редактировал мой собственный модуль. Казалось бы, этот метод выше для foobar сопоставляет все поддействия foobar с безопасностью. Кроме того, что, если я просто хочу, чтобы пути были /login и /logout? - person Patrick; 12.11.2013
comment
Я бы решил обе эти проблемы, используя такой класс, как MySuperSecurity, но не уверен, что есть другой способ. - person Zauberfisch; 12.11.2013
comment
Ах, я думаю, я мог бы наследовать от Security вместо Page_Controller. И затем создайте другие мои пользовательские функции таким же образом. - person Patrick; 12.11.2013
comment
вы можете сделать MySuperSecurity своего рода прокси и просто вызывать методы на других контроллерах - person Zauberfisch; 12.11.2013
comment
вероятно, также есть способ по-другому обрабатывать URL-адреса, но я должен признать, что еще не понял, как это сделать. - person Zauberfisch; 12.11.2013
comment
В этом случае я решил изменить свой класс UserPage, чтобы расширить безопасность и не определять функцию входа/выхода из системы. Вместо этого я разрешил действия и позволил ему наследовать функции от своего родителя. Как только я установил маршрут 'user//$Action/$ID/$Name' : 'UserPage_Controller' так, чтобы он указывал на контроллер UserPage, и сбросил SilverStripe, он отлично работал для пользователя/логина и пользователя/выхода из системы. Спасибо! Я буду публиковать другие мои успехи с этим здесь. Я медленно осваиваю систему SilverStripe. - person Patrick; 12.11.2013

Я ничего не знаю о SilverStripe, за исключением того, что это CMS, но я думаю, что SilverStripe должен предоставить способ псевдонимов URL. Также альтернативой является создание псевдонима в определении виртуального хоста, если вы используете apache или в файле .htaccess. Дополнительные сведения см. в документе Apache. Если вы опубликуете скелет вашего файла .htaccess или определение VirtualHost, я могу вам помочь.

person rernesto    schedule 08.11.2013
comment
У них есть файл маршрутов и переменная $url_handlers. Но я явно что-то упускаю, если считаю, что могу изменить существующий основной псевдоним на новый. Кажется, они в основном работают для того, что вы создаете в папке своего сайта. Мне пришло в голову сделать замаскированный редирект, используя файл .htaccess. Но это проблематично, поскольку все остальные URL-адреса зарегистрированы в системе, но этого не будет, и поэтому это нарушает стандарт. Это также создает проблемы, когда вы хотите спросить систему о доступных URL-адресах. - person Patrick; 08.11.2013
comment
+1 за нестандартное мышление и предложение mod_rewrite. однако я бы решил это, используя серебряную полосу - person Zauberfisch; 09.11.2013