@AuthenticationPrincipal注解 更多用法
时间: 2023-05-26 18:05:30 浏览: 99
@AuthenticationPrincipal注释是Spring Security框架提供的注释之一,它用于从当前认证的Principal对象中提取信息,例如用户名,并将其注入到控制器方法参数中。@AuthenticationPrincipal通常与Spring Security配置中的{@link org.springframework.security.config.annotation.web.configuration.EnableWebSecurity}结合使用。
更多用法包括:
1. 使用表达式
可以使用表达式指定从Principal对象中提取的属性,例如:
```
@GetMapping("/users/me")
public User getCurrentUser(@AuthenticationPrincipal(expression="email") String email) {
// ...
}
```
上述方法将从当前认证用户的Principal对象中提取“email”属性,并将其注入到email参数中。
2. 自定义Principal对象
如果要使用自定义的Principal对象,则可以在Spring Security配置中指定Principal类型,并在控制器方法参数中使用@AuthenticationPrincipal注释:
```
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// ...
}
@Bean
public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() {
return new AuthenticationPrincipalArgumentResolver(new CustomPrincipalExtractor());
}
}
@GetMapping("/users/me")
public User getCurrentUser(@AuthenticationPrincipal CustomPrincipal principal) {
// ...
}
```
上述代码定义了一个名为authenticationPrincipalArgumentResolver的@Bean,它使用自定义的PrincipalExtractor类从Principal对象中提取自定义Principal对象,并将其作为参数传递给控制器方法。
3. 与@PreAuthorize注解结合使用
可以使用@PreAuthorize注释限制控制器方法的访问,并使用@AuthenticationPrincipal注释将当前用户的Principal对象传递给方法。例如:
```
@GetMapping("/users/{id}")
@PreAuthorize("#id == authentication.principal.id")
public User getUser(@PathVariable("id") long id, @AuthenticationPrincipal User currentUser) {
// ...
}
```
上述代码在控制器方法中使用@PreAuthorize注释,只允许当前登录用户访问具有与其ID匹配的用户的详细信息。同时,使用@AuthenticationPrincipal注释将当前用户的Principal对象注入到currentUser参数中。
阅读全文