Spring中如何获取Session对象?

2023-11-26

我相对较新Spring和春季安全。

我试图编写一个程序,需要使用 Spring security 在服务器端对用户进行身份验证,

我想出了以下几点:

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
                    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override
    protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException 
    {
        System.out.println("Method invoked : retrieveUser");
        //so far so good, i can authenticate user here, and throw exception if not authenticated!!
        //THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
    }
}

我的用例是,当用户经过身份验证时,我需要放置一个属性,例如:

session.setAttribute("userObject", myUserObject);

myUserObject 是某个类的对象,我可以在多个用户请求的整个服务器代码中访问该对象。


你的朋友在这里org.springframework.web.context.request.RequestContextHolder

// example usage
public static HttpSession session() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    return attr.getRequest().getSession(true); // true == allow create
}

这将由标准 spring mvc 调度 servlet 填充,但如果您使用不同的 Web 框架,则需要添加org.springframework.web.filter.RequestContextFilter作为你的过滤器web.xml来管理持有者。

EDIT:作为一个附带问题,您实际上想做什么,我不确定您是否应该需要访问HttpSession in the retieveUser的方法UserDetailsService。 Spring security 会以任何方式将 UserDetails 对象放入会话中。可以通过访问来检索它SecurityContextHolder:

public static UserDetails currentUserDetails(){
    SecurityContext securityContext = SecurityContextHolder.getContext();
    Authentication authentication = securityContext.getAuthentication();
    if (authentication != null) {
        Object principal = authentication.getPrincipal();
        return principal instanceof UserDetails ? (UserDetails) principal : null;
    }
    return null;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中如何获取Session对象? 的相关文章

随机推荐

  • 从 TFS 签出时的 .partial 文件

    当我从 TFS 查看解决方案时 我在整个项目中得到了很多 partial 文件 它们不在 TFS 服务器上 而在我的 PC 上 遗憾的是 其中一些阻止我的解决方案运行 我总是必须手动删除它们 我能以某种方式阻止这种情况吗 他们来自哪里 这些
  • 如何通过 slack API 删除/禁用用户?

    我对此尝试了多种方法 首先尝试获取没有任何用户 ID 的用户 这仅返回我的用户 然后尝试获取具有其他 id 的用户 它也可以正确检索数据 但是 我似乎无法将用户属性设置为 已删除 我正在使用这种Python方法 slack client a
  • 本地存储库需要 Git LFS 吗?

    我创建了一个专门存储在本地的 Git 存储库 我问自己 我是否真的需要 Git LFS 来存储二进制文件 据我所知 gitattributes已正确配置 如下所示 psd binary 是的 文件落在 git objects 但它们被压缩并
  • 创建CSS全局变量:样式表主题管理[重复]

    这个问题在这里已经有答案了 有没有办法在 css 中设置全局变量 例如 Color1 fff Color2 b00 h1 color Color1 background Color2 最新更新 16 01 2020 CSS 自定义属性 变量
  • CSV 到关联数组

    我见过很多关于如何获取 CSV 文件 然后创建一个以标题为键的关联数组的示例 例如 Brand Model Part Test Honda Civic 123 244 Honda Civic 135 434 Toyota Supra 511
  • 将范围扩展为:“1-3,6,8-10”到 [1,2,3, 6, 8,9,10]

    我试图在我的程序中添加一个选项 允许用户选择他想要执行的程序步骤 我希望能够解析像这样的字符串 1 3 6 8 10 并得到 1 2 3 6 8 9 10 你知道 Python 中是否已经存在正在执行此操作的东西吗 该函数执行您所要求的操作
  • Solr 可以加载原始 Lucene 索引吗?

    我的一些同事有一个大型 Java Web 应用程序 该应用程序使用使用 Lucene Java 构建的搜索系统 我想做的是拥有一个基于 HTTP 的 API 来访问那些现有的搜索索引 我以前使用过 Nutch 并且非常喜欢 OpenSear
  • WordPress 自定义注册表

    我有一位客户需要定制注册表 我需要在此页面上进行自定义设计 我需要添加自定义字段 例如名字 公司 电话等 有人可以帮我解决这个问题吗 询问 WordPress 问题的更好地方可能是WordPress 答案 无论如何 如果你想在没有插件的情况
  • 在角度引导程序中设置初始静态选项卡

    我似乎无法在角度引导选项卡集中设置初始选项卡 它始终将最左侧的选项卡设置为活动状态 给定 html
  • 忽略不允许的属性 IISMAJORVERSION 和“EnableUserControl”?

    我的安装程序包在我的计算机上运行 但在我同事的计算机上失败 查看日志 我可以看到一些属性值在 ExecuteAction 短语期间没有保留 有几个Ignoring disallowed property安装程序日志文件中的行以及这些属性在
  • Django 模板中的 IsInstance 吗?

    有没有办法在 Django 模板中执行 isinstance issubclass 操作 我意识到我可以编写自己的模板标签 但令我惊讶的是这不可能 这让我觉得我要么做错了什么 要么遗漏了一些明显的东西 我希望显示两个不同的标记部分 具体取决
  • 带窥视功能的 UIPageViewController

    我正在尝试使用创建页面浏览器UIPageViewController在 Interface Builder 中 允许显示部分相邻页面 也称为查看 我一直在关注教程http www appcoda com uipageviewcontroll
  • 从不同的类访问 HashMap

    我的班级中有一个名为 DataStorage 的哈希图 HashMap
  • Tensorflow 2.0 自定义训练循环的学习率

    当我使用tensorflow 2 0自定义训练循环时 是否有任何函数或方法可以显示学习率 这是张量流指南的示例 def train step images labels with tf GradientTape as tape predic
  • 在 py2exe 构建中包含 PYD/DLL

    我的应用程序的模块之一使用 pyd 文件中的函数 有一个选项可以排除 dll exclude dlls 但是有一个选项可以包含它们吗 尽管复制了其余文件 py 但构建过程似乎并未复制我的模块中的 pyd 我还需要包含一个 dll 如何让 p
  • Solr 使用太多内存

    我们有一个在带有 Oracle Java 6 Hotspot JDK 的 Windows 2008 R2 上运行的 Solr 3 4 实例 该实例变得无响应 当我们查看机器时 我们注意到可用物理内存变为零 Tomcat7 exe 进程使用了
  • php paypal 快速结帐问题

    我正在尝试在我的网站上集成贝宝快速结帐 我试图使用沙箱进行检查 当我从我的网站提交数据时 生成的令牌没有错误 但当重定向到 PayPal 时 它不显示付款金额 顺便说一句 我正在使用贝宝快速结帐向导中的代码 如果有人指出我正确的方向 那将会
  • 选择日期后添加天数(周末和节假日除外)

    我有两个文本字段 在第一个文本字段中 我使用 jQueryUI Datepicker 添加了一个日历 当用户从日期选择器中选择日期时 它应该自动向该日期添加 30 天 并在第二个文本字段中设置该值 我已经完成了将日期添加 30 天的工作 但
  • JPA EntityManager:为什么使用 persist() 而不是 merge()?

    EntityManager merge 可以插入新对象并更新现有对象 为什么要使用persist 只能创建新对象 无论哪种方式都会将实体添加到 PersistenceContext 中 不同之处在于您随后对该实体执行的操作 Persist
  • Spring中如何获取Session对象?

    我相对较新Spring和春季安全 我试图编写一个程序 需要使用 Spring security 在服务器端对用户进行身份验证 我想出了以下几点 public class CustomAuthenticationProvider extend