当前位置: 首页 > 知识库问答 >
问题:

拖放查看示例身份验证

李捷
2023-03-14

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

我现在正在试验Dropwizard视图,看看我是否能把它作为web和REST服务器合二为一。web应用程序将有“公共”页面(实际上只是静态的HTML文件;“关于我们”、“联系我们”等。)以及“私人”(动态)页面,真正构成了app。要访问这些页面,用户必须经过身份验证(登录)。

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

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

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

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

    < li >用户试图访问“已验证”(私有)的URL。 < li >一个servlet过滤器(我自己创建并在< code >环境中注册的)截获请求并能告诉(也许是一个cookie/会话变量?)无论用户是否经过身份验证。 < li >如果用户通过验证,则允许他们转到他们想要的URL(“目标URL”)。否则,他们将被重定向到登录页面。当他们登录时,DW资源/控制器将他们的凭证交给Shiro,然后由Shiro决定凭证是否有效。 < li >如果凭据有效,它们将获得一个cookie/会话变量(?)并被重定向到它们的目标URL。否则,他们将被重定向回登录页面,该页面现在将显示一条失败消息。

我主要关心的问题是:*我应该为servlet将检查的cookie/会话变量实现什么?;和*如何将我的身份验证控制器(即处理登录页面和目标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");
        }
    }
}

如果它们未通过身份验证,它们将重定向到< code>/auth/login,这将命中一个< code>AuthController(再次向< code >环境注册为资源):

@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'?
    }
}

当用户在登录页面上提交表单时(这可能是对<code>/auth/authenticate</code>)我们会以某种方式将他们输入的凭证交给Shiro(同样,我希望使用Dropwizard Shiro库,因为我可能也会将其用于我的RESTendpoint)。

共有1个答案

支淮晨
2023-03-14

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

例子:

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

配置< code>authc筛选器以重定向到您实现的登录表单页面。使用过滤器的表单参数并发布到< code>/views/login。

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

请注意,我没有实际测试过这个配置。

 类似资料:
  • 我遵循了为keycloak(版本4.8.3)设置自定义身份验证器spi的演练。我几乎只使用从这里得到的示例代码。我只更改了以便能够编译项目并使用部署它。而且它起作用了...我可以在keycloak中配置新的身份验证流,更新浏览器流并设置所需的动作。但是,如果我想在应用程序中使用新的身份验证,我会得到以下消息:。并且在控制台中得到以下输出: 我在github上查找了文件DefaulTauthenti

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 问题内容: 有人可以给我一个使用SSHJ进行公共密钥身份验证的示例吗?我意识到这个问题与ssh的私钥/公钥身份验证示例基本相同,但是作者的回答是指不再存在的google用户组,我是无法使其正常工作。 谢谢!菲尔 问题答案: 我们在SSHJ之上构建了overthere框架。可以连接也可以使用密钥文件进行连接。以下代码应该可以工作,但是请确保将bouncycastle库添加到类路径中。 希望能有所帮助

  • 本文向大家介绍IOS 身份证校验详细介绍及示例代码,包括了IOS 身份证校验详细介绍及示例代码的使用技巧和注意事项,需要的朋友参考一下 IOS 身份证校验 身份证基础知识: 身份证是国民的身份编号,编号是有一定规律的,这里介绍身份证验证规则比较详细。项目中经常会需要对身份证进行校验,我们先了解一些基本知识,然后分析代码 居民身份证号码,根据〖中华人民共和国国家标准 GB 11643-1999〗中有

  • 问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答

  • 我试图使用swift代码在网站上找到这里,但响应是html代码与两个错误:“您必须输入密码!”和“您必须输入用户名!”我是NSURLSession的新手,试图更改用于身份验证的字符串,但无法更改响应。下面是我的代码: 这是控制台响应中的内容: