GWT RPC с Spring Security на основе ролевой безопасности

1

Мой вопрос довольно прост. " Могут ли возникать проблемы при использовании 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, когда неавторизованные пользователи роли получают доступ к этому методу. Я бы очень оценил любые ваши предложения. Извините за мой длинный вопрос. Я больше не хочу удариться головой! Благодарю.

  • 0
    Я также использовал безопасность входа в Spring Security, как я описал, и это прекрасно работает. Но для безопасности уровня метода, что я не прав? Это не перенаправляет на мою страницу unSecure.html, за исключением входа в консоль как AccessDenied .
Теги:
spring-security
spring
gwt
gwt-rpc

1 ответ

2

Как и в моем последнем ответе, я использовал это давным-давно. В моем случае вместо того, чтобы всегда обращаться с адресами, которые я делегировал в обработчики.

Я хочу сказать, что если вы хотите интегрировать 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

  • Делегируйте на обработчиках, как я (будьте осторожны, может быть, у вас все хорошо, и ошибка в другой части, но по крайней мере мне понравилось в этом примере, и это сработало).

Извините за то, что вы не указали прямо ошибку, я надеюсь, что ответы на это помогут.

Благодарю.

  • 0
    Спасибо брат ! и спасибо за ваш предыдущий ответ на мой вопрос :-). В настоящее время, как указать перехватчик для вызовов RPC?
  • 0
    потому что я использую безопасность уровня метода как @PreAuthorize("hasRole('ROLE_ADMIN')") .
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню