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

下面是详解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日

相关文章

  • java获取登录者IP和登录时间的两种实现代码详解

    下面将详细讲解如何实现在Java中获取登录者IP和登录时间的两种方法。 获取登录者IP和登录时间的方法 使用HttpServletRequest对象获取登录者IP 在Java web开发中,我们可以通过获取HttpServletRequest对象来获取登录者的IP地址。 String ip = request.getRemoteAddr(); 当用户登录时,…

    Java 2023年5月20日
    00
  • java list常用方法总结

    Java List常用方法总结 在Java开发中,List是一种非常常用的容器类型。List通常用于存储一组元素,并且可以动态地添加、删除、修改和访问这些元素。本文总结了Java List常用的方法,希望对你的开发有所帮助。 List的常用方法 1. add() add()方法用于向List中添加一个元素。语法如下: boolean add(E e) 其中,…

    Java 2023年5月26日
    00
  • Maven 的配置文件路径读取方法

    Maven 是一个流行的 Java 项目管理工具,它有一个核心的配置文件 pom.xml,用于管理项目的依赖、插件、构建目标等。除此之外,Maven 还有一些配置文件用于设置全局属性或指定仓库的位置等信息。下面我们来详细讲解 Maven 的配置文件路径读取方法。 1. Maven 配置文件路径 Maven 的配置文件路径分为两种类型:全局配置和用户配置。 全…

    Java 2023年5月20日
    00
  • 图文教程教你IDEA中的Spring环境搭建+简单入门

    图文教程:IDEA中的Spring环境搭建+简单入门 本文基于集成开发环境IntelliJ IDEA,为初学者讲解了如何搭建Spring环境和进行简单入门操作。下面是详细的步骤: 1. 安装IDEA 首先需要下载并安装IntelliJ IDEA,官方网站为:https://www.jetbrains.com/idea/download/。选择对应操作系统版本…

    Java 2023年5月19日
    00
  • GC日志有哪些级别?

    GC日志在Java应用程序中是非常重要的一部分,它可以帮助开发人员了解垃圾回收的运行情况,优化垃圾回收的效率和内存使用。GC日志一般分为以下几个级别: Verbose GC :默认情况下,JVM不会记录垃圾回收的日志。我们需要通过设置“-verbose:gc”参数来启用Verbose GC日志。Verbose GC日志主要记录了垃圾回收的时间、空间以及回收后…

    Java 2023年5月11日
    00
  • java.lang.Void类源码解析

    Java.lang.Void类源码解析 Java.lang.Void类是Java语言中一种特殊的“虚无”类型,该类型用于表示方法没有返回值的情况。本文将解析该类的源代码实现原理。 Void类的定义 Java.lang.Void类是一个final修饰的类,不能被继承。该类的源代码如下所示: public final class Void { /** * The…

    Java 2023年5月26日
    00
  • IDEA不编译除了.java之外的文件的解决办法(推荐)

    IDEA不编译除了.java之外的文件的解决办法(推荐) 在使用IntelliJ IDEA 进行项目开发时,我们可能会遇到只编译 Java 文件,而不编译其他文件的问题,这可能会导致一些问题出现。此时,我们需要采取一些措施来解决这个问题。 解决方案 解决方案有很多种,主要有三种: 方案一 打开IntelliJ IDEA设置,找到Compiler,在其中找到C…

    Java 2023年5月26日
    00
  • Java调用dll文件的实现解析

    下面就来详细讲解“Java调用dll文件的实现解析”的完整攻略。 什么是DLL文件 首先,我们需要了解一下DLL文件,DLL是Dynamic Link Library的缩写,是动态链接库的意思,它是Windows系统中用来提供一些功能的动态库文件,以实现代码复用,减少内存占用等等的目的。 在Windows系统中,有许多功能模块通过DLL文件的方式进行提供,例…

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