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)
我还没有尝试过,但这应该对你有用:
@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)
| 归档时间: |
|
| 查看次数: |
6011 次 |
| 最近记录: |