[英]Dropwizard View authentication by example
我熟悉在Dropwizard中实现BasicAuth
安全性,但仅适用于RESTful端点/资源。
我现在正在对Dropwizard Views进行试验,以查看是否可以将它同时用作Web和REST服务器。 该Web应用程序将具有真正构成应用程序的“公共”页面(实际上只是静态HTML文件;“关于我们”,“联系我们”等)以及“私人”(动态)页面。 要进入这些页面,必须对用户进行身份验证(登录)。
因此,这意味着我需要两种不同的DW身份验证机制:
理想情况下,我希望Apache Shiro可以为我的系统处理所有身份验证(REST和Web均如此),并且我看到了Dropwizard-Shiro lib,但这似乎仅对REST端点进行身份验证。
我的网络登录系统需要像这样工作:
environment
注册)可以拦截该请求,并可以告知(也许是cookie / session var?)该用户是否已通过身份验证。 我主要关心的是:* 我应该为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端点)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.