2013-07-29 2 views
2

У меня есть механизм конвенционного роль в моем приложении, для которого каждая роль следует синтаксис:Использование маски в роли Spring Security

APP_DEPARTMENT1_USER 
APP_DEPARTMENT1_AUDITOR 
APP_DEPARTMENT1_WHATEVER 
APP_DEPARTMENT2_... 

Я хочу настроить Spring безопасности для того, чтобы обеспечить все роли, которые соответствуют заданному суффикса чтобы получить доступ к разделу моего веб-приложения. Я слепо попробовал <intercept-url pattern="/secure/audit/**" access="APP_*_AUDITOR,APP_ADMINISTRATOR" /> (где APP_ADMINISTRATOR - моя роль администратора по умолчанию), но это не сработало. Когда я вхожу в систему как администратор, я могу получить доступ к этой странице, но когда я пытаюсь войти в систему с профилем с помощью APP_DEPARTMENT1_AUDITOR, я не могу получить доступ к странице.

Я думаю, что подстановочные выражения не поддерживаются, и я не верю, что выражения Spring EL могут помочь (или я просто недостаточно их освоил).

Есть ли способ настроить шаблон ролей для Spring Security в теге <intercept-url>?

ответ

2

Одним из решений может быть использование встроенной поддержки Spring Security для role hierarchies и указание общей роли APP_AUDITOR, которая «включает» роли аудитора отдельных отделов.

Альтернативой может быть создание собственного улучшенного избирателя роли, который может работать с шаблонами, поскольку существующая реализация выполняет только simple equality test. Основываясь на этом существующем классе, должно быть легко выполнить некоторое сопоставление шаблонов. После того, как вы едите, что на месте, вы можете подключить до Обычая избирателя с инфраструктурой безопасности таким образом:

<http access-decision-manager-ref="myAccessDecisionManager"> 
    ... 
</http> 

<bean id="myAccessDecisionManager" 
    class="org.springframework.security.access.vote.AffirmativeBased"> 
    <constructor-arg name="decisionVoters"> 
     <list> 
     <bean id="patternBasedRoleVoter" 
      class="com.example.PatternBasedRoleVoter"/> 
     <bean id="authenticatedVoter" 
      class="org.springframework.security.access.vote.AuthenticatedVoter"/>    
     </list> 
    </constructor-arg> 
</bean> 
+0

Мое приложение в настоящее время не реализует никакой формы иерархии ролей, но ответ заслуживает +1 для будущего рассмотрения –

+0

Обновлен мой ответ альтернативой. – zagyi

2

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

<http use-expressions="true"> 
    <intercept-url pattern="/secure/audit/**" access=" 
     hasRole('APP_DEPARTMENT1_AUDITOR') 
     and hasRole('APP_DEPARTMENT2_AUDITOR') 
     or hasRole('APP_ADMINISTRATOR')" /> 

Представляя ваше выражение безопасности пользовательского hasRegexRole('regex_input') веба, как described here:

<http use-expressions="true"> 
    <intercept-url pattern="/secure/audit/**" access=" 
     hasRegexRole('APP_*_AUDITOR') 
     or hasRole('APP_ADMINISTRATOR')" /> 

Вы можете использовать исходный код из org.springframework.security.access.expression.SecurityExpressionRoot.hasRole(String role) метода, чтобы увидеть, как вы можете получить власть. Затем вам нужно применить соответствие шаблонов регулярных выражений, и все. Надеюсь это поможет.

Смежные вопросы