我在我的MovieService中使用了Spring security和我的2种方法 -
@PreAuthorize("hasRole('ROLE_DIRECTOR')")
public Map<String, Movie> getAllMovies() {
.......
.......
}
另一种方法是 -
public Movie getMovieByMovieCode(String movieCode) {
Map<String, Movie> movies = getAllMovies();
Movie movie = movies.get(movieCode);
return movie;
}
如代码所示,我在getAllMovies()
方法中调用getMovieByMovieCode()
方法。因此,如果执行 NOT 的用户具有ROLE_DIRECTOR
角色,则会尝试访问getMovieByMovieCode()
方法,并且在此方法中,还会访问getAllMovies()
方法。
但预期的行为是该用户不应该访问getAllMovies()
方法,因为该用户没有角色ROLE_DIRECTOR。
我该如何实现这种行为?我是否需要在过滤器映射中使用<dispatcher>
?
答案 0 :(得分:0)
使用注释的Spring安全授权是使用Spring AOP代理实现的。除其他外,这意味着无论何时在当前对象上调用方法,都要引用对象本身,而不是代理。这就是未进行身份验证的原因。简单的解决方法是使用@PreAuthorize注释来注释getMovieByMovieCode。
以下是对AOP代理的一些有用的阅读:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies