Authentication GWT:使用GWT登录页对应用程序的某些部分进行身份验证

Authentication GWT:使用GWT登录页对应用程序的某些部分进行身份验证,authentication,gwt,Authentication,Gwt,我的应用程序有一些所有用户都可以访问的功能,还有一些其他功能,只有经过身份验证的用户才能访问。所有这些受限特性都存在于某组GWT位置中,因此,应用程序中所有可用的位置都可以分为两组:“可供所有人访问”和“受限”。在我看来,访问受限的地方可以实现一些接口(比如说,RestrictedAccess),如果用户继续访问其中一个,并且它还没有经过身份验证,它将被重定向到登录屏幕-这是一种面向对象的方法,而不是基于URL应用过滤器 我想要实现的是: 有关用户是否已访问的信息 无论是否经过身份验证,都应该

我的应用程序有一些所有用户都可以访问的功能,还有一些其他功能,只有经过身份验证的用户才能访问。所有这些受限特性都存在于某组GWT位置中,因此,应用程序中所有可用的位置都可以分为两组:“可供所有人访问”和“受限”。在我看来,访问受限的地方可以实现一些接口(比如说,
RestrictedAccess
),如果用户继续访问其中一个,并且它还没有经过身份验证,它将被重定向到登录屏幕-这是一种面向对象的方法,而不是基于URL应用过滤器

我想要实现的是:

  • 有关用户是否已访问的信息 无论是否经过身份验证,都应该 存储在服务器上(它不是什么 可以存储在cookie中……)
  • 登录页面是标准的GWT场所+视图+活动(!)
  • 用户名和密码验证在服务器端完成
  • 到目前为止,我已经介绍了
    RestrictedAccess
    接口,它由一些地方实现。传递给FilteredActivityMapper包装应用程序活动映射器的My
    FilteredActivityMapper.Filter
    实现具有以下逻辑:

    Place filter(Place place) {
        if (place instanceof RestrictedAccess && !userHasBeenAuthenticated()) {
          return new LoginPlace();
        }
    
        // return the original place - user has been already authenticated or
        // place is accesible for all users
        return place;
    }
    
    
    private boolean userHasBeenAuthenticated() {
        // remote call - how to do ???
    }
    
    问题在于
    userhasbeenathenticated()
    方法(如果用户已通过身份验证,则不应将其重定向到登录空间)。如果我想在服务器端存储此信息,我必须在这里执行GWT RPC/request工厂调用,但两者都是异步的,因此我无法在
    filter
    方法中处理其结果

    我知道我可以使用web.xml过滤器或一些外部框架(例如spring security),但这些方法都不允许我将登录页面作为基于GWT的标准表单,也不允许我以更面向对象的方式指示应该限制对某个位置的访问

    提前感谢您的任何提示


    编辑:我开始怀疑是否应该在客户端进行位置筛选(受限/不受限)。如有人建议,如果有可能破解指示用户是否已通过身份验证的代码,也有可能破解场所过滤代码,这样就可以在不登录的情况下访问受限场所。

    我有一个类似的应用程序,具有相同的要求。到目前为止,我还没有抽出时间讨论实施问题,但我的想法是相同的

    我计划做的是将身份验证状态客户端存储在AuthenticationManager类中。当应用程序启动时,我将从服务器请求登录信息(我正在考虑在应用程序引擎上运行,以便获得身份验证状态和开放id登录/注销URL),并将其存储在AuthenticationManager中。Acegi/Spring安全性以一种简单的方式工作,所以如果您也使用这些信息,那么这些信息在服务器端是可用的

    当用户登录/注销时,服务器将重定向他们,并检索新状态。这将使客户端身份验证状态与服务器保持一致。服务器上的每个RPC请求也必须检查身份验证。我使用的是gwt DISPACH库,它也有一些基本的身份验证检查和跨站点脚本保护(尽管我认为最新的gwt也有通用RPC的功能)

    一个问题是会话超时。同样,gwt dispath库有一些代码可以检测到这一点,并将会话过期的异常返回给客户端,客户端可以拦截这些异常并更新身份验证管理器

    希望这有点道理。

    Piotrek

    我认为调用userHasBeenAuthenticated()时存在安全问题-每次调用此函数时,都可能破解客户端代码以返回true

    我实现的解决方案是,如果未经验证的用户试图访问任何远程服务,只需返回SC_UNAUTHORIZED。我已经重写了RequestFactory onResponseReceived函数,如果响应未经授权,该函数将重定向到登录页面。想法来自:

    这适用于活动和地点都以数据为中心的情况—每个地点更改都从服务器检索数据。如果用户没有经过身份验证,他们就无法获取数据并被重定向到登录页面


    我意识到您的情况略有不同,因为有些地方每个人都可以访问,在这种情况下,您只能将受限服务配置为返回未经授权的SC_。

    我喜欢您的解决方案,但如何仅将部分服务配置为返回未经授权的SC_?我尝试了Spring security@Secured annotation,但没有给出预期的结果(返回状态200,而抛出AccessDeniedException)——使用基于URL的身份验证,一切正常,但这只适用于对所有远程服务的受限访问。我不知道Spring安全性-我在servlet方法上使用ApacheShiro和一个简单的自定义方法拦截器,该拦截器用于获取用户和未经身份验证的调用response.senderro(HttpServletResponse.SC_UNAUTHORIZED);使用SpringSecurity,我必须做类似的事情——用@Secured注释方法,并在我的SpringGWT服务层装饰器(它连接GWT世界和spring世界)中捕获所有运行时异常(实际上是GWT ReportableException)。如果异常原因是安全异常,则应以原始形式传播该异常(以便GWT不会将其序列化为字符串)。它允许在DispatcherServlet中再次捕获此异常,并设置适当的状态代码。关于位置:如果用户已通过身份验证,则所有安全位置在显示之前都应执行请求。有效:)