Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 调用的方法未在spring security中获得授权_Java_Spring - Fatal编程技术网

Java 调用的方法未在spring security中获得授权

Java 调用的方法未在spring security中获得授权,java,spring,Java,Spring,我使用的是spring security,在我的MovieService中有两种方法- @PreAuthorize("hasRole('ROLE_DIRECTOR')") public Map<String, Movie> getAllMovies() { ....... ....... } @预授权(“hasRole('ROLE\u DIRECTOR')) 公共地图getAllMovies(){ ....... ....... } 另一种方法是—— public Movie g

我使用的是spring security,在我的MovieService中有两种方法-

@PreAuthorize("hasRole('ROLE_DIRECTOR')")
public Map<String, Movie> getAllMovies() {
.......
.......
}
@预授权(“hasRole('ROLE\u DIRECTOR'))
公共地图getAllMovies(){
.......
.......
}
另一种方法是——

public Movie getMovieByMovieCode(String movieCode) {
        Map<String, Movie> movies = getAllMovies();
        Movie movie = movies.get(movieCode);
        return movie;
}
公共电影getMovieByMovieCode(字符串movieCode){
映射电影=getAllMovies();
Movie=movies.get(movieCode);
回归电影;
}
如代码所示,我正在从
getMovieByMovieCode()
方法内部调用
getAllMovies()
方法。因此,如果一个没有的用户没有
角色\u DIRECTOR
角色,它会尝试访问
getMovieByMovieCode()
方法,并且从该方法内部,还会访问
getAllMovies()
方法

但是预期的行为是该用户不能访问
getAllMovies()
方法,因为该用户没有角色\u DIRECTOR


我如何实现这种行为?是否需要在筛选器映射中使用

使用注释的Spring安全授权是使用Spring AOP代理实现的。这意味着,无论何时调用当前对象上的方法,都是引用对象本身,而不是代理。这就是为什么不进行身份验证。简单的解决方法是使用@PreAuthorize注释对getMovieByMovieCode进行注释


这里有一些关于AOP代理的帮助性阅读:

这个链接很有帮助,我得到的一点是,我对getAllMovies()方法的调用不在代理对象上,它是一个直接调用,因此任何建议都不会出现。现在我还有一个疑问——假设现在我用@PreAuthorize(“hasRole('ROLE_AUDIENCE'))注释getMovieByMovieCode(String movieCode),getAllMovies()方法不变。并且主叫用户只有角色\观众角色。那么授权也不会发生。还是直拨电话吗?我知道了。当我们用@PreAuthorize(“hasRole('ROLE\u AUDIENCE'))注释getMovieByMovieCode(String movieCode)时,用户有权访问此方法,因为此用户只有ROLE\u AUDIENCE。对getAllMovies()的调用仍然是直接调用(不是在代理引用上)。因此,在本例中,与getAllMovies()相关的建议也不会起作用。我还尝试对代理对象进行调用,而不是直接调用,如本链接所示。为了进行代理调用,我在spring-servlet.xml文件中添加了“”。并进行了如下代理调用-
MovieService MovieService=(MovieService)AopContext.currentProxy();Map movies=movieService.getAllMovies()现在它是一个代理调用,所以如果用户没有ROLE\u DIRECTOR角色,那么该用户将无法访问
getAllMovies()
方法。