Spring Security отозвать власть - PullRequest
2 голосов
/ 28 июля 2011

У меня есть следующая конфигурация безопасности Spring:

<security:http>
     <security:intercept-url pattern="/**"  access="ROLE_USER"/>
     <security:intercept-url pattern="/auth/**"  access="ROLE_ADMIN"/>
....
</security:http> 

Я хотел бы отозвать полномочия «ROLE_ADMIN» у пользователя, когда он выходит из зоны «/ auth / **».

Как мне добиться такой функциональности? Могу ли я установить какой-либо фильтр на все URL-адреса, кроме / auth / **, который отменяет полномочия пользователя?

Могу ли я отозвать его "на лету"?

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Я хотел бы отозвать полномочия «ROLE_ADMIN» у пользователя, когда он выходит из зоны «/ auth / **».

Как мне добиться такой функциональности?Могу ли я установить какой-либо фильтр на все URL-адреса, кроме / auth / **, который отменяет полномочия у пользователя?

Можно ли отменить его "на лету"?

Я думаювы неправильно понимаете значение элемента intercept-url:

<security:intercept-url pattern="/auth/**"  access="ROLE_ADMIN"/>

Это НЕ говорит " предоставить пользователю ROLE_ADMIN в дереве /auth/**".В нем говорится, что «пользователю, у которого есть ROLE_ADMIN, разрешен доступ к страницам в дереве /auth/**».

Идея о том, что роль пользователя меняется в зависимости отто, на что он / она смотрит, странно, если не сказать больше.


Я пытаюсь проверять имя пользователя и пароль каждый раз, когда пользователь нажимает "/ auth /** "psth.

ОК, этот вид имеет смысл как требование.(Хотя, как гипотетический пользователь, я нахожу загадочным и / или раздражающим, что простое перемещение по сайту приводит к выходу из системы.)

Но я не думаю, что вам следует делать это, изменяя пользователя.роль (и) на лету.Если вы сделаете это, вы будете обязаны получать ответы «Отказано в доступе», а не перенаправлять на страницу входа.

Что вам действительно нужно сделать, это вернуть их в состояние «не вошел».Но даже это может быть немного сложнее.Если страницы в дереве /auth/** имеют ссылки на таблицы стилей или файлы сценариев, то когда браузер извлекает эти ссылки, фильтры безопасности могут подумать, что пользователь вышел из дерева /auth/** и выйти из него.

0 голосов
/ 05 октября 2011

Вы должны сделать собственную конфигурацию цепочки и вставить в нее собственный фильтр. Это будет примерно так:

Файл конфигурации безопасности Spring:

    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <security:filter-chain-map path-type="ant">


        <security:filter-chain pattern="/**" filters="
            securityContextPersistenceFilter,
            revokeAuthRoleFilter,
            .. all the other filters here
            filterSecurityInterceptor"
        />
    </security:filter-chain-map>
    </bean>

     <!--Stores SecurityContext between requests and clears SecutityContextHolder-->
    <bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>

     <bean id="revokeAuthRoleFilter" class="com.package.RevokeAuthRoleFilter">

     <!--This filter is called when user is authenticated. It grants access to resources-->
     <bean id="filterSecurityInterceptor"
      class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
           <property name="authenticationManager" ref="authenticationManager"/>
           <property name="accessDecisionManager" ref="accessDecisionManager"/>
           <property name="securityMetadataSource">
              <security:filter-security-metadata-source use-expressions="true">
                 <security:intercept-url pattern='auth/**/' access="hasAnyRole('ROLE_ADMIN')"/>
                 <security:intercept-url pattern='/**' access="hasAnyRole('ROLE_USER')"/>
              </security:filter-security-metadata-source>
          </property>
     </bean>

RevokeAuthRoleFilter лучше определить после securityContextPersistenceFilter, который заполняет и очищает контекст приложения. Чем в вашем пользовательском фильтре вы сможете получить доступ к объекту аутентификации через SecurityContextHolder и изменить его полномочия.

public class RevokeAuthRoleFilter extends GenericFilterBean {

   @Override
   public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {

       HttpServletRequest request = (HttpServletRequest) req;
       HttpServletResponse response = (HttpServletResponse) resp;

       //check current URI or URL for specific conditions (/auth/)
       String uri = reques.getRequestURI();
       if(uri.contains("/auth/"))   {
          //get Authentication object from Security and do something with it
          Authentication authentication =  SecurityContextHolder.getContext().getAuthentication();
       }

       //pass execution to other filters in chain
       filterChain.doFilter(request, response);


  }
}
...