Spring Security 4 @PreAuthorize(hasAuthority())访问被拒绝

eri*_*ire 5 java spring spring-security spring-annotations

我正在尝试将Spring Security 3 @Secured(“ admin”)注释转换为与Spring Security 4兼容的方式。

这是我的 usersService.java

@PreAuthorize("hasAuthority('admin')")
public List<User> getAllUsers() {
    return usersDao.getAllUsers();
}
Run Code Online (Sandbox Code Playgroud)

然后在security-context.xml我有:

<security:intercept-url pattern="/admin" access="permitAll" />
...
<security:global-method-security pre-post-annotations="enabled" />
Run Code Online (Sandbox Code Playgroud)

getAllUsers() 被一个叫 LoginController.java

@RequestMapping("/admin")
public String showAdmin(Model model) {
    List<User> users = usersService.getAllUsers();

    model.addAttribute("users", users);

    return "admin";
}
Run Code Online (Sandbox Code Playgroud)

在mySql数据库中,有两个表,用户表和权限。authorities有两列,用户名和权限。administrator有权力admin

现在,如果我尝试访问/admin,我将被重定向到/login,但是使用登录后administrator,我仍然会收到“访问被拒绝”的信息。

我想我一定错过了一些非常基本的东西,但是由于我是Spring的新手,所以我无法弄清楚。任何帮助,将不胜感激。谢谢。

更新:我尝试将注释更改为@PreAuthorize(“ hasRole('ROLE_ADMIN')”),并且还将mySql中的admin的“ authority”列从“ admin”更改为“ ROLE_ADMIN”,但它仍然给我403。没有这多少信心,因为这个错误之前,我不得不改变hasRole('admin')securityContext.xmlhasAuthority('admin')

LeO*_*LeO 8

虽然已经很晚了

hasRole(...) 为内容设置前缀-默认为 ROLE_

hasAuthority(...)检查内容而没有前缀,即仅是纯内容


Soh*_*hil 2

尝试这个@PreAuthorize("hasRole('ROLE_ADMIN')")