下面是详解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技术站