将GWT与Spring Security框架集成
作者:互联网
我已经搜索了有关此主题的教程,但是它们都已过时.有人可以给我提供任何将Spring Security集成到GWT中的链接或示例吗?
解决方法:
首先,您必须记住,GWT应用程序已变成在客户端上运行的javascript,因此您实际上无法保护那里的某些资源.所有敏感信息都应存储在服务器端(在其他情况下,不仅是GWT),所以正确的方法是从应用程序服务层的角度考虑Spring Security集成,并将该安全性与通信协议集成在一起.使用-在GWT的情况下,大多数情况下要求工厂提供.
解决方案不是很简单,但是我无法以更好的方式做到这一点……欢迎提出任何改进建议.
您需要首先创建GWT ServiceLayerDecorator,它将请求工厂的世界与Spring的世界联系起来.覆盖createServiceInstance方法,该方法使用要从ServiceName批注值调用的Spring服务类的名称,并返回此服务的实例(您需要从Spring ApplicationContext获取它):
final Class<?> serviceClass = requestContext.getAnnotation(ServiceName.class).value();
return appContext.getBean(serviceClass);
另外,您需要重写超类invoke(Method,Object …)方法,以捕获所有抛出的运行时异常.
如果是Spring Security AccessDeniedException的一个实例,应分析捕获的异常原因.如果是这样,应重新抛出异常原因.在这种情况下,GWT不会将异常序列化为字符串,而是再次将其重新抛出,因此,调度程序Servlet可以通过设置适当的HTTP响应状态代码来处理它.所有其他类型的异常将由GWT序列化为String.
实际上,您只能捕获GWT ReportableException,但不幸的是,它具有包访问修饰符(呵呵… GWT并不是那么容易扩展).捕获所有运行时异常要安全得多(尽管不是很优雅,我们别无选择)-如果GWT实现发生更改,此代码仍然可以正常工作.
现在,您需要插入装饰器.您可以通过扩展请求工厂servlet并按如下所示定义您的servlet构造函数来轻松实现:
public MyRequestFactoryServlet() {
this(new DefaultExceptionHandler(), new SpringServiceLayerDecorator());
}
最后一件事-您需要进行肮脏的破解并覆盖请求工厂servlet doPost方法,从而更改其处理异常的方式-默认情况下,异常被序列化为字符串,服务器发送500个状态代码.并非所有异常都应导致500 s.c-例如,安全异常应导致未授权的状态代码.因此,您需要执行以下操作以覆盖异常处理机制:
catch (RuntimeException e) {
if (e instanceof AccessDeniedException) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
} else {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
LOG.log(Level.SEVERE, "Unexpected error", e);
}
}
除了扩展类,您可以尝试使用一些“周围”方面-在这种情况下,它是更干净的解决方案.
而已!现在,您可以像往常一样使用Spring Security批注(@Secured等)批注应用程序服务层.
我知道-一切都很复杂,但是Google的请求工厂很难扩展.伙计们在通信协议方面做得很棒,但是这个库的设计简直糟透了.当然,客户端代码有一些限制(已编译为Java脚本),但是服务器端代码可以设计得更好.
标签:spring-security,spring,gwt 来源: https://codeday.me/bug/20191123/2065896.html