繁体   English   中英

Dropwizard View身份验证示例

[英]Dropwizard View authentication by example

我熟悉在Dropwizard中实现BasicAuth安全性,但仅适用于RESTful端点/资源。

我现在正在对Dropwizard Views进行试验,以查看是否可以将它同时用作Web和REST服务器。 该Web应用程序将具有真正构成应用程序的“公共”页面(实际上只是静态HTML文件;“关于我们”,“联系我们”等)以及“私人”(动态)页面。 要进入这些页面,必须对用户进行身份验证(登录)。

因此,这意味着我需要两种不同的DW身份验证机制:

  • 我熟悉的用于验证REST API客户端的典型DW安全机制;
  • 一种实现登录系统以验证Web应用程序页面/资源的最终用户的方法

理想情况下,我希望Apache Shiro可以为我的系统处理所有身份验证(REST和Web均如此),并且我看到了Dropwizard-Shiro lib,但这似乎仅对REST端点进行身份验证。


我的网络登录系统需要像这样工作:

  1. 用户尝试转到“经过身份验证的”(专用)URL。
  2. 一个servlet过滤器(由我创建自己并向environment注册)可以拦截该请求,并可以告知(也许是cookie / session var?)该用户是否已通过身份验证。
  3. 如果用户已通过身份验证,则允许他们继续使用其预期的URL(“ 目标URL ”)。 否则,它们将被重定向到登录页面。 当他们登录DW资源/控制器时,将其凭据交给Shiro,然后由Shiro决定凭据是否有效。
  4. 如果凭据有效,则它们将获得cookie /会话var(?),并被重定向到其目标URL。 否则,它们将被重定向回到登录页面,该页面现在将显示失败消息。

我主要关心的是:* 我应该为servlet检查的cookie / session var实现什么? ; 和* 如何将我的auth控制器(即处理登录页面和目标URL之间的重定向的资源)与Shiro集成在一起? 是否可以通过该Dropwizard-Shiro库执行此操作?

迄今为止我最大的尝试:

自定义Servlet过滤器(在environment注册):

public class AuthFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, 
            ContainerResponseContext responseContext) {
        Cookie[] cookies = requestContext.getCookies();
        boolean authenticated = false;
        for(Cookie cookie : cookies) {
            // 1. This is my first concern. What is better/more secure
            //    than what I'm doing here?
            if("my_app_auth_cookie".equals(cookie.getName())) {
                authenticated = true;
            }
        }

        if(authenticated == false) {
            responseContext.sendDirect("/auth/login");
        }
    }
}

如果未通过身份验证,则将它们重定向到/auth/login ,它会命中AuthController (同样,已在environment注册为资源):

@Path("/auth")
@Produces(MediaType.TEXT_HTML)
public class AuthController {
    @GET
    @Path("/login")
    public LoginPageView login() {
        // Render some "login.ftl" template as HTML.
    }

    @POST
    @Path("/authenticate")
    public ??? authenticate(??? username, ??? password) {
        // 2. Somehow send 'username' and 'password' to Shiro...
        MyAppUser user = myAppRealm.authenticate(username, password);

        // Now what do I do with 'user'?
    }
}

当用户在登录页面上提交表单(可能是POST到/auth/authenticate )时,我们会以某种方式将输入的凭据交给Shiro(再次,我想使用该Dropwizard-Shiro lib,因为我也很可能会将其用于我的REST端点)。

Apache Shiro有自己的过滤器类型,这些过滤器shiro.ini中配置。

例:

[urls]
/api/** = noSessionCreation, authcBasic
/views/login = authc
/views/authenticated = authc, user

配置authc筛选器以重定向到您实现的登录表单页面。 使用过滤器的表单参数和POST到/views/login

如果在Jetty中启用了会话管理器,那么Shiro应该在从登录表单页面登录时创建servlet会话。

请注意,我尚未实际测试此配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM