SpringSecurity +oauth2获取当前登录用户(二)

这篇具有很好参考价值的文章主要介绍了SpringSecurity +oauth2获取当前登录用户(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

特别注意:以下内容如果访问失败或有其他疑问,可先学习:

SpringSecurity +oauth2+JWT实现统一授权和认证及项目搭建(一)

1 获取当前用户的信息代码为:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

但是,通过运行会发现principal的值只是用户名,没有用户信息,通过去看源码,才发现问题所在,以下是源码:

源码类:DefaultUserAuthenticationConverter.java

SpringSecurity +oauth2获取当前登录用户(二)

通过源码分析,发现这里的map只存储用户名,对此,如果要获取用户,我这里提供的方案是重写该方法,步骤如下:

新建UserAuthenticationConverter.java配置类,继承DefaultUserAuthenticationConverter.java,代码如下:

package com.yty.system.oauth.config.jwt;

import com.yty.system.oauth.entity.SysUser;
import com.yty.system.oauth.entity.vo.SecurityUser;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.oauth2.provider.token.DefaultUserAuthenticationConverter;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class UserAuthenticationConverter extends DefaultUserAuthenticationConverter {

    private Collection<? extends GrantedAuthority> defaultAuthorities;

    public void setDefaultAuthorities(String[] defaultAuthorities) {
        this.defaultAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.arrayToCommaDelimitedString(defaultAuthorities));
    }

    private static final String USER_INFO = "userInfo";

    /**
     * 设置存入认证信息中的Map
     *
     * @param authentication
     * @return
     */
    @Override
    public Map<String, ?> convertUserAuthentication(Authentication authentication) {
        // 入参authentication中保存了完整的用户信息(都已经有完整信息了还查个P)。
        Map<String, Object> map = new HashMap<>(1);
        // 获取用户信息并保存。
        Object o = authentication.getPrincipal();
        SecurityUser userInfo = (SecurityUser) o;
        SysUser sysUser = userInfo.getSysUser();
        map.put(USER_INFO, sysUser);
        // 保存了账户的权限信息,可以通过Authentication..getAuthorities()方法获取。
        if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {
            map.put(AUTHORITIES, AuthorityUtils.authorityListToSet(authentication.getAuthorities()));
        }
        return map;
    }

    /**
     * 选择存入认证信息中的数据
     *
     * @param map
     * @return
     */
    @Override
    public Authentication extractAuthentication(Map<String, ?> map) {
        Authentication authentication = null;
        if (map.containsKey(USER_INFO)) {
            // 将用户对象作为用户信息。
            Object principal = map.get(USER_INFO);
            Collection<? extends GrantedAuthority> authorities = this.getAuthorities(map);
            authentication = new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
        }
        return authentication;
    }

    private Collection<? extends GrantedAuthority> getAuthorities(Map<String, ?> map) {
        if (!map.containsKey(AUTHORITIES)) {
            return this.defaultAuthorities;
        } else {
            Object authorities = map.get(AUTHORITIES);
            if (authorities instanceof String) {
                return AuthorityUtils.commaSeparatedStringToAuthorityList((String)authorities);
            } else if (authorities instanceof Collection) {
                return AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.collectionToCommaDelimitedString((Collection)authorities));
            } else {
                throw new IllegalArgumentException("Authorities must be either a String or a Collection");
            }
        }
    }
}

修改JwtTokenStoreConfig.java类,将以上配置类引用到方法jwtAccessTokenConverter中,具体实现如下:

@Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter();

        DefaultAccessTokenConverter defaultAccessTokenConverter = new DefaultAccessTokenConverter();
        defaultAccessTokenConverter.setUserTokenConverter(new UserAuthenticationConverter());
        // 赋予新的Token转换器。
        accessTokenConverter.setAccessTokenConverter(defaultAccessTokenConverter);
        //配置JWT使用的秘钥
        accessTokenConverter.setSigningKey(secret);

        return accessTokenConverter;
    }

UserDetailService编写静态方法getCurrentUser获取用户信息,代码如下:

/**
     * 获取当前用户信息
     */
    public static SysUser getCurrentUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (Objects.isNull(authentication)) {
           throw new RuntimeException("请登录");
        }
        Object principal = authentication.getPrincipal();
        if (Objects.isNull(principal)) {
            throw new RuntimeException("请登录");
        }
        ObjectMapper objectMapper = new ObjectMapper();
        SysUser sysUser = objectMapper.convertValue(principal, SysUser.class);
        return sysUser;
    }

UserController.java类中编写测试入口方法getCurrentUser,代码如下:


@RestController
@RequestMapping("/user")
public class UserController {


    @GetMapping("/getCurrentUser")
    public Object getCurrentUser() {
        SysUser currentUser = UserDetailService.getCurrentUser();
        return currentUser;
    }
}

postman访问:

1 先获取token

SpringSecurity +oauth2获取当前登录用户(二)

2 调用接口http://localhost:8500/oauth_api/user/getCurrentUser,注意参数,需要在请求头中添加参数Authorization,内容为:oken_type+空格+access_token,如图所示:

SpringSecurity +oauth2获取当前登录用户(二)

注意,如果访问不通过,需要在资源配置类中将用户访问接口添加到资源配置ResourceServiceConfig.java中,如无该类,自己新建一个,代码如下所示:文章来源地址https://www.toymoban.com/news/detail-411501.html

package com.yty.system.oauth.config.jwt;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

@Configuration
@EnableResourceServer
public class ResourceServiceConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                // 受保护的资源
                .and().requestMatchers()
                .antMatchers("/user/**");

    }
}

到了这里,关于SpringSecurity +oauth2获取当前登录用户(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Oauth2.0 单点登录 + 第三方授权认证】用户认证、授权模式

    本文主要对 SpringSecurity Oauth 2.0 用户认证,授权码授权模式、密码授权模式,以及授权流程进行讲解 开发中,有些功能只有管理员才有,普通用户是没有的。即需要对用户的身份进行认证,是管理员还是普通用户。认证方式有两种: 身份认证: 用户在访问相应资源时对用户

    2023年04月08日
    浏览(65)
  • SpringSecurity+OAuth2.0

    OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。OAuth 在全世界得到广泛应用,目前的版本是 2.0 版。 简单

    2024年02月13日
    浏览(40)
  • Java Spring Security OAuth2.0 通过token 获取用户信息(ID)

    通过获取Spring 身份认证(Authentication)来获取用户信息,这种方式必须 ①请求头中携带Authorization token 或 ②请求参数中携带access_token =token 参数 才能有效获取用户信息 1)那我如果不使用常规传递模式,而使用自定义token参数名、或者其他渠道获取的token; 2)需要使用JwtHelper 进行

    2024年02月15日
    浏览(38)
  • SpringSecurity之Oauth2介绍

    第三方认证技术方案最主要是解决 认证协议的通用标准问题 ,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的

    2023年04月09日
    浏览(45)
  • SpringSecurity+Oauth2+JWT

    快速入门 1. 创建基础项目 file == new == project == Spring Initializr ==next == web(Spring Web)、Security(Spring Security) ==一直下一步 2. 编写代码进行测试 创建controller static下创建login.html、main.html 3. 启动项目进行测试 访问http://localhost:8080/login.html 会进入SpringSecurity框架自带的登入页面 用户默认

    2024年02月12日
    浏览(44)
  • SpringSecurity OAuth2 配置 token有效时长

    1.这种方式配置之后,并没有生效 2.第二种方法时改数据库的配置,测试配置有效

    2024年02月09日
    浏览(50)
  • SpringSecurity+ Oauth2.0+JWT 0-1

    AuthorizationServer 需要继承AuthorizationServerConfigurerAdapter AuthorizationServerConfigurerAdapter源码 AuthorizationServerSecurityConfigurer:配置令牌端点(Token Endpoint)的安全约束 ClientDetailsServiceConfigurer:配置OAuth2客户端 AuthorizationServerEndpointsConfigurer:配置授权(authorization)以及令牌(token)的访

    2024年02月07日
    浏览(49)
  • 五、SpringSecurity OAuth2扩展手机验证码授权模式

    代码仓库:地址 代码分支:lesson5 在上一篇文章中,我们使用SpringSecurity OAuth2搭建了一套授权服务,对业务系统进行统一授权管理。OAuth提供了四种授权方式: 授权码模式(authorization_code) 简化模式(implicit) 客户端(client_credentials) 密码(password) 在实际业务中上述四种模式不

    2024年02月11日
    浏览(56)
  • 权限管理 springboot集成springSecurity Oauth2 JWT

    目录 一、SpringSeurity的基础操作 1、引入主要依赖 2、加密器 3、实现自定义登录逻辑 4、访问限制 5、自定义异常处理  6、通过注解的方式配置访问控制 二、Auth2认证方案 1、什么是Auth2认证 2、Oauth2最常用的授权模式  3、依赖引入 4、添加配置类 5、测试 6、存在到Redis里,后续

    2023年04月14日
    浏览(45)
  • springboot整合springsecurity+oauth2.0密码授权模式

    本文采用的springboot去整合springsecurity,采用oauth2.0授权认证,使用jwt对token增强。本文仅为学习记录,如有不足多谢提出。 OAuth 2.0是用于授权的行业标准协议。OAuth 2.0为简化客户端开发提供了特定的授权流,包括Web应用、桌面应用、移动端应用等。 Resource owner(资源拥有者)

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包