ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

将GWT与Spring Security框架集成

2019-11-23 07:19:56  阅读:239  来源: 互联网

标签:spring-security spring gwt


我已经搜索了有关此主题的教程,但是它们都已过时.有人可以给我提供任何将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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有