Java 如何使用SpringMVC获取用户id?
我使用POST方法使用SpringMVC向数据库添加Java 如何使用SpringMVC获取用户id?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我使用POST方法使用SpringMVC向数据库添加项。但是每个项都有字段userId,它是外键到用户表。需要知道该用户的id。我正在使用Spring安全性进行身份验证。可能存在使用ServletContext或HttpSession获取当前用户id的可能性,spring security是否可能将用户id保存在某个位置 如何识别向服务器请求使用SpringMVC访问数据库中数据的用户 @PostMapping("/get_all_items/add_item_page/add_item") p
项
。但是每个项
都有字段userId
,它是外键
到用户
表。需要知道该用户的id。我正在使用Spring安全性进行身份验证。可能存在使用ServletContext
或HttpSession
获取当前用户id的可能性,spring security是否可能将用户id保存在某个位置
如何识别向服务器请求使用SpringMVC访问数据库中数据的用户
@PostMapping("/get_all_items/add_item_page/add_item")
public String addItem(@RequestParam(value = "description")
final String description) {
final Item item = new Item();
item.setDescription(description);
item.setAuthorId(/* ??? */);
service.add(item);
return "redirect:get_all_items";
}
使用UserDetails
实现Spring安全性,因此所有细节都对我隐藏,我不知道如何干预身份验证过程并在身份验证阶段截取用户id
@Entity(name = "users")
public class User implements UserDetails {...}
@Autowired
private UserService userService;
@Autowired
private void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userService);
}
谢谢大家! 请尝试这种方法 确保您有自己的
User
pojo类
@Entity
public class MyUser {
@Id
private Long id;
private String username;
private String password;
private boolean isEnabled;
@ManyToMany
private List<MyAuthority> myAuthorities;
...
}
然后是用户存储库,在本例中,我只声明了一个方法,通过用户名查找,并获得一个可选的方法来验证用户是否存在
public interface MyUserRepository extends CrudRepository<MyUser,Long> {
public Optional<MyUser> findFirstByUsername(String username);
}
现在是UserDetailService
实现,只有一种方法可以实现loadUserByUsername
这里需要MyUserRepository
,以便通过用户名从存储库中检索用户信息
@Service
public class MyUserService implements UserDetailsService {
@Autowired
MyUserRepository myUserRepository;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
Optional<MyUser> myUser = myUserRepository.findFirstByUsername(s);
return myUser.map( (user) -> {
return new MySpringUser(
user,
user.getMyAuthorities().stream().
map( authority ->
new SimpleGrantedAuthority(authority.getName())).
collect(Collectors.toList()));
}).orElseThrow(() -> new UsernameNotFoundException("user not found"));
}
}
然后使用这种方法,您可以将主体
对象注入控制器,并在方法内部将主体
对象强制转换为MySpringUser
,这是因为MySpringUser
是从org.springframework.security.core.userdetails.User
扩展而来的,用户类实现了userdetails
接口。当然,您可以获得用户的所有其他自定义字段,因为它的定义包装在org.springframework.security.core.userdetails.user
类中
@PostMapping("/get_all_items/add_item_page/add_item")
public String addItem(@RequestParam(value = "description")
final String description, Principal principal) {
MySpringUser mySpringUser = (MySpringUser)principal;
final Item item = new Item();
item.setDescription(description);
item.setAuthorId(mySpringUser.getUser().getId());
service.add(item);
return "redirect:get_all_items";
}
我尝试了很多方法,但最好的方法是创建custer用户类,扩展org.springframework.security.core.userdetails.User
package com.walterwhites.library.model.pojo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import java.util.Collection;
@Getter
@Setter
public class MyUser extends User {
long id;
public MyUser(long id, String username, String password, Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
this.id = id;
}
}
诚恳地
UserDetails client = (UserDetails) auth.getPrincipal();
long id = ((User) client).getUserId();
System.out.println(id);
我得到了这个错误:
java.lang.ClassCastException: com.doc.importexport.implementation.UserPrincipal cannot be cast to com.doc.importexport.model.User
不幸的是,我在启动我的应用程序时出错:
BeanCreationException:创建名为“entityManagerFactory”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]中定义:init方法调用失败;嵌套异常为org.hibernate.AnnotationException:@OneToOne或@ManyToOne on ru.pravvich.domain.Item.author引用未知实体:ru.pravvich.domain.SUser
。我有一个JPA对象用户,SpringUser是包装器,它没有实体和hibernate失败构建entityManagerFactoryok请提供SpringUser类,我想知道扩展的用户类。您能否提供您在Spring用户上使用的导入。另外,请输入Item类错误意味着Item类有一个SUser类型的autor字段,但Hibernate无法将SUser识别为实体。这并不能真正回答问题。如果您有不同的问题,可以通过单击“提问:”来提问。一旦你有了足够的声誉,你还可以添加悬赏来吸引更多的注意力:
package com.walterwhites.library.model.pojo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import java.util.Collection;
@Getter
@Setter
public class MyUser extends User {
long id;
public MyUser(long id, String username, String password, Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
this.id = id;
}
}
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
UserDetails client = (UserDetails) auth.getPrincipal();
long id = ((MyUser) client).getId();
UserDetails client = (UserDetails) auth.getPrincipal();
long id = ((User) client).getUserId();
System.out.println(id);
java.lang.ClassCastException: com.doc.importexport.implementation.UserPrincipal cannot be cast to com.doc.importexport.model.User