Доступ 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.), доступ к которому осуществляется анонимно, без входа в систему.
Надеюсь, это поможет.
Дайте мне знать, если вам нужна дополнительная помощь в понимании.