Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SpringMVC获取用户id?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 如何使用SpringMVC获取用户id?

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

我使用POST方法使用SpringMVC向数据库添加
。但是每个
都有字段
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