可以使用@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