使用EnableWebSecurity时,AuthenticationPrincipal为空

Jim*_*Yin 5 spring spring-mvc spring-security

截至Spring Security doc:34.1 @EnableWebMvcSecurity状态,@EnableWebMvcSecurity被替换为@EnableWebSecurity.

但是当我尝试通过它获取UserDetails控制器时@AuthenticationPrincipal,我得到了一个空对象:用户名是"".我也试过了@EnableWebMvcSecurity,但不幸的UserDetails是null.

但我可以UserDetails通过传统方式获得,如下所示:

SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我使用时,获取我的自定义UserDetails(Account)的正确方法是什么@EnableWebSecurity?

以下是相关的源代码:

控制器:

@RequestMapping(method = RequestMethod.POST)
@Secured("ROLE_USER")
public String postRoom(@Valid @ModelAttribute Room room, BindingResult result, Model model, @AuthenticationPrincipal Account principal) {
    if (result.hasErrors()) {
        return "room_form";
    }

    Account account = accountRepository.findByUsername(principal.getUsername());
    room.setAccountId(account.getId());
    room.setLastModified(new Date());
    roomRepository.save(room);
    return "room_list";
}
Run Code Online (Sandbox Code Playgroud)

安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private SecurityProperties security;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll()
            .and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll()
            .and().logout().permitAll()
            .and().rememberMe()
            .and().csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.jdbcAuthentication().dataSource(this.dataSource).passwordEncoder(new BCryptPasswordEncoder(8));
    }
}
Run Code Online (Sandbox Code Playgroud)

而且Account.java:

@Entity
@Table(name = "users")
public class Account implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    private String username;
    private String password;
    private boolean enabled;

    @Lob
    private byte[] avatar;

// getter / setter ...
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*ert 2

我还没有尝试过,但这应该对你有用:

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver(){
        return new AuthenticationPrincipalArgumentResolver();
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(authenticationPrincipalArgumentResolver());
    }
}
Run Code Online (Sandbox Code Playgroud)