我熟悉在Dropwizard中实现BasicAuth
安全性,但仅适用于RESTful端点/资源。
我现在正在尝试Dropwizard视图,看看我是否可以将它同时用作Web和REST服务器。 Web应用程序将具有“公共”页面(实际上只是静态HTML文件;“关于我们”,“联系我们”等)以及真正构成应用程序的“私有”(动态)页面。要访问这些页面,必须对用户进行身份验证(登录)。
所以这意味着我需要两种不同的DW身份验证机制:
理想情况下,我希望Apache Shiro能够为我的系统处理所有auth(REST和Web一样),我看到了Dropwizard-Shiro lib,但这似乎只验证了REST端点。
我的网络登录系统需要像这样工作:
environment
)拦截请求并且可以告诉(可能是cookie / session var?)用户是否经过身份验证。我主要担心的是: * 我应该为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端点。)
答案 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会话。
请注意,我还没有真正测试过此配置。