使用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登录用户信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用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 与别的授

  • 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服务器. 支持的

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

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

  • 详解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

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

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

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

    使用spring oauth2框架做授权鉴定.想获取当前用户信息怎么办? 我们知道spring oauth2是基于spring security的实现的. spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息. 而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().ge

  • 详解Spring Security中获取当前登录用户的详细信息的几种方法

    目录 在Bean中获取用户信息 在Controller中获取用户信息 通过 Interface 获取用户信息 在JSP页面中获取用户信息 在Bean中获取用户信息 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentU

  • 详解.NET 6如何实现获取当前登录用户信息

    目录 需求 目标 原理和思路 实现 创建当前用户获取接口 实现接口功能 使用功能 验证 总结 需求 在前面的文章里使用.NET 6开发TodoList应用之领域实体创建原理和思路,我们留了一个坑还没有填上,就是在数据库保存的时候,CreateUser和ModifiedUser我们当时填的都是Anonymous,完成认证的功能后,现在我们需要实现在保存数据库的时候填入当前登陆进行操作的用户名. 目标 实现当前登陆用户信息获取. 原理和思路 原理很简单,在认证时拿到的Token里,payload中是

  • 使用HandlerMethodArgumentResolver用于统一获取当前登录用户

    目录 一.最原始直接 二.AOP 三.拦截器+方法参数解析器 3.1 自定义权限拦截器 3.2 自定义参数注解 3.3 自定义方法参数解析器 3.4 配置MVC 总结 环境:SpringBoot 2.0.4.RELEASE 需求:很多Controller方法,刚进来要先获取当前登录用户的信息,以便做后续的用户相关操作. 准备工作:前端每次请求都传token,后端封装一方法tokenUtils.getUserByToken(token),根据token解析得到currentUserInfo. 这是

  • 微信小程序如何获取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

  • python实现得到当前登录用户信息的方法

    本文实例讲述了python实现得到当前登录用户信息的方法.分享给大家供大家参考,具体如下: 在linux 环境下,python 更多的被当做 替代 SHELL 的工具语言, 其实linux 中,本身就有很多命令是通过python扩展的,我想记录下一些常用的命令以及使用方式,以便以后查看. 第一部分:python得到得到当前登录用户信息 def get_current_user(): try: # pwd is unix only import pwd return pwd.getpwuid(os

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

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

  • python-itchat 获取微信群用户信息的实例

    如下所示: import itchat, time from itchat.content import TEXT #name = ' ' roomslist = [] itchat.auto_login(enableCmdQR = False) def getroom_message(n): #获取群的username,对群成员进行分析需要用到 itchat.dump_login_status() # 显示所有的群聊信息,默认是返回保存到通讯录中的群聊 RoomList = itchat.se

  • Spring Date jpa 获取最新一条数据的实例代码

    #Repository import test.demo.domain.entity.TestEntity; import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation; import org.springframework.stereotype.Repository; @Repository public interface TestEntityRepository extends Jpa

随机推荐