Мой вопрос довольно прост. " Могут ли возникать проблемы при использовании Spring security и GWT RPC? ".
Я хотел бы использовать защиту уровня весового метода для методов RPC GWT. Например: в моем классе ServiceImpl я использовал контроль доступа на основе выражений, как показано ниже.
@PreAuthorize("hasRole('ROLE_ADMIN')")
public final String getById(Long id) {
.........
}
Если неавторизованные пользователи доступа к роли, пытающиеся получить доступ к странице, связанной с этим методом rpc, исключение было выбрано и не перенаправлено на мою страницу с запретом доступа. Я понятия не имею, почему не идет на мою страницу с запретом доступа? Я получил исключение на моей консоли, как
бросил неожиданное исключение: org.springframework.security.access.AccessDeniedException: доступ запрещен
Я настроил как этот ответ точно, но все равно получаю выше ошибки. Пожалуйста, исправьте меня, если я ошибаюсь "Я думаю, эта проблема может возникнуть из-за gwt RPC", потому что методы non-rpc были точными и перенаправлены на мой unSecure.html. Я провожу около 3 дней за эту ошибку. В onFailure (Throwable caught) моего асинхронного метода show
500 Сбой вызова на сервере; см. журнал сервера для получения более подробной информации
Я хочу показать свои настройки.
весна-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:sec="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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<sec:global-method-security
secured-annotations="enabled" pre-post-annotations="enabled" />
<sec:http auto-config="false" entry-point-ref="authenticateFilterEntryPoint">
<sec:access-denied-handler ref="accessDeniedHandler" />
<sec:intercept-url pattern="/login.html" />
<sec:logout logout-url="/logout.html" logout-success-url="/login.html"
invalidate-session="true" />
<sec:form-login login-page="/login.html"
login-processing-url="/login_check" authentication-failure-url="/login.html?error=1" />
<sec:session-management invalid-session-url="/login.html">
<sec:concurrency-control max-sessions="50"
error-if-maximum-exceeded="true" />
</sec:session-management>
<sec:remember-me key="mykey"
token-validity-seconds="604800" />
</sec:http>
<beans:bean id="authenticateFilterEntryPoint"
class="mypackage.common.security.SessionTimeoutEntryPoint">
<beans:property name="loginFormUrl" value="/login.html" />
</beans:bean>
<beans:bean id="accessDeniedHandler"
class="mypackage.common.security.AccessDeniedEntryPoint">
<beans:property name="errorPage" value="/unSecure.html" />
</beans:bean>
<beans:bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name="defaultErrorView" value="uncaughtException" />
<beans:property name="excludedExceptions"
value="org.springframework.security.access.AccessDeniedException" />
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key=".DataAccessException">dataAccessFailure</beans:prop>
<beans:prop key=".NoSuchRequestHandlingMethodException">resourceNotFound</beans:prop>
<beans:prop key=".TypeMismatchException">resourceNotFound</beans:prop>
<beans:prop key=".MissingServletRequestParameterException">resourceNotFound</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="authenticationUserService"
class="mypackage.common.security.AuthenticationUserService" />
<sec:authentication-manager>
<sec:authentication-provider
user-service-ref="authenticationUserService">
<sec:password-encoder hash="md5" />
</sec:authentication-provider>
</sec:authentication-manager>
<beans:bean id="authLoggerListener"
class="org.springframework.security.authentication.event.LoggerListener" />
<beans:bean id="eventLoggerListener"
class="org.springframework.security.access.event.LoggerListener" />
AccessDeniedEntryPoint.java
public class AccessDeniedEntryPoint extends org.springframework.security.web.access.AccessDeniedHandlerImpl {
private static final Logger logger = LoggerFactory.getLogger(AccessDeniedEntryPoint.class);
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
super.handle(request, response, accessDeniedException);
}
}
SessionTimeoutEntryPoint.java
public class SessionTimeoutEntryPoint extends LoginUrlAuthenticationEntryPoint {
@Override
public final void commence(final HttpServletRequest request, final HttpServletResponse response,
final AuthenticationException authException) throws IOException, ServletException {
super.commence(request, response, authException);
}
}
Таким образом, я хотел бы получить unSecure.html, когда неавторизованные пользователи роли получают доступ к этому методу. Я бы очень оценил любые ваши предложения. Извините за мой длинный вопрос. Я больше не хочу удариться головой! Благодарю.
Как и в моем последнем ответе, я использовал это давным-давно. В моем случае вместо того, чтобы всегда обращаться с адресами, которые я делегировал в обработчики.
Я хочу сказать, что если вы хотите интегрировать GWT-RPC с Spring-Security, первое, что я сделал, было из моего приложения GWT попытаться войти в систему против Spring.
Итак, первое, что вам нужно сделать, это создать RPC-CALL (здесь официальную документацию) для входа.
Я нашел полезную аннотацию @RemoteServiceRelativePath("examplelogin.rpc")
, поэтому, если вы ее используете, вы можете воспользоваться преимуществами этого пути, а затем в spring-security.xml
вы можете отфильтровать запрос по этому пути (см. Обновленный пример ниже).
Не знаете, почему вы хотите интегрировать GWT-RPC с Spring-Security, а затем укажите /login.html (должен ли он быть вызов rpc, описанный выше, вместо html? Но, возможно, вы используете свой собственный MVP с GWT, так что я не говоря, что это неправильно, только меня это удивляет :)).
Читая свой код, я не вижу ничего плохого, но в моем случае у меня есть некоторые отличия:
....
<http use-expressions="true" entry-point-ref="http401UnauthorizedEntryPoint">
<intercept-url pattern="/yourProject/public.rpc" access="permitAll" />
<intercept-url pattern="/yourProject/examplelogin.rpc" access="hasRole('ROLE_ADMIN')" />
<form-login authentication-success-handler-ref="authenticationSuccessHandler"
authentication-failure-handler-ref="authenticationFailureHandler"/>
..... //logout, session-management, custom-filters....
<beans:bean id="http401UnauthorizedEntryPoint"
class="your.project.Http401UnauthorizedEntryPoint" />
<beans:bean id="authenticationSuccessHandler"
class="your.project.GWTAuthenticationSuccessHandler"/>
<beans:bean id="authenticationFailureHandler"
class="your.project.GWTAuthenticationFailureHandler"/>
</http>
....
Вы специально спросили о возможности использования Spring-Security
с GWT-RPC
(это причина, потому что в тегах <intercept-url>
я размещаю там URL-адреса .rpc
)
Обратите внимание, что
Ответ: да, я это сделал (три года назад, но я сделал :))
Я думаю, что здесь ключи для вашей проблемы:
Укажите URL-адрес перехватчика для вызовов RPC или вашего /login.html
Делегируйте на обработчиках, как я (будьте осторожны, может быть, у вас все хорошо, и ошибка в другой части, но по крайней мере мне понравилось в этом примере, и это сработало).
Извините за то, что вы не указали прямо ошибку, я надеюсь, что ответы на это помогут.
Благодарю.
@PreAuthorize("hasRole('ROLE_ADMIN')")
.
AccessDenied
.