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

相关文章

  • Sprint Boot @EnableAutoConfiguration使用方法详解

    Spring Boot中@EnableAutoConfiguration的作用与使用方法 在Spring Boot中,@EnableAutoConfiguration注解用于启用自动配置。它可以自动配置Spring Boot应用程序中的各种组件,包括数据源、Web MVC、安全性等。 作用 @EnableAutoConfiguration注解的作用是启用自动…

    Java 2023年5月6日
    00
  • Spring Boot 的创建和运行示例代码详解

    下面是“Spring Boot 的创建和运行示例代码详解”的完整攻略。 创建 Spring Boot 项目 步骤一:使用 Spring Initializr 创建项目 Spring Initializr 是一个快速创建 Spring Boot 项目的在线工具,我们只需要在网站上选择相关的配置就可以快速创建出一个 Spring Boot 项目。 步骤如下: 打…

    Java 2023年5月15日
    00
  • Java实现把两个数组合并为一个的方法总结

    针对“Java实现把两个数组合并为一个的方法总结”,我为您提供以下完整攻略。 1. 使用concat方法合并数组 Java提供了一个非常简单的函数concat来合并两个数组。但是,这种方法只适用于元素类型相同的数组。 具体操作步骤: 初始化两个需要合并的数组; 分别使用Arrays类的toString()方法将两个数组转换为字符串形式; 使用Arrays类的…

    Java 2023年5月26日
    00
  • 什么是Java元空间(Metaspace)?

    什么是Java元空间(Metaspace)? Java元空间(Metaspace)是在Java 8中新引入的一种内存区域,用于存储类的元数据信息。在之前的Java版本中,元数据信息被存储在永久代(Permanent Generation)中,但是永久代的内存空间不可扩展,当大量的类或字符串被加载时,会导致永久代的OOM(Out Of Memory),因此在J…

    Java 2023年5月11日
    00
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    下面是详解”spring boot集成ehcache 2.x 用于hibernate二级缓存”的完整攻略。 引言 在使用Spring Boot开发项目时,我们往往需要使用到缓存来提高性能。而使用Hibernate框架时,我们可以通过集成Ehcache来实现二级缓存。本文将详细介绍在Spring Boot项目中,如何集成Ehcache 2.x用于Hiberna…

    Java 2023年5月20日
    00
  • java web实现简单登录注册功能全过程(eclipse,mysql)

    接下来我详细讲解如何使用Java Web实现简单的登录注册功能全过程,以下是步骤: 步骤一:配置开发环境 在开始项目之前,我们需要搭建好相应的开发环境,主要包括Java SE、Eclipse IDE、MySQL等工具和环境的安装和配置工作。 步骤二:创建Maven Web项目 在Eclipse IDE中创建一个Maven Web项目,建议使用Spring框架…

    Java 2023年6月16日
    00
  • 关于IDEA git 只有Commit没有Push的问题

    下面是关于IDEA git只有Commit没有Push的问题的完整攻略: 问题描述 在使用IntelliJ IDEA进行git提交时,有时候只有Commit并没有进行Push操作,导致提交的代码并没有同步到仓库中,其他人无法看到最新的代码。 原因分析 首先,需要明确Commit和Push的区别: Commit:将代码提交到本地git仓库中,并生成一个comm…

    Java 2023年6月15日
    00
  • Spring Security使用单点登录的权限功能

    以下是Spring Security使用单点登录的权限功能的完整攻略: 什么是单点登录(Single Sign-On, SSO) 单点登录(Single Sign-On, SSO)是一种让用户只需登录一次即可访问多个系统的身份认证方法 单点登录技术要解决的问题是如何在多个系统中共享身份认证信息 Spring Security使用单点登录的权限功能 Sprin…

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