gpt4 book ai didi

java - 具有 Spring 基于角色的安全性的 GWT RPC

转载 作者:行者123 更新时间:2023-11-30 03:52:49 25 4
gpt4 key购买 nike

我的问题很简单“使用 Spring security 和 GWT RPC 时会遇到任何问题吗?”。

我想在 GWT 的 RPC 方法上使用 spring 的方法级安全性。例如:在我的 ServiceImpl 类中,我使用 Expression-Based Access Control如下。

@PreAuthorize("hasRole('ROLE_ADMIN')")
public final String getById(Long id) {
.........
}

如果取消授权角色访问用户尝试访问处理此 rpc 方法的页面,则会引发异常,并且不会重定向到我的访问被拒绝的页面。我不知道为什么不进入我的拒绝访问页面?我的控制台出现异常

threw an unexpected exception: org.springframework.security.access.AccessDeniedException: Access is denied

我配置为this准确回答但仍然出现上述错误。如果我错了,请纠正我“我认为这个问题可能是由于 gwt 的 RPC”,因为非 rpc 方法很好并重定向到我的 unSecure.html 。我为这个错误花了大约3天的时间。在我的异步方法的 onFailure(Throwable catch) 处显示

500 The call failed on the server; see server log for details

我想展示我的配置。

<小时/>

spring-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。我非常感谢您的任何建议。抱歉我的问题很长。我不想再敲头了!谢谢。

最佳答案

就像我上次的回复一样,我很久以前就用过这个。就我而言,我不是总是处理 url,而是委托(delegate)给处理程序。

我的意思是,如果您想将 GWT-RPC 与 Spring-Security 集成,我做的第一件事就是从我的 GWT 应用程序尝试登录 Spring。

因此,您需要做的第一件事是创建一个 RPC-CALL (here official documentation)用于登录。

我发现注释 @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> 标签中我放置了 .rpc url)

请注意

答案是肯定的,我已经做到了(三年前,但我做到了:))

我认为您问题的关键是:

  • 指定 RPC 调用的拦截器 URL 或您的/login.html

  • 像我一样委托(delegate)处理程序(小心,也许你做得很好错误在其他部分,但至少我在示例中确实喜欢它工作)。

很抱歉没有直接向您显示错误,希望这个答案能有所帮助。

谢谢。

关于java - 具有 Spring 基于角色的安全性的 GWT RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23952603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com