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

yizhihongxing

下面是详解Spring Security中获取当前登录用户的详细信息的几种方法的完整攻略。

什么是Spring Security?

Spring Security是Spring框架的安全认证框架,支持 Web 安全、方法级安全等多种安全场景。通过Spring Security,我们能够实现身份认证、资源授权等各种安全特性,从而保障我们的应用系统在开放网络环境下的安全性。

获取当前登录用户的详细信息的几种方法

方法一:使用SecurityContextHolder

Spring Security提供了SecurityContextHolder来获取当前用户的信息。SecurityContextHolder是Spring Security中的一个核心类,它用来存储当前用户的安全上下文信息。

例如,我们可以使用以下代码段来获取当前登录用户的用户名:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String currentUserName;
if (principal instanceof UserDetails) {
  currentUserName = ((UserDetails) principal).getUsername();
} else {
  currentUserName = principal.toString();
}

该代码段从SecurityContextHolder中获取当前的SecurityContext,然后通过SecurityContext获取当前的Authentication,接着从Authentication获取Principal,最后根据Principal类型判断是否为UserDetails,获取用户名。

方法二:使用@AuthenticationPrincipal注解

@AuthenticationPrincipal注解是Spring Security4.0版本引入的,它可以用来获取当前登录用户的详细信息,例如用户名、密码、角色等。

例如,我们可以使用以下代码段来获取当前登录用户的用户名:

@GetMapping("/hello")
public String hello(@AuthenticationPrincipal UserDetails userDetails) {
    String username = userDetails.getUsername();
    return "Hello, " + username + "!";
}

该代码段通过@AuthenticationPrincipal注解获取登录用户的UserDetails,然后从UserDetails获取用户名。

示例说明

下面,我们通过一个简单的示例来演示获取当前登录用户的详细信息的几种方法。

我们先创建一个Spring Boot Web项目,然后引入Spring Security和Thymeleaf依赖,这里使用Maven来管理项目依赖。

创建User类,用来保存用户的基本信息:

public class User {
    private String name;
    private String password;
    private String role;

    public User(String name, String password, String role) {
        this.name = name;
        this.password = password;
        this.role = role;
    }

    // getter / setter
}

创建MyUserDetailsService类,用来获取用户信息:

@Service
public class MyUserDetailsService implements UserDetailsService {
    private List<User> users = Arrays.asList(
            new User("admin", "admin", "ADMIN"),
            new User("user", "user", "USER")
    );

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> optionalUser = users.stream()
                .filter(user -> user.getName().equals(username))
                .findFirst();

        if (!optionalUser.isPresent()) {
            throw new UsernameNotFoundException("User not found");
        }

        User user = optionalUser.get();
        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(user.getRole());

        return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(), authorities);
    }
}

创建WebSecurityConfig类,用来配置Spring Security:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private MyUserDetailsService myUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login").permitAll()
                .and()
                .logout().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

创建HomeController类,用来获取当前登录用户的详细信息:

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }

    @GetMapping("/admin")
    public String admin(Model model, HttpServletRequest request) {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        model.addAttribute("username", username);

        return "admin";
    }

    @GetMapping("/user")
    public String user(Model model, @AuthenticationPrincipal UserDetails userDetails) {
        String username = userDetails.getUsername();
        model.addAttribute("username", username);

        return "user";
    }

    @GetMapping("/hello")
    public String hello(@AuthenticationPrincipal UserDetails userDetails) {
        String username = userDetails.getUsername();
        return "Hello, " + username + "!";
    }
}

创建login.html、home.html、admin.html和user.html文件,用来展示页面。

最后,我们通过浏览器访问http://localhost:8080/,可以看到登录页面。在登录页面中,我们可以输入admin/admin或user/user的用户名和密码进行登录。

登录成功后,我们可以访问http://localhost:8080/admin或http://localhost:8080/user,查看是否可以访问成功。

在访问http://localhost:8080/admin时,我们使用方法一获取当前登录用户的用户名,代码如下:

String username = SecurityContextHolder.getContext().getAuthentication().getName();

在访问http://localhost:8080/user时,我们使用方法二获取当前登录用户的用户名,代码如下:

@GetMapping("/user")
public String user(Model model, @AuthenticationPrincipal UserDetails userDetails) {
    String username = userDetails.getUsername();
    model.addAttribute("username", username);

    return "user";
}

这样,我们就完成了获取当前登录用户的详细信息的几种方法的演示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Security中获取当前登录用户的详细信息的几种方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • JSON 与对象、集合之间的转换的示例

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。在JavaScript中,可以轻松将JSON格式的数据存储在对象或集合中,也可以将对象或者集合转换为JSON格式的数据。下面,我们通过两个示例来详细讲解JSON与对象、集合之间的转换攻略。 示例一:JSON字符串转对象 我们假设有如下JSON字符…

    Java 2023年5月26日
    00
  • java压缩多个文件并且返回流示例

    下面为你详细讲解如何使用Java压缩多个文件并返回流,包含两条示例。 一、使用Java压缩多个文件 首先,我们需要使用Java提供的ZipOutputStream类来压缩多个文件。以下是一个示例代码: public static void compressFiles(List<File> files, OutputStream outputStr…

    Java 2023年5月20日
    00
  • 基于springboot实现数据可视化的示例代码

    下面是基于Spring Boot实现数据可视化的完整攻略。 一、准备工作 首先确保你已经安装了Java JDK和Spring Boot,可以通过官网下载并安装。 接着,需要选择一个可视化工具,推荐使用Echarts图表库,因为Echarts是目前最流行的数据可视化工具之一,且可以很方便的与Spring Boot集成。 最后,我们需要一些待可视化的数据,以便进…

    Java 2023年5月20日
    00
  • 浅析JPA分类表的操作函数

    下面为您详细讲解浅析JPA分类表的操作函数的完整攻略。 简介 JPA是Java Persistence API的缩写,它是JavaEE用于ORM的标准框架,可以方便地处理Java对象与关系型数据库之间的映射关系。在JPA中,分类表(分表)是一种处理大量数据的常用技术,它将一个大表拆分为多个小表,以提高查询、更新等操作的效率。 分类表的实现方式 1. 基于En…

    Java 2023年5月26日
    00
  • java中Spring Security的实例详解

    Java中Spring Security的实例详解 前言 Spring Security 是一个强大而灵活的框架,用于在 Java 应用程序中实现认证和授权。它可以与许多不同的身份验证和授权方案一起使用,因此可以适应广泛的需求。本文将介绍 Spring Security 的概念和用法,并提供两个基于 Spring Security 的示例。 Spring S…

    Java 2023年5月20日
    00
  • java实现多线程卖票功能

    下面是Java实现多线程卖票功能的完整攻略。 1. 线程安全性 在多线程环境中,相同的资源可能被多个线程同时访问,因此必须保证线程安全性。Java提供了多种方式来实现线程安全性,包括使用synchronized关键字、使用Lock接口、使用Atomic类等。 2. 实现多线程卖票 为了实现多线程卖票功能,我们可以创建多个线程来模拟多个售票窗口,并且使用同一组…

    Java 2023年5月18日
    00
  • Java利用TreeUtils工具类实现列表转树

    下面是Java利用TreeUtils工具类实现列表转树的完整攻略。 1.准备工作 在进行列表转树操作前,需要先准备好列表数据。假设列表中每个元素都具有一个唯一标识符id和一个父元素标识符parentId,我们可以封装一个类来表示列表元素: public class TreeNode { private String id; private String pa…

    Java 2023年5月20日
    00
  • 打卡每日10道面试题——JVM篇

    打卡每日10道面试题——JVM篇攻略 简介 本打卡活动旨在通过每天解答10道JVM面试题来加深JVM的理解和应用,提高应聘者面试成功率。本文将为大家提供一个完整的JVM打卡攻略,包括学习路线、注意点和解答示例等。 学习路线 第一阶段:JVM基础知识学习 在这个阶段,你需要学习JVM的基本概念和原理,掌握Java类的加载、链接和初始化过程,了解JVM的内存模型…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部