使用spring oauth2框架获取当前登录用户信息的实现代码

使用spring oauth2框架做授权鉴定。想获取当前用户信息怎么办?

我们知道spring oauth2是基于spring security的实现的。

spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。

而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()却只能拿到当前用户的用户名。

然而实际开发过程中,我们较常用到的大部分都是用户的id

那么怎么通过配置获取当前用户的信息呢?

首先我们看下,为什么oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到的是用户名?

我们看下源码

DefaultUserAuthenticationConverter.java

public Authentication extractAuthentication(Map<String, ?> map) {
      // userClaimName是静态常量:username
  if (map.containsKey(userClaimName)) {
    Object principal = map.get(userClaimName);
    Collection<? extends GrantedAuthority> authorities = getAuthorities(map);
          // 原因就是这里。如果userDetailsService为空,返回的就是用户名。
    if (userDetailsService != null) {
      UserDetails user = userDetailsService.loadUserByUsername((String) map.get(userClaimName));
      authorities = user.getAuthorities();
      principal = user;
    }
    return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
  }
  return null;
}

那我们就给这个类,设置userDetailsService。

我们看下这个类的调用。

DefaultAccessTokenConverter.java

public class DefaultAccessTokenConverter implements AccessTokenConverter {
    // 一开始就被初始化好了,所以不能设置userDetailsService
  private UserAuthenticationConverter userTokenConverter = new DefaultUserAuthenticationConverter();

  // 但是提供了setter接口,所以我们要做的就是覆盖上面的实例。
  public void setUserTokenConverter(UserAuthenticationConverter userTokenConverter) {
    this.userTokenConverter = userTokenConverter;
  }

}

所以如果是使用DefaultAccessTokenConverter的,代码可以这么写

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.tokenStore(tokenStore)
        .authenticationManager(manager)
        .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
        .userDetailsService(userService)
        // .accessTokenConverter(tokenConverter);

    DefaultAccessTokenConverter converter = new DefaultAccessTokenConverter();
    DefaultUserAuthenticationConverter userAuthenticationConverter
        = new DefaultUserAuthenticationConverter();
    userAuthenticationConverter.setUserDetailsService(userService);
    converter.setUserTokenConverter(userAuthenticationConverter);
    endpoints.accessTokenConverter(converter);
  }

}

如果是用jwtConverter的话,可以这么改。

定义一个accessTokenConverter继承DefaultAccessTokenConverter

public class OauthAccessTokenConverter extends DefaultAccessTokenConverter {
  public OauthAccessTokenConverter(SecurityUserService userService) {
    DefaultUserAuthenticationConverter converter = new DefaultUserAuthenticationConverter();
    converter.setUserDetailsService(userService);
    super.setUserTokenConverter(converter);
  }
}

定义一个jwtConverter继承JwtAccessTokenConver

public class OauthJwtAccessTokenConverter extends JwtAccessTokenConverter {

  public OauthJwtAccessTokenConverter(SecurityUserService userService) {
    super.setAccessTokenConverter(new OauthAccessTokenConverter(userService));
  }
}

注册bean

@Configuration
public class TokenConfig {
  @Bean
  public TokenStore jwtTokenStore(JwtAccessTokenConverter converter) {
    return new JwtTokenStore(converter);
  }

  @Bean
  public JwtAccessTokenConverter jwtAccessTokenConverter(SecurityUserService userService) {
    JwtAccessTokenConverter accessTokenConverter = new OauthJwtAccessTokenConverter(userService);
    accessTokenConverter.setSigningKey("sign_key");
    return accessTokenConverter;
  }
}

Oauth2认证服务

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

  @Autowired
  private AuthenticationManager manager;
  @Autowired
  private SecurityUserService userService;
  @Autowired
  private TokenStore tokenStore;
  @Autowired
  private JwtAccessTokenConverter tokenConverter;

  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.tokenStore(tokenStore)
        .authenticationManager(manager)
        .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
        .userDetailsService(userService)
        .accessTokenConverter(tokenConverter);
  }
}

最后就可以像spring security一样。

使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取用户信息了。

到此这篇关于spring oauth2获取当前登录用户信息的文章就介绍到这了,更多相关spring oauth2登录用户信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间:2020-07-17

Spring Cloud下OAUTH2注销的实现示例

接上文Spring Cloud下基于OAUTH2认证授权的实现,我们将基于Spring Cloud实现OAUTH2的注销功能. 1 增加自定义注销Endpoint 所谓注销只需将access_token和refresh_token失效即可,我们模仿org.springframework.security.oauth2.provider.endpoint.TokenEndpoint写一个使access_token和refresh_token失效的Endpoint: @FrameworkEndpoi

3行代码快速实现Spring Boot Oauth2服务功能

这里的3行代码并不是指真的只需要写3行代码,而是基于我已经写好的一个Spring Boot Oauth2服务.仅仅需要修改3行数据库配置信息,即可得到一个Spring Boot Oauth2服务. 项目地址https://github.com/jeesun/oauthserver oauthserver 简介 oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth服务器.仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth服务器. 支持的

Spring Cloud下基于OAUTH2认证授权的实现示例

在Spring Cloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认证和授权,从而获得access_token,而这个token是受其他微服务信任的,我们在后续的访问可以通过access_token来进行,从而实现了微服务的统一认证授权. 本示例提供了四大部分: discovery-service:服务注册和发现的基本模块 auth-server:OAUTH2认证授权中心 order-service:普通微服务,用来验证认

使用Springboot搭建OAuth2.0 Server的方法示例

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. OAuth 简介 OAuth 是由 Blaine Cook.Chris Messina.Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全.开放的标准. 基于 OAuth 认证授权具有以下特点: 安全.OAuth 与别的授

详解Springboot Oauth2 Server搭建Oauth2认证服务

本教程源码 https://github.com/bestaone/HiAuth 源码比较全面,教程我就只介绍关键代码了,喜欢的点个star,谢谢! 关键词 微服务认证 Oauth2 认证中心 springboot spring-cloud-starter-oauth2 集成Oauth2 Oauth2 客户端 介绍 这里我将介绍两个部分 Oauth2 server 的开发 (hi-auth-web模块) Oauth2 client 的开发 (hi-mall-web模块) 效果图 himall.g

Springboot+Shiro记录用户登录信息并获取当前登录用户信息的实现代码

由于最近做项目需要,在用户登陆后有一个功能是需要用户的信息,进行写入数据库的操作.但是目前还用不到Shiro的高级权限,只为了简单获取用户信息,自己整合了一个只记录用户,获取用户信息的功能. 导入Shiro依赖 <!– Shiro –> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version

解决laravel5中auth用户登录其他页面获取不到登录信息的问题

首先创建user表,里面有:id, name, password,remember_token等字段. 然后再Models添加表模型User.php <?php namespace App/Models; use Illuminate/Database/Eloquent/Model; use Illuminate/Contracts/Auth/Authenticatable as AuthenticatableContract; use DB; class User extends Model

微信小程序学习笔记之登录API与获取用户信息操作图文详解

使用spring oauth2框架获取当前登录用户信息的实现代码

本文实例讲述了微信小程序学习笔记之登录API与获取用户信息操作.分享给大家供大家参考,具体如下: 前面介绍了微信小程序跳转页面.传递参数获得数据,这里来分析一下登录API与获取用户信息操作方法. [小程序登录]wx.login() app.js: App({ onLaunch: function () { // 登录 wx.login({ success: function (res) { if (res.code) { //发起网络请求 wx.request({ url: ‘https://w

SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

使用spring oauth2框架获取当前登录用户信息的实现代码

这个项目写到现在,基本的雏形出来了,在此感谢一直关注的童鞋,送你们一句最近刚学习的一句鸡汤:念念不忘,必有回响.再贴一张ui图片: 前篇思考问题解决 前篇我们只是完成了同一账户的登录人数限制shiro拦截器的编写,对于手动踢出用户的功能只是说了采用在session域中添加一个key为kickout的布尔值,由之前编写的KickoutSessionControlFilter拦截器来判断是否将用户踢出,还没有说怎么获取当前在线用户的列表的核心代码,下面贴出来: /** * <p> * 服务实现类

shiro实现单点登录(一个用户同一时刻只能在一个地方登录)

使用spring oauth2框架获取当前登录用户信息的实现代码

我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件. shiro.ini [main] # Objects and their properties are defined here, # Such as the securityManager, Realms and anything # else needed to build the SecurityManager authc.loginUrl = /login.jsp authc.successUrl = /w

SpringBoot文件上传控制及Java 获取和判断文件头信息

使用spring oauth2框架获取当前登录用户信息的实现代码

之前在使用SpringBoot进行文件上传时,遇到了很多问题.于是在翻阅了很多的博文之后,总算将上传功能进行了相应的完善,便在这里记录下来,供自己以后查阅. 首先,是建立一个标准的SpringBoot 的工程,这里使用的IDE是Intellij Idea,为了方便配置,将默认的配置文件替换为了application.yml. 1.在index.html中进行文件上传功能,这里使用的文件上传方式是ajax,当然也可以按照自己的具体要求使用传统的表单文件上传. <!DOCTYPE html> &l

微信小程序获取手机号授权用户登录功能

使用spring oauth2框架获取当前登录用户信息的实现代码

小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPhoneNumber这个组件通过button来实现(别的标签无效).将button中的open-type="getPhoneNumber",并且绑定bindgetphonenumber事件获取回调. <span style="font-size:14px;"><button open-type="get

微信小程序如何获取openid及用户信息

微信小程序获取openid及用户信息的方法 1. 获取openid 1.1 获取code 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. wx.login({ //获取code success: function(res) { code = res.code //返回code } }) 1.2 获取openid 拿到上一步获取的code,结合小程序 appid

php获取发送给用户的header信息的方法

本文实例讲述了php获取发送给用户的header信息的方法.分享给大家供大家参考.具体分析如下: headers_list函数没有参数,并返回一个数组.返回的数组包含一个数字索引表,包含了要发送给客户端的header信息 <?php header("Expires: Sat, 12 Dec 1989 05:30:00 GMT"); echo "This is some output.<br />"; echo "Headers sent

Java微信公众平台开发(12) 微信用户信息的获取

使用spring oauth2框架获取当前登录用户信息的实现代码

前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息,并实现一个简单场景应用:当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:[尊敬的:XXX,你好!],而且在图文消息中的图片就是用户的微信头像,如下图: 有关获取微信用户信息的文档我们可以参照:http:

laravel-admin 管理平台获取当前登陆用户信息的例子

在上面添加下面的代码: use Illuminate/Support/Facades/Auth; 在需要用到的地方添加下面的代码 Auth::guard(‘admin’)->user(); //得到的是一个对象 也可以是 Auth::guard(‘admin’)->user()->toArray(); //得到的一个用户信息的数组 以上这篇laravel-admin 管理平台获取当前登陆用户信息的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

原文 

https://www.zhangshengrong.com/p/O3aA7jvgX4/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 使用spring oauth2框架获取当前登录用户信息的实现代码

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址