gpt4 book ai didi

java - Dropwizard 查看身份验证示例

转载 作者:行者123 更新时间:2023-12-02 04:12:26 25 4
gpt4 key购买 nike

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

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

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

  • 我熟悉的用于验证 REST API 客户端的典型 DW 安全机制;和
  • 一种实现登录系统以对网络应用页面/资源的最终用户进行身份验证的方法

理想情况下,我希望 Apache Shiro 处理我的系统的所有身份验证(REST 和 Web 等),并且我看到 Dropwizard-Shiro lib,但这似乎只能验证 REST 端点。

<小时/>

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

  1. 用户尝试访问“经过身份验证的”(私有(private))网址。
  2. servlet 过滤器(我自己创建并在环境 中注册)会拦截请求并可以判断(可能是 cookie/ session 变量?)用户是否已通过身份验证。
  3. 如果用户通过身份验证,他们就可以继续访问其预期的 URL(“目标 URL”)。否则,他们将被重定向到登录页面。当他们登录 DW 资源/ Controller 时,会将其凭据交给 Shiro,然后由 Shiro 决定凭据是否有效。
  4. 如果凭据有效,它们将获得 cookie/ session 变量 (?) 并重定向到其目标 URL。否则,他们将被重定向回登录页面,该页面现在将显示失败消息。

我主要担心的是:* 我应该为 servlet 检查的 cookie/session var 实现什么?;和* 如何将我的身份验证 Controller (即处理登录页面和目标 URL 之间的重定向的资源)与 Shiro 集成? 是否可以通过 Dropwizard-Shiro 库来实现此操作?

迄今为止我最好的尝试:

自定义 Servlet 过滤器(已在 环境 中注册):

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(同样,作为资源注册到环境 ):

@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 库,因为我可能也会将它用于我的 REST 端点)。

最佳答案

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

示例:

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

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

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

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

关于java - Dropwizard 查看身份验证示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com