Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Sping Security разрешения(не роли).


Автор: eugeneu 25.3.2011, 14:42
Здравствуйте! Я новичек в Spring Security.
Использую в проекте Spring MVC 3, и Spring Security 3 на tomcat 6.  

Когда пользователь авторизуется в системе, UserDetails выдает список РОЛЕЙ(ROLE_) -  GrantedAuthorities для этого пользователя.
Соответственно  я могу ограничивать доступ r страницам приложения, написав например:
<intercept-url pattern="/page1.html" access="ROLE_USER,ROLE_MANAGER" />
<intercept-url pattern="/page2.html" access="ROLE_ADMIN" />

Получается, что если я заведу новую роль - придется менять код приложения.

А очень хотелось бы сделать вот так, но я незнаю как это реализовать:

<intercept-url pattern="/page1.html" access="PERM_PAGE1" />
<intercept-url pattern="/page2.html" access="PERM_PAGE2" />

То есть создать ПЕРМИШЕНЫ вместо РОЛЕЙ на каждую страничку и привязывать их к пользователю.
А так же использовать ПЕРМИШЕНЫ в конструкциях типа ifHasRole("ROLE_") - аналогично сделать для пермишенов,
то есть давать доступ например на элемент управления на странице не по РОЛИ а именно по ПЕРМИШЕНУ иначе опять же придется менять код приложения...


Заранее спасибо, буду рад вашим ответам.

Автор: MisterCleric 28.3.2011, 11:52
Привет. Возможно в данном случае тебе поможет использовать вместо обычных выражений access expressions:
Код

  <http use-expressions="true">
            <intercept-url pattern="/page1.html" access="hasRole('PERM_PAGE1')" />
  </http>

И тебе надо будет еще отнаследовать и проконфигурить пару классов:
org.springframework.security.web.access.expression.WebSecurityExpressionRoot 
переписать его метод :
Код

  public final boolean hasRole(String role) {
        return getAuthoritySet().contains(role);
    }

На проверку твоих пермишенов. Или попробуй в твоем наследнике написать новый метод, который ты и будешь использовать в security-expresions, все равно инстанс этого класса потом проставляется как root в EvaluationContext внутри:
org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler
который тоже нужно подправить.
И проставить его при конфигурации бина 
org.springframework.security.web.access.expression.WebExpressionVoter

Это первая часть.
По TLD: никогда не пользовался - надо смотреть исходники, что там твориться. Но думаю, тоже что-то надо будет переписать, или свой кастомный тег написать, который будет трекать твою логику

Автор: eugeneu 29.3.2011, 08:49
Огромное спасибо, MisterCleric. Буду копать...
Я уже подумывал свой spring security писать...

Автор: eugeneu 29.3.2011, 12:31
Еще хотел спросить у вас форумчане. 
Если скажем требуется множество изменений вносить в код фреймворка Spring Security, не проще ли написать маломальски свой но заточенный и без неиспользуемого кода?
Как поступаете вы форумчане? Используете Spring Security в своих проектах или нет?

Автор: MisterCleric 29.3.2011, 13:17
Привет.
Как по мне, то не правильный подход: под каждую задачу когда-то кто-то уже что-то написал. И это строго специфическая реализация конкретной задачи. Наша ж задача не изобретать снова велосипед. Важно найти такой велосипед и смочь посадить на него своего пассажира.
Используем этот framework и еще как!
Да, приходиться иногда что-то допиливать. но благодаря гибкости архитектуры Spring, все всегда можно как-то подконфигурить и с малыми затратами заставить его работать под наше приложение.
Вот пример: у меня приложение развернуто в кластере. А заказали такую функциональность, как настройку длительности сессии, плюс принудительная возможность отключать администратором пользователей.
Так что мы сделали:
Взяли отнаследовали SessionRegistry, хранение идентификаторов сессий и атрибутов времени простоя вынесли в БД, что позволило из любого нода в кластере обращаться к одному хранилищу сессий. 
Ну и security-filter добавили, который проверял период простоя сессии на вариант ее отключения.

Не в обиду сказано: но вряд ли вы настолько умнее, чем разработчики Spring. Они специально этим занимаются и решают именно эту задачу.
Если у вас есть какие-то претензии или пожелания можно всегда им отписать в 
http://forum.springsource.org
Благо люди отзывчивые. 

И там тоже был...

Автор: eugeneu 29.3.2011, 13:46
Да я думаю вы правы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)