2009-05-05 1 views
0

У меня есть проблема, когда дело доходит до объектов GrantedAuthority в приложении Spring Security. Я ищу хороший способ справиться с вещами. Прежде всего, я пытаюсь описать свою озабоченность, если есть какие-то фактические ошибки, не стесняйтесь указывать на них, я буду только благодарен.Spring Security: Советы по управлению GrantedAuthority

Spring Security использует экземпляры GrantedAuthority, чтобы действовать как токены авторизации в разных частях приложения.

По умолчанию GrantedAuthority может представлять себя как String. Когда методы, закрепленные с помощью @Secured («ROLE_NAME») или URL, защищены с использованием конфигурации Spring XML или когда HttpServletRequest запрос проверяется программно, как в если (request.isUserInRole («ROLE_NAME»)) {..} это всегда строка, которую вы используете, чтобы указать полномочия, на которые установлен флажок.

Мне интересно, как использовать статические строки в нескольких местах приложения. Если имя роли изменено, разработчику необходимо выследить все старые строки и обновить их. Не будет ошибки времени компиляции, если String будет пропущена, только проблема во время выполнения.

Каков наилучший способ для вас, когда дело касается обработки объектов GrantedAuthority в приложении Spring Security? Какие плюсы и минусы имеют ваше решение?

ответ

0

Я не вижу здесь большой проблемы. Для GrantedAuthority очень маловероятно изменить ключ. Просто не называйте роли ROLE_A.

Кроме того, я лично предпочитаю настройку безопасности XML через аннотации. В общем, держать любые связанные конфигурации в одном месте выглядит как хорошая идея.

+0

Проблема, которую я вижу, заключается в том, что легко что-то опечатать и не узнать об этом до тех пор, пока приложение не будет протестировано или запущено. Изменение в декларативных ошибках во время компиляции является плюсом в моей книге. И всегда есть баланс между сохранением «связанных конфигураций» и сохранением их вместе с тем, что они настраивают. Например, я предпочитаю аннотации в большинстве случаев, когда конфигурация не изменяется между средами test, dev и prod. Вот почему я использую аннотации для объектов Hibernate и XML-конфигурации для своих весенних бобах. – 2009-06-18 17:01:44

+0

s/alterted/alerted – 2009-06-18 17:41:25

-1

Весной и другими системами (особенно для динамических языков) используется «Конвенция по конфигурации». Если бы вы сами могли сами определять имена ролей, вы легко обнаружите, что нужны гораздо больше строк кода.

Так что придерживаться конвенции. Всегда используйте 3 следующие роли: ROLE_ANONYMOUS, ROLE_ADMIN и ROLE_USER. Если вам нужен другой, назовите его соответствующим образом и используйте его во всех случаях. Документация важна.

Также тестируется модульное тестирование. Это помогает вам в случаях, когда ошибка не улавливается компилятором.

+0

Спасибо за ваш ответ, но я думаю, вы в замешательстве. Конвент-конфигурация не связана с этим вообще, я должен настроить имена ролей в каждом месте, где я их использую. Консолидация конфигурации - это когда мне не нужно что-то настраивать, если я не хочу нарушить соглашение. Эти три имени роли могут быть широко использованы. Но я все еще не получаю ошибок времени компиляции, что было моей жалобой. Разумеется, тестирование модулей хорошо, я до сих пор не вижу явного преимущества в том, что у меня нет возможности использовать декларации, которые компилируются компилятором. Бесшумные ошибки никогда не бывают хорошими. Все IMHO. :) – 2009-06-18 16:56:08

+0

С помощью «Я должен настроить имена ролей в каждом месте, где я их использую». Я имею в виду, что каждый раз я пишу имя принятой роли (ей). Ничто не мешает мне выполнить орфографическую ошибку, это будет просто интерпретироваться как новая роль (которой нет у пользователя). В этом смысле я все время выполняю настройку при использовании '@ Secured'. – 2009-06-18 16:58:14

+0

сообщение не имеет ничего общего с вопросом. –

1

Прежде всего, если возможно, выполняйте свои проверки только в определенном месте приложения (например, HTTP-перехватчик в начале запроса) и используя только один из указанных подходов. Это хорошая практика, так как вы сможете авторитетно узнать, когда пользователь станет авторизованным.

Если это невозможно, используйте перечисления для имен ролей и сравните их только с перечислениями. Поэтому, если вы хотите найти все приложения в приложении, это простой поиск.

+0

+1. Эта проблема изменения строк/создания констант/перечислений не имеет ничего общего с использованием Spring Security - хорошая практика, несмотря ни на что. –

+0

Я использую комбинацию защиты метода на уровне Spring (службы) и безопасности компонентов на уровне Wicket (презентация). Идея состоит в том, что если что-то пропущено в одном из слоев, это, скорее всего, связано с другим. Риск того, что пользователям не разрешено выполнять код, который им разрешено выполнять, немного увеличивается, но я думаю, что это того стоит. – 2009-06-18 17:07:30

+0

Использование перечислений - именно то, что я хотел бы сделать. Но, насколько я понял, это кажется невозможным, поскольку интерфейс GrantedAuthority расширяет Comparable. Результатом моего перечисления является «Имя столкновения: метод compareTo (Object) типа A имеет такое же стирание, как compareTo (T) типа Comparable , но не переопределяет его, где A - это имя моего перечисления. – 2009-06-18 17:08:02