Java EE 身份验证:如何捕获登录事件?

2024-04-23

给定为 Java Web 应用程序定义的 FORM 类型的身份验证机制,如何捕获已执行登录在重定向到请求的资源之前发生事件?是否有任何类型的侦听器可以让我在用户登录时执行我的代码?

我觉得定义过滤器不是最好的解决方案,因为过滤器链接到资源,即使用户已经通过身份验证并请求资源,过滤器也会被调用。我想知道是否有一些类/方法仅由登录事件触发。


Java EE 中没有这样的事件。然而。作为...的一部分JSR375 https://www.jcp.org/en/jsr/detail?id=375,容器管理的安全性将像目前一样完全重新设计疏散 http://arjan-tijms.omnifaces.org/2015/10/how-servlet-containers-all-implement.html跨不同的容器实现,并且不跨容器兼容。这在本节中概述了Java EE 8 安全 API http://www.slideshare.net/a_kosowski/devoxx-fr-ee8jsr375securityapiv1推介会。

安全 API 的参考实现已经在进行中,Soteria https://github.com/javaee-security-spec/soteria,由我的同事 Arjan Tijms 等人开发。使用新的安全 API,CDI 将用于触发身份验证事件,您只需@Observes。关于规范的讨论发生在这个邮件列表主题 https://java.net/projects/javaee-security-spec/lists/jsr375-experts/archive/2015-03/message/61。 Soteria 尚未具体实施。

直到那时,假设FORM基于身份验证,用户主体内部存储在会话中,如果请求中存在用户主体,而 HTTP 会话中不存在登录用户的表示,则最好的选择是手动检查 servlet 过滤器。

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    HttpServletRequest request = (HttpServletRequest) req;
    String username = request.getRemoteUser();

    if (username != null && request.getSession().getAttribute("user") == null) {
        // First-time login. You can do your thing here.
        User user =  yourUserService.find(username);
        request.getSession().setAttribute("user", user);
    }

    chain.doFilter(req, res);
}

请注意,注册过滤器/j_security_check不能保证正常工作,因为出于明显的安全原因,一个像样的容器会在第一个过滤器被击中之前在内部处理它(用户提供的过滤器可能会以错误的方式操纵请求,无论是无意还是有意)。

但是,如果您碰巧使用 Java EE 服务器,请使用Undertow http://undertow.io/servlet容器,例如WildFly http://wildfly.org,然后有一种更简洁的方法来挂钩其内部通知事件,然后触发自定义 CDI 事件。这是充实的这个博客 http://jdevelopment.nl/bridging-undertows-authentication-events-cdi/阿尔扬·蒂姆斯。如博客中所示,您最终可以得到如下所示的 CDI bean:

@SessionScoped
public class SessionAuthListener implements Serializable {

    private static final long serialVersionUID = 1L;

    public void onAuthenticated(@Observes AuthenticatedEvent event) {
        String username = event.getUserPrincipal().getName();
        // Do something with name, e.g. audit, 
        // load User instance into session, etc
    }

    public void onLoggedOut(@Observes LoggedOutEvent event) {
        // take some action, e.g. audit, null out User, etc
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java EE 身份验证:如何捕获登录事件? 的相关文章

随机推荐

  • android中invalidateOptionsMenu()有什么用

    我是android的新手 当我浏览导航抽屉的示例代码时 我发现他调用了方法invalidateOptionsMenu 所以我搜索了它的功能 但找不到答案 所以任何人都可以向我介绍一下它的功能以及我们什么时候应该这样做吗 用那个 这个函数告诉
  • 无法通过 python-jira lib 连接到 JIRA-api

    我无法对 python jira 进行身份验证 我尝试使用https pypi python org pypi jira https pypi python org pypi jira 根据我使用的文档 from jira import J
  • 如何使用 PHP 读取来自 Stackoverflow API 的 GZIP 响应?

    如何使用 PHP 读取 Stackoverflow API 的响应 响应是 GZIP 编辑的 我发现例如以下建议 url http api stackoverflow com 1 1 questions question id data f
  • iOS NSDate 仅包含时间字符串

    我的任务是将带有时间的字符串解析为 NSDate 我用以下代码做得很好 NSString timeStr 15 00 00 NSDateFormatter formatter NSDateFormatter alloc init forma
  • Python Pandas 用缺失值填充数据框

    我有这个数据框作为例子 import pandas as pd create dataframe df pd DataFrame DE Table 201705 201705 1000 DE Table 201705 201704 1000
  • 如何在 android studio 中禁用 gradle '离线模式'? [复制]

    这个问题在这里已经有答案了 我是 android studio IDE 开发的新手 每次当我导入在 android studio 中开发的示例项目时 我都会收到此错误 没有缓存版本com android tools build gradle
  • jQuery 和使用速记设置 CSS

    来自 Pro PHP 和 jQuery 提示 返回的值是 CSS 简写属性 3 添加了一个 jQuery 的好处是能够使用 CSS 设置 CSS 属性 简写 它不适用于基本的 JavaScript 来自 jQuery API 参考 简写 C
  • 使用 sapply 时,我在 str2lang(x) 中收到错误: :1:31: 意外符号 1 ^

    当运行这段代码时 我会得到一个错误 genes lt colnames survdata c 1 3 univ formulas lt sapply genes function x as formula paste Surv OS sta
  • 如何在 Electron 桌面应用程序中使用 Google 登录?

    我正在使用 Node js 和 Express 制作一个简单的应用程序 它严重依赖 Google 登录来获取个人资料图片和昵称 当在新的 Electron 应用程序中测试它时 我遇到了错误 此浏览器或应用程序可能不安全 尝试使用不同的浏览器
  • mockito-core 与mockito-inline 之间的区别

    在我的项目中 我们已经有了mockito core依赖项 我想存根静态方法 我需要为其添加模拟内联依赖项 所以想了解一下它们之间的区别 它们可以共存吗 根据版本 4 2 0 的最新文档 mockito 社区似乎已经提出了 mockito i
  • FQL 流查询中 Facebook 帖子展示次数为空

    根据FQL 流文档 http developers facebook com docs reference fql stream 以下查询应该在由经过身份验证的页面所有者运行时返回展示计数 但它从未返回 我们让页面所有者直接在图形 API
  • 什么场景下才需要使用“方法隐藏”? [复制]

    这个问题在这里已经有答案了 可能的重复 隐藏在 C 中的方法并带有有效示例 为什么它在框架中实现 现实世界的优势是什么 https stackoverflow com questions 1193848 method hiding in c
  • 如何将数字(如 int)转换为“Number”?

    这可能是基本问题 但我找不到有用的东西 问题是 如何转换double or int价值Number类型 更具体地说oracle jbo domain Number 我尝试了以下方法 对于整数值 int i 9 Integer y new I
  • 如何通过 Angular 2+ 中的单元测试避免依赖地狱

    我看到很多关于如何在 Angular 2 中对简单组件进行单元测试的示例 但是当涉及到使用服务的测试组件时 维护测试床提供程序和导入就变成了一场噩梦 我怎样才能避免它 例如 我有 myComponents 它使用 myService 它使用
  • 什么定义了实时/近实时系统?

    系统是否应满足特定的指标才能被视为 分类为实时 Web 应用程序或近实时 Web 应用程序 当我看到我正在使用的系统的非功能性需求表明解决方案应实时 接近实时返回数据时 我理解这些术语的定义 如发现http en wikipedia org
  • 数独回溯 无效数独

    我创建了一个数独回溯求解器 它工作得很好 但现在如果数独无法解决 我想给出一个错误 因为它无效 例如 如果给出这个数独 http img5 imageshack us img5 2241 sudokugq jpg http img5 ima
  • MongoDB 空字符串值与 null 值

    在 MongoDB 生产中 如果某个键的值为空或未提供 可选 我应该使用空字符串值还是应该使用 null 作为值 1 使用空字符串与空字符串之间有什么优缺点吗 2 如果我将值设置为 undefined 以从现有文档中删除属性 与让属性值设置
  • 如何确定 iPhone 正在使用/解锁

    我面临的要求之一是需要检测用户是否正在使用 iPhone 即使我的应用程序也在后台 到目前为止 我找到了以下出路 但没有一个指向解锁机制 applicationProtectedDataWillBecomeUnavailable 这将告诉用
  • 当计算机通过组策略锁定时,C# SessionSwitchReason.SessionLock 不会触发

    编辑 这里的问题不是它是通过 GP 锁定的 而是它是在服务帐户下作为服务运行的 并且它无权访问交互式桌面 我有一个 C 应用程序 需要检查用户会话何时被锁定 我正在使用Microsoft Win32 SystemEvents Session
  • Java EE 身份验证:如何捕获登录事件?

    给定为 Java Web 应用程序定义的 FORM 类型的身份验证机制 如何捕获已执行登录在重定向到请求的资源之前发生事件 是否有任何类型的侦听器可以让我在用户登录时执行我的代码 我觉得定义过滤器不是最好的解决方案 因为过滤器链接到资源 即