Spring Security如何基于Authentication获取用户信息

Spring Security使用一个Authentication对象来描述当前用户的相关信息。SecurityContextHolder中持有的是当前用户的SecurityContext,而SecurityContext持有的是代表当前用户相关信息的Authentication的引用。

这个Authentication对象不需要我们自己去创建,在与系统交互的过程中,Spring Security会自动为我们创建相应的Authentication对象,然后赋值给当前的SecurityContext。

但是往往我们需要在程序中获取当前用户的相关信息,比如最常见的是获取当前登录用户的用户名。在程序的任何地方,通过如下方式我们可以获取到当前用户的用户名。

public String getCurrentUsername() {
   Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
   if (principal instanceof UserDetails) {
     return ((UserDetails) principal).getUsername();
   }
   if (principal instanceof Principal) {
     return ((Principal) principal).getName();
   }
   return String.valueOf(principal);
  }

通过Authentication.getPrincipal()可以获取到代表当前用户的信息,这个对象通常是UserDetails的实例。获取当前用户的用户名是一种比较常见的需求,关于上述代码其实Spring Security在Authentication中的实现类中已经为我们做了相关实现,所以获取当前用户的用户名最简单的方式应当如下。

  public String getCurrentUsername() {
   return SecurityContextHolder.getContext().getAuthentication().getName();
  }

此外,调用SecurityContextHolder.getContext()获取SecurityContext时,如果对应的SecurityContext不存在,则Spring Security将为我们建立一个空的SecurityContext并进行返回。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • django认证系统 Authentication使用详解

    前言 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理则是决定一个合法用户具有哪些权限.往后,'认证'这个词同时代指上面两部分的含义. Django的认证系统主要包括下面几个部分: 用户 许可 组 可配置的密码哈希系统 用于用户登录或者限制访问的表单和视图工具 可插拔的后台系统 类似下面的问题,不是Django认证系统的业务范围,请使用第三方工具

  • springboot+Oauth2实现自定义AuthenticationManager和认证path

    本人在工作中需要构建这么一个后台框架,基于springboot,登录时认证使用自定义AuthenticationManager:同时支持Oauth2访问指定API接口,认证时的AuthenticationManager和登录规则不同.在研究了源码的基础上参考很多文章,目前基本得以解决. @Configuration public class OAuth2Configuration { @SpringBootApplication @RestController @EnableResourceSe

  • mysql 8.0 错误The server requested authentication method unknown to the client解决方法

    mysql 安装了最新版本8.0.11后创建用户并授权后,授权的用户连接数据库提示 The server requested authentication method unknown to the client 查阅一些相关的资料后发现是由于新版本的mysql账号密码解锁机制不一致导致的 解决办法: 删除创建的用户和授权, 找到mysql配置文件并加入 default_authentication_plugin=mysql_native_password 变为原来的验证方式,然后从新创建用户并

  • HTTP基本认证(Basic Authentication)的JAVA实例代码

    大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证. 下面来看看一看这个认证的工作过程: 第一步: 客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话, 服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息. 如下图. 第三步: 服务器将Authorizati

  • Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError

    最新在学习Python的基础入门系列课程,今天学习到使用python 的内置库smtplib发送邮件内容. 使用Python发送邮件步骤简单: 创建SMTP连接 使用邮箱和密码登录SMTP服务器 创建邮件内容对象EmailMessage, 并使用set_content方法设置邮件内容 调用sendmail方法发送邮件 具体代码如下: import smtplib from email.message import EmailMessage # 定义SMTP邮件服务器地址 smtp_server

  • Java Jedis NOAUTH Authentication required问题解决方法

    问题 之前项目能够正常运行,因为默认选择db0,后来新的需求来了,不是默认db0,而是给参数选择db. 修改后代码如下,却报错NOAUTH Authentication required. 2解决方法 该问题一般来说是密码错误,或者redis机器的防火墙没关灯问题. 我检查了密码防火墙等都没有问题. 后来通过debug终于发现问题,修改代码如下: 在选择几号db的时候,就需要连接redis,而此时我将选择库号代码放在了配置密码代码之前,导致报密码出错的问题. 总结 这个问题其实很简单,其实静下心

  • form身份验证通过后,只能用FormsAuthentication.RedirectFromLoginPage

    直接用Response.Redirect("default.aspx")的话当然验证失败,因为你根本没有建立身份验证票.FormsAuthentication.RedirectFromLoginPage方法,会自动完成很多功能的.如完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作.当然完成这些功能并不是只有FormsAuthentication.RedirectFromLoginPage方法才能办到,相反如果需要带角色信息的验证则只能采用其他办法. 我门可采用手动添加身份验证

  • 如何解决redis的NOAUTH Authentication required异常

    前言 最近学习中需要使用redis,于是在window上安装了一个redis(其实是我搞不好虚拟机和本地连接,于是放弃了虚拟机安装redis).一开始使用还很正常,也没有设置密码,按照网上所说的启动服务,然后打开可视化工具RedisDesktopManager,连接上了,在java中使用也正常.但是第二天的重启电脑的时候,运行java连接程序却在怎么也连不上.显示 NOAUTH Authentication required 需要密码认证的异常. 到网上查了一下有人说是配置文件中的require

  • Spring Security如何基于Authentication获取用户信息

    Spring Security使用一个Authentication对象来描述当前用户的相关信息.SecurityContextHolder中持有的是当前用户的SecurityContext,而SecurityContext持有的是代表当前用户相关信息的Authentication的引用. 这个Authentication对象不需要我们自己去创建,在与系统交互的过程中,Spring Security会自动为我们创建相应的Authentication对象,然后赋值给当前的SecurityContex

  • spring security获取用户信息的实现代码

    前言 我们在使用spring security的时候可以通过好几种方法获取用户信息, 但是今天这篇文章介绍的是一个笔者觉得最优雅的实现; 借鉴现有的spring security controller自动注入参数的方法, 我们来进一步的实现更适合我们业务的用户信息获取方法; 思路 现在spring security会在controller自动注入Authentication/Userdetails等参数, 我们拿到这些对象之后还需要一些处理才可以拿到我们需要的信息, 例如用户ID; 那获取用户I

  • 通过Spring Security魔幻山谷讲解获取认证机制核心原理

    本文基于Springboot+Vue+Spring Security框架而写的原创学习笔记,demo代码参考<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>一书. 这是一个古老的传说. 在神秘的Web系统世界里,有一座名为SpringSecurity的山谷,它高耸入云,蔓延千里,鸟飞不过,兽攀不了.这座山谷只有一条逼仄的道路可通.然而,若要通过这条道路前往另一头的世界,就必须先拿到一块名为token的令牌,只有这样,道路上戍守关口

  • SpringSecurity从数据库中获取用户信息进行验证的案例详解

    基于 SpringBoot与SpringSecurity整合案例的修改: 数据库 user 表 注,密码是由 BCrypt 算法加密对应用户名所得. root $2a$10$uzHVooZlCWBkaGScKnpha.ZrK31NI89flKkSuTcKYjdc5ihTPtPyq blu $2a$10$mI0TRIcNF4mg34JmH6T1KeystzTWDzWFNL5LQmmlz.fHndcwYHZGe kaka $2a$10$/GMSSJ3AzeeBK3rBC4t8BOZ5zkfb38Il

  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

    目录 资源权限表达式 Spring Security中的实现 MethodSecurityExpressionHandler 思路以及实现 配置和使用 昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Security中我并没有使用过它,不过我认为Spring Security可以实现这一点.是的,我找到了实现它的方法. 资源权限表达式 说了这么多,我觉得应该解

  • Java开发之spring security实现基于MongoDB的认证功能

    本文实例讲述了Java开发之spring security实现基于MongoDB的认证功能.分享给大家供大家参考,具体如下: spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc-user-service>进行支持认证. 如果项目不是使用JDBC,没么解决办法就是:自己定义一个认证服务. 新建一个CustomUserDetailsService类 这个类

  • 微信开发之网页授权获取用户信息(二)

    在公众号的配置过程中,许多开发者会在菜单中加入HTML5页面,有时在页面内需要访问页面的用户信息,此时就需要网页授权获取用户基本信息 我们提醒大家:本文介绍讲述的内容是基于yii2.0框架 1.设置授权回调域名:开发 ---> 接口权限 找到"网页授权获取用户基本信息",点击后面对应的"修改",在弹框响应位置填写授权回调域名即可,此处的域名不需要加http:// (关于网页授权回调域名的说明详情可参考公众平台开发者文档) 2.获取授权 关于OAuth2.0博主

  • Spring Security使用数据库认证及用户密码加密和解密功能

    流程图: 1.接上一篇博客https://mp.csdn.net/console/editor/html/104576494,准备好环境. 2.spring-security.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="

  • PHP版微信第三方实现一键登录及获取用户信息的方法

    本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要"服务号"才可以哦,所以必须到官方申请. 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以

  • 微信公众号-获取用户信息(网页授权获取)实现步骤

    根据微信公众号开发官方文档: 获取用户信息步骤如下: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) 1 获取code 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

随机推荐