Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 如何确保JpaRepository_Java_Spring_Spring Boot_Spring Security_Spring Data Rest - Fatal编程技术网

Java 如何确保JpaRepository

Java 如何确保JpaRepository,java,spring,spring-boot,spring-security,spring-data-rest,Java,Spring,Spring Boot,Spring Security,Spring Data Rest,我想保护一个JpaRepository,它将我的OAuth用户引用到授权角色Role\u ADMIN。现在我想知道需要注释哪些方法。 因此,为了确保整个用户存储库的安全,登录不再工作,因为它调用了findByUsername(stringusername)方法。是否有可能从登录过程中删除此方法并将参数限制为主体用户名 因此,首先我需要发现JpaRepository中需要授权的标准方法。当我浏览代码时,我发现了很多,但我不认为我需要明确地提到所有这些 List<T> findAll()

我想保护一个JpaRepository,它将我的OAuth用户引用到授权角色
Role\u ADMIN
。现在我想知道需要注释哪些方法。 因此,为了确保整个用户存储库的安全,登录不再工作,因为它调用了
findByUsername(stringusername)
方法。是否有可能从登录过程中删除此方法并将参数限制为主体用户名

因此,首先我需要发现JpaRepository中需要授权的标准方法。当我浏览代码时,我发现了很多,但我不认为我需要明确地提到所有这些

List<T> findAll();
List<T> findAll(Sort sort);
List<T> findAllById(Iterable<ID> ids);
<S extends T> List<S> saveAll(Iterable<S> entities);
void flush();
<S extends T> S saveAndFlush(S entity);
void deleteInBatch(Iterable<T> entities);
void deleteAllInBatch();
T getOne(ID id);
<S extends T> List<S> findAll(Example<S> example);
<S extends T> List<S> findAll(Example<S> example, Sort sort);
Page<T> findAll(Pageable pageable);
Iterable<T> findAll(Sort sort);
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
<S extends T> Optional<S> findOne(Example<S> example);
<S extends T> Iterable<S> findAll(Example<S> example);
<S extends T> Iterable<S> findAll(Example<S> example, Sort sort);
<S extends T> Page<S> findAll(Example<S> example, Pageable pageable);
<S extends T> long count(Example<S> example);
<S extends T> boolean exists(Example<S> example);
@配置
@启用Web安全性
@EnableGlobalMethodSecurity(Prespenabled=true)
公共类SecurityConfig扩展了WebSecurity配置适配器{
[...]
@自动连线
私有appuserdetails服务userdetails服务;
@豆子
公共DaoAuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider authenticationProvider=新的DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
setPasswordEncoder(passwordEncoder());
返回authenticationProvider;
}
}
@实体
@表(name=“users”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
@列(name=“username”)
私有字符串用户名;
@列(name=“password”)
@杰索尼奥雷
私有字符串密码;
@列(name=“first_name”)
私有字符串名;
@列(name=“last_name”)
私有字符串lastName;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“user\u具有\u角色”,JointColumns
=@JoinColumn(name=“user\u id”,
referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“role\u id”,
referencedColumnName=“id”))
私有列表角色;
}

因此,到目前为止,拥有令牌的用户能够调用
findByUsername
方法并检索关于任何用户的所有用户信息。但我希望用户只能检索自己的信息。

在我看来,将存储库发布为rest资源是一个不好的选择。最好有调用存储库方法的控制器和服务。此控制器将仅发布所需的方法

您可以有两个控制器:
LoginController
来处理登录请求,以及
UserController
来处理关于用户的请求。然后,您可以在每个控制器上应用安全策略


如果发布存储库,如果新的Spring数据版本包含JpaRepository类上的新方法,则将发布此方法,并且不会有任何安全策略

当发送令牌时,它将查找与令牌关联的用户。令牌无法查找其他用户。“所以我真的不明白你的问题。”托马斯说得对。但由于搜索方法对所有用户开放,我以
test
user的身份登录,并使用此令牌调用
users/search/findByUsername?username=admin
我获得了有关管理员用户的所有信息。然后需要保护的是url,而不是方法itself@dur你们都是对的,这是可行的,但我认为,正如Jaume的回答所暗示的那样,这将是一种更方便的与控制器一起工作的方式。
@RepositoryRestResource(collectionResourceRel = "internal:users", path = "users")
public interface UserRepository extends JpaRepository<User, Long>
{
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    Page<User> findAll(Pageable pageable);

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    User findOne(String id);

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    User save(User u);

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    void delete(User u);

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    User insert(User u);

    User findByUsername(String username);
}