gpt4 book ai didi

java - 如何从后端创建有关 spring 安全性的 session ?

转载 作者:行者123 更新时间:2023-11-30 08:08:57 25 4
gpt4 key购买 nike

我的 spring 应用程序使用 spring security 登录,它工作正常,但我想做一些额外的事情。

有一些用户将通过另一种方法登录,所以,我会在我的 Controller 上收到一个包含数据的帖子......是否有任何方法可以从该 Controller 模拟用户实际上正在输入他的用户名/密码登录表单,然后创建一个关于 spring security 的 session ?

现在我有这个

Spring 安全配置

@Autowired
private UserDetailsService customUserDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/auth/**").authenticated();

http.
authorizeRequests()
.antMatchers("/resources/**").permitAll()
.antMatchers("/admin/**")
.access("hasRole('ROLE_ADMIN')")
.antMatchers("/user/**")
.access("hasRole('ROLE_USER')")
.and()
.formLogin()
.defaultSuccessUrl("/usuario/home")
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/")
.permitAll();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
if(encoder == null) {
encoder = new BCryptPasswordEncoder();
}
return encoder;
}

在我的 Controller 上登录方法(真的没什么..)

 @RequestMapping("/login")
public ModelAndView login() {
ModelAndView mvc = new ModelAndView();
mvc.setViewName("login");
mvc.addObject("message", "");

return mvc;
}

我也有我的详情服务,像这样

@Autowired
private UserRepository userRepository;

@Transactional(readOnly=true)
@Override
public UserDetails loadUserByUsername(final String username)
throws UsernameNotFoundException {

com.jp.base.domain.User user = userRepository.findByUsername(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoles());
System.out.println("user roles: " + user.getUserRoles());
return buildUserForAuthentication(user, authorities);

}

private User buildUserForAuthentication(com.jp.base.domain.User user,
List<GrantedAuthority> authorities) {
return new User(user.getUsername(), user.getPassword(), authorities);
}

private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {

Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

// Build user's authorities
for (UserRole userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}

return new ArrayList<GrantedAuthority>(setAuths);
}
}

知道怎么做吗?

谢谢。

最佳答案

有一种方法可以做到这一点。您可以使用 Spring SecurityContextHolder。它看起来像这样:

UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(principal, credentials);
SecurityContextHolder.getContext().setAuthentication(authentication);

其中主体是 UserDetails 对象。如果您没有凭据,则可以只传递 null。

关于java - 如何从后端创建有关 spring 安全性的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820966/

25 4 0
文章推荐: java - 生产者/消费者死锁多线程Java
文章推荐: javascript - 在 javascript 或 jquery 中延迟一个就绪的 function()
文章推荐: javascript - jquery 在
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com