Доступ Spring Spring к запросу без предварительной аутентификации с удаленного доступа

Я написал здесь, потому что я не могу найти четкий ответ на мою проблему:

Мой проект использует Spring MVC и Spring Security. Я хорошо установлен как для веб-приложения (конечно, с использованием Java). Я могу получить доступ с помощью метода post и get, но только после того, как пользователь был подключен через обычную форму Spring Security.

С этого момента пользователь делает запрос по адресу, подобному этому:

../../get.request?request=getListCommand

где get.request - это отображение из Spring MVC. Этот доступ активируется только после аутентификации пользователя!

Что мне нужно сделать: добавить возможность доступа непосредственно к этому запросу, без предварительной проверки подлинности, используя адрес, подобный этому, например:

http://123.123.123.123:123/get.request?request=getListCommand&j_password=myPassword&j_username=myName

или же

same thing with the post protocol and the params given (request=getListCommand, j_password=myPassword, j_username=myName)

Конечно, аутентификация должна быть выполнена до того, как запрос будет выполнен, а результат отправлен обратно.

Я искал на многих веб-сайтах или непосредственно на веб-сайте безопасности Spring. Они говорят о цепочке фильтров, аутентификации имени пользователя, RMI; но я не нашел полного примера того, что я представил выше.

Спасибо всем, кто может мне помочь.

ps: я использую все настройки по умолчанию или самую простую конфигурацию для безопасности Spring (без стиля fengshui:-))

Вот мой секретный XML-файл

<http realm="NexCap Up"
        auto-config="true"
        access-denied-page="/www/jsp/authentication/accessDenied.jsp"
        create-session="always"
        disable-url-rewriting="true">          
            <port-mappings>
                <port-mapping http="8084" https="8443"/>
            </port-mappings>        

            <intercept-url pattern="/www/jsp/authentication/connexion.jsp"                    
                access='IS_AUTHENTICATED_ANONYMOUSLY' requires-channel="https"/>

            <intercept-url pattern="/www/jsp/authentication/connexionFailed.jsp" 
                access='IS_AUTHENTICATED_ANONYMOUSLY'  />

            <intercept-url pattern="/www/jsp/authentication/applicationExit.jsp" 
                access='IS_AUTHENTICATED_ANONYMOUSLY'  /> 


          <intercept-url 
                pattern="/get.Request" 
                method="GET"
                access="ROLE_REMOTE" />

             <intercept-url 
                pattern="/post.Request"  
                method="POST"
                access="ROLE_REMOTE" />

            <intercept-url pattern="/**" 
                access="ROLE_REMOTE,ROLE_SCRIPT"  />
       <form-login 
            authentication-failure-url="/www/jsp/authentication/connexionFailed.jsp"
            login-page="/www/jsp/authentication/connexion.jsp"
            default-target-url="/www/jsp/index.jsp"
            always-use-default-target="true"/>

        <logout
            logout-success-url="/www/jsp/authentication/applicationExit.jsp"
            invalidate-session="true"/>

        <session-management
            invalid-session-url="/www/jsp/authentication/invalidSession.jsp"
            session-authentication-error-url = "/www/jsp/authentication/authentificationError.jsp"
            session-fixation-protection="none">

            <!-- Sessions concurrentes -->
            <concurrency-control 
                error-if-maximum-exceeded="false"
                expired-url="/www/jsp/authentication/sessionExpired.jsp"
                max-sessions="1" />

        </session-management>

    </http>

И часть файла web.xml о весенней безопасности

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Security</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>


<filter>
  <display-name>springSecurityFilterChain</display-name>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy
  </filter-class>

<filter-mapping>
   <filter-name>springSecurityFilterChain</filter-name>
   <url-pattern>/*</url-pattern>

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
       /WEB-INF/spring/secu-config.xml
   </param-value>

1 ответ

Предполагая, что есть applicationContext-security.xml в вашем WEB-INF.
Было бы здорово, если бы вы могли опубликовать свое приложение Context-security.xml
А также, что у вас есть почти стандартная конфигурация для весенней безопасности.

Я бы порекомендовал следующее.

Сначала измените ваш URL на /public/get.request?request=getListCommand

Затем добавьте следующий фрагмент в applicationContext-security.xml

<http use-expressions="true">
 <intercept-url pattern="/public/**" access="permitAll" />
 <!-- You can add n number of filters here-->
</http>

Что он будет делать, это обойти безопасность для всех путей под /public/, Причина изменения URL-адреса заключается в том, что вы не хотите, чтобы все ваше приложение было общедоступным.

Ниже приведен пример моего XML.
Также обратите внимание, что мой провайдер аутентификации - пользовательский, так что не путайте с этим. Все, что вам нужно, это посмотреть на мой <http> раздел, и вы получите представление о том, как реализовать в вашем приложении.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled">
        <!-- AspectJ pointcut expression that locates our "post" method and applies security that way
        <protect-pointcut expression="execution(* bigbank.*Service.post*(..))" access="ROLE_TELLER"/>
        -->
    </global-method-security>

    <http use-expressions="true">
        <intercept-url pattern="/favicon.ico" access="permitAll" />
        <intercept-url pattern="/static/**" access="permitAll"/>
        <intercept-url pattern="/login.jsp*" access="permitAll"/>
        <intercept-url pattern="/Admin/**" access="hasAnyRole('ROLE_SUPER_USER')"/>
        <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" />
        <http-basic/>
        <logout logout-success-url="/login.jsp"/>
        <remember-me user-service-ref="loginService" />
        <!-- Uncomment to limit the number of sessions a user can have -->
     </http>

    <authentication-manager>
        <authentication-provider user-service-ref="loginService">
         <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="loginService" class="com.indyaah.service.LoginService">
    </beans:bean>
    <beans:bean id="authService" class="com.indyaah.service.AuthService" />
</beans:beans>

Как вы можете видеть, я позволяю login.jsp и мой статический контент (images/js/css/etc.), доступ к которому осуществляется анонимно, без входа в систему.

Надеюсь, это поможет.

Дайте мне знать, если вам нужна дополнительная помощь в понимании.

Другие вопросы по тегам