可以使用@AuthenticationPrincipal
批注和AuthenticationPrincipalArgumentResolver
这是Spring MVS MethodArgumentResolver
的实现)将注入经过身份验证的用户注入Spring MVC处理程序方法。 默认情况下, AuthenticationPrincipalArgumentResolver
已通过Web安全配置注册(例如,使用@EnableWebSecurity
启用安全性时)。
1.定制
假设我们有自定义的UserDetails
实现:
import org.springframework.security.core.GrantedAuthority;
import pl.codeleak.surveyapp.entities.Member;import java.util.Collection;public class AccountDetailsextends org.springframework.security.core.userdetails.User {private final Account account;public AccountDetails(Account account,Collection<? extends GrantedAuthority> authorities) {super(account.getMember().getEmail(), account.getPassword(), authorities);this.account = account;}public Account getAccount() {return account;}public Member getMember() {return account.getMember();}
}
AccountDetails
有两种其他方法,可以访问相关的帐户和会员信息。 然后,我们自己的UserDetailsService
实现将使用AccountDetails
,然后由Spring Security DAO Authentication Manager用来对用户进行身份验证。
注意:Spring Security配置不在本文讨论范围之内。
2.注入
@AuthenticationPrincipal
批注的最基本用途是注入UserDetails。 在我们的方案中,我们希望注入AccountDetails
。 为了做到这一点,只需将@AuthenticationPrincipal
注释的参数放在Spring MVC处理程序方法中:
@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal AccountDetails accountDetails) {return "index";
}
如果经过身份验证的用户不存在, accountDetails
将评估为null
。 如果用户通过身份验证– accountDetails
将评估为有效对象。
注意:从Spring 4.0开始,您应该使用org.springframework.security.core.annotation.AuthenticationPrincipal
3.使用
AccountDetails
还有两种获取account
和member
对象的方法。 如果我们想将它们直接注入处理程序方法,可以使用@AuthenticatedPricipal
批注的expression
属性:
@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal(expression = "account") Account account) {return "index";
}
@RequestMapping(value = {"", "/", "index.html"})
public String index(@AuthenticationPrincipal(expression = "member") Member member) {return "index";
}
该表达式定义了在插入参数时将使用的SpEL表达式。 很方便。
4.'扩展'
代替在处理程序方法中重复@AuthenticationPrincipal(expression = "account") Account account
我们可以创建一个元注释并在我们的@Controller
使用它:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@AuthenticationPrincipal(expression = "account")
public @interface LoggedInAccount {}
5. Spring Security 3.2和Spring Security 4+中的
- Spring Security 3.2 –
org.springframework.security.web.bind.annotation.AuthenticationPrincipal
- Spring Security 4.0 –
org.springframework.security.core.annotation.AuthenticationPrincipal
翻译自: https://www.javacodegeeks.com/2016/09/injecting-authenticated-user-spring-mvc-controllers.html