将经过身份验证的用户注入Spring MVC @Controllers

可以使用@AuthenticationPrincipal批注和AuthenticationPrincipalArgumentResolver这是Spring MVS MethodArgumentResolver的实现)将注入经过身份验证的用户注入Spring MVC处理程序方法。 默认情况下, AuthenticationPrincipalArgumentResolver已通过Web安全配置注册(例如,使用@EnableWebSecurity启用安全性时)。

1.定制

假设我们有自定义的UserDetails实现:

import org.springframework.security.core.GrantedAuthority;
import pl.codeleak.surveyapp.entities.Member;import java.util.Collection;public class AccountDetailsextends org.springframework.security.core.userdetails.User {private final Account account;public AccountDetails(Account account,Collection<? extends GrantedAuthority> authorities) {super(account.getMember().getEmail(), account.getPassword(), authorities);this.account = account;}public Account getAccount() {return account;}public Member getMember() {return account.getMember();}
}

AccountDetails有两种其他方法,可以访问相关的帐户和会员信息。 然后,我们自己的UserDetailsService实现将使用AccountDetails ,然后由Spring Security DAO Authentication Manager用来对用户进行身份验证。

注意:Spring Security配置不在本文讨论范围之内。

2.注入

@AuthenticationPrincipal批注的最基本用途是注入UserDetails。 在我们的方案中,我们希望注入AccountDetails 。 为了做到这一点,只需将@AuthenticationPrincipal注释的参数放在Spring MVC处理程序方法中:

@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal AccountDetails accountDetails) {return "index";
}

如果经过身份验证的用户不存在, accountDetails将评估为null 。 如果用户通过身份验证– accountDetails将评估为有效对象。

注意:从Spring 4.0开始,您应该使用org.springframework.security.core.annotation.AuthenticationPrincipal

3.使用

AccountDetails还有两种获取accountmember对象的方法。 如果我们想将它们直接注入处理程序方法,可以使用@AuthenticatedPricipal批注的expression属性:

@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal(expression = "account") Account account) {return "index";
}
@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal(expression = "member") Member member) {return "index";
}

该表达式定义了在插入参数时将使用的SpEL表达式。 很方便。

4.'扩展'

代替在处理程序方法中重复@AuthenticationPrincipal(expression = "account") Account account我们可以创建一个元注释并在我们的@Controller使用它:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@AuthenticationPrincipal(expression = "account")
public @interface LoggedInAccount {}

5. Spring Security 3.2和Spring Security 4+中的

  • Spring Security 3.2 – org.springframework.security.web.bind.annotation.AuthenticationPrincipal
  • Spring Security 4.0 – org.springframework.security.core.annotation.AuthenticationPrincipal

翻译自: https://www.javacodegeeks.com/2016/09/injecting-authenticated-user-spring-mvc-controllers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库的命令工具sql*plus/sqlplus介绍

Oracle 的 sql*plus 是与 Oracle 数据库进行交互的客户端工具&#xff0c;借助 sql*plus 可以查看、修改数据库记录。在 sql*plus 中&#xff0c;可以运行sql*plus 命令与 SQL 语句。MySQL 中的 mysql、show、mysqldump 等命令就类似于 Oracle 的 sql*plus 客户端命令。 SQL 语…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人&#xff1a;Bob和Eve。Eve想让Bob访问他创建的恶意网页&#xff0c;这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件&#xff0c;或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。&#xff08;图片来自以上提供的链接&#xff0…

查询linux kafka安装目录,Kafka 1.0.0安装和配置--Linux篇

阅读目录&#xff1a;1. 关闭防火墙和Selinux2. 安装所需环境JDK,Zookeeper3. 下载Kafka 1.0.0版本4. 配置Kafka5. 启动Kafka并验证6. 报错及解决7. 说明1. 关闭防火墙和SelinuxLinux的防火墙是咱们新手的噩梦&#xff0c;很多情况会出现能ping通&#xff0c;但是访问不了Web页…

随机数生成java代码_Java Bullshifier –生成大量随机代码库

随机数生成java代码生成大量随机Java应用程序的命令行工具 您一直在等待的命令行工具。 或不。 毕竟&#xff0c;这是很深奥的。 无论哪种方式&#xff0c;它对某些人都非常有用&#xff0c;而对其他人来说却是一个有趣的实用程序。 Bullshifier是David Levanon和Hodaya Gamli…

背景区域为负样本什么意思_词向量-skipgram与负采样

大纲&#xff1a;1. onehot vs 分布式表示2. 分布式表示的全局泛化能力3. how to learn word2vec - intuition4. SkipGram5. SkipGram Negative Sampling6. 评估词向量7. CBOW与SkipGram对比1. onehot vs 分布式表示Onehot表示:V (apple, going, I, home, machine ,learing)ap…

嵌入式linux应用程序实例,嵌入式Linux应用程序访问物理地址的实例

前言  按照Linux分层驱动思想&#xff0c;外设驱动与主机控制器的驱动不相关&#xff0c;主机控制器的驱动不关心外设&#xff0c;而外设驱动也不关心主机&#xff0c;外设访问核心层的通用应用程序接口进行数据传输&#xff0c;主机和外设之间可以进行任意的组合。这样思想要…

生成验证码图片的Java代码

文章目录验证码演示代码请求资源路径为什么要添加一个随机数的参数验证码演示代码 package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import …

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗&#xff1f; 如果没有&#xff0c;下面是一个简单的示例。 所有类都必须是线程安全的&#xff0c;对吗&#xff1f; 并不是的。 其中一些必须是线程安全的&#xff1f; 又错了。 我认为它们都不必是线程安全的&#xff0c;而它们都必须…

python数学要求_python数学工具之积分(1)

加载库Polygon&#xff0c;绘制积分图形。 fig, ax plt.subplots(figsize(7, 5))表示绘图尺寸为7*5&#xff1b;plt.plot(x, y, b, linewidth2)表示绘制蓝色线宽为2的函数图形&#xff1b;plt.ylim(ymin0)表示y轴最小值为0&#xff1b;Ix np.linspace(a, b)表示lx取值范围为[…

linux swap分区与内存,虚拟内存和swap分区的关系

首先&#xff0c;这两个概念分别对应windows和linux&#xff0c;即&#xff1a;windows&#xff1a;虚拟内存linux&#xff1a;swap分区windows即使物理内存没有用完也会去用到虚拟内存&#xff0c;而Linux不一样 Linux只有当物理内存用完的时候才会去动用虚拟内存(即swap分区)…

.net2.0 orm_Java 8:深入研究速度3.0.1“森林”流ORM

.net2.0 orm沿着这条路 我一直在为开源项目Speedment &#xff08;它是Stream ORM Java工具包和运行时&#xff09;做出贡献&#xff0c;并且刚刚发布了一个新的主要版本3.0.1“ Forest”。 版本的发布是以加利福尼亚帕洛阿尔托的大街小巷命名&#xff0c;大多数贡献者都在此工…

JavaScript/JS如何给元素对象添加事件

使用普通的 js 代码给元素对象添加事件 绑定事件&#xff0c;添加事件处理程序&#xff1a; var obj document.getElementById("name"); obj.onclick f1; function f1(){ alert("hello!"); }说明&#xff1a;函数名 f1 就是一个引用数据类型的变量&…

forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务

forge开发在这篇文章中&#xff0c;我们将看到如何使用WildFly Swarm和Forge开发微服务&#xff0c;以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序&#xff0c;方法是将它们与足够的服务器运行时一起打包…

zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

原标题&#xff1a;如何在 Zynq UltraScale MPSoC 上实现 Linux UIO 设计简介作者&#xff1a; Alex He (何晔)&#xff0c; 赛灵思高级嵌入式应用工程师这里的 UIO 即 Userspace I/O&#xff0c;本文中 UIO 泛指 UIO 设备和 UIO 驱动。它在 Linux kernel 的世界里比较小众&…

python初学者代码示例_Selenium 快速入门笔记和代码示例(Python版)

链接 文档链接&#xff1a; 安装 selenium 模块和 Chrome 浏览器驱动 步骤&#xff1a; 安装 Selenium 模块&#xff1a; pip install selenium 下载浏览器驱动&#xff08;下载即可&#xff0c;无需安装&#xff0c;使用时要指定它的路径&#xff09;&#xff1a;请参考 https…

用例描述

用例名称&#xff1a;简要说明/描述&#xff0c; 优先级&#xff1a; 参与者&#xff1a; 事件流&#xff1a;就是用例执行时&#xff0c;由一序列活动组成的控制流。 基本事件流&#xff1a;对用例中常规、预期路径的描述。 扩展事件流&#xff1a;主要是对一些异常情况、选…

thinkpad笔记本散热风扇_极致的散热体验,ORICO 全铝DIY双风扇笔记本散热垫评测...

电脑的出现&#xff0c;极大的改变了人类的生活。娱乐、办公、游戏、电子竞技等等都需要用到电脑。而电脑也慢慢的在升级着。电脑的体积也由最开始的的占据几间屋子的庞大体积&#xff0c;到后来的台式机、台式一体机、电脑的体积慢慢的变的越来越小。而便携式笔记本电脑的出现…

清除java_如何在Java地毯下有效地清除问题

清除java因为软件错误可能使我们在开发人员面前看起来很糟糕&#xff0c;并导致其他人对我们的想法减少&#xff0c;所以最好避免编写错误&#xff0c;快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误&#xff0c;因此&…

Web产品的交互说明文档应该怎么写?

经常与开发同学聊天&#xff0c;他们说有一个详细的说明文档可以帮助他们更准确的进行工时评估&#xff0c;还可以帮助他们提高工作效率&#xff0c;减少多余的思考时间。因此在这里分享一些制作交互说明文档的经验。 我先说说说交互原型包含哪些部分&#xff1f; 版本说明及更…

linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软

满意答案drqyna2017.05.26采纳率&#xff1a;40% 等级&#xff1a;11已帮助&#xff1a;5455人linux如何查看系统的硬件配置如何在linux系统下查看系统配置&#xff1f;在图形模式下我们可以很方便的利用Linux的图形工具&#xff0c;点击几下就可以查看到Linux系统的的硬件信…