Dropwizard通过示例查看身份验证

时间:2015-11-12 19:59:18

标签: java authentication cookies shiro dropwizard

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

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

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

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

理想情况下,我希望Apache Shiro能够为我的系统处理所有auth(REST和Web一样),我看到了Dropwizard-Shiro lib,但这似乎只验证了REST端点。

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

  1. 用户尝试转到“经过身份验证的”(私人)网址。
  2. 一个servlet过滤器(我自己创建并注册environment)拦截请求并且可以告诉(可能是cookie / session var?)用户是否经过身份验证。
  3. 如果用户已通过身份验证,则允许他们继续使用其预期的网址(“目标网址”)。否则,它们将被重定向到登录页面。当他们登录DW资源/控制器时,将他们的凭据交给Shiro,然后Shiro决定凭证是否有效。
  4. 如果凭据有效,则会获得cookie /会话var(?)并重定向到其目标URL。否则,它们将被重定向回登录页面,现在将显示失败消息。
  5. 我主要担心的是: * 我应该为servlet检查的cookie / session var实现什么?;和 * 如何将我的auth控制器(即处理登录页面和目标URL之间的重定向的资源)与Shiro集成?是否可以通过Dropwizard-Shiro lib进行此操作?< / p>

    迄今为止我最好的尝试:

    自定义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'?
        }
    }
    

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

1 个答案:

答案 0 :(得分:2)

Apache Shiro有自己的filters类型,在shiro.ini中配置。

示例:

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

配置authc过滤器以重定向到您实施的登录表单页面。使用过滤器form parameters和POST /views/login

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

请注意,我还没有真正测试过此配置。